Extbase / Fluid: Widget Paginate ViewHelper mit Array Unterstützung

Fluid ist echt eine geile Sache. Allerdings ist man dennoch hin und wieder erstaunt, dass manche Dinge leider noch nicht funktionieren. Neulich ging beispielsweise ein „noooooo“ durchs Büro, als eine gewisse Person festgestellt hat, dass der Fluid Viewhelper widget.paginate leider nur Objekte unterstützt. Bei Arrays gibt es dafür nur eine Fehlermeldung.

Leider kann man nicht ausschließen, dass man auch mal einem Array einen Pagebrowser verpassen möchte und dann steht man erstmal blöd da. Gott sei Dank ist TYPO3 jedoch Open Source und jeder kann seinen Beitrag leisten: Hier also ein Fluid Paginate Viewhelper, der auch Arrays als Parameter unterstützt!

Bedauerlicherweise weiß ich nicht mehr, woher ich die ursprüngliche Version dieses ViewHelpers habe. Ich habe in im Nachhinein jedoch nochmal um die TYPO3 6.x typischen Namespaces und kleinere Bugfixes erweitert.

UPDATE (27.03.2015): Ab TYPO3 Version 7.1 unterstützt der Fluid Paginate ViewHelper von Haus aus auch Arrays!

typo3conf/ext/ExtensionXY/Classes/ViewHelpers/PaginateViewHelper.php

<?php

namespace TYPO3\ExtensionXY\ViewHelpers;

/***************************************************************
*  Copyright notice
*
*  (c) 2013 Paul Beck <pb@teamgeist-medien.de>, Armin Ruediger Vieweg <info@professorweb.de>
*
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/

/**
 * This widget is a copy of the fluid paginate widget. Now it's possible to
 * use arrays with paginate, not only query results.
 *
 * @author     Paul Beck <pb@teamgeist-medien.de>
 * @author	   Armin Ruediger Vieweg <info@professorweb.de>
 * @copyright  2011 Copyright belongs to the respective authors
 * @license    http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
 */

class PaginateViewHelper extends \TYPO3\CMS\Fluid\Core\Widget\AbstractWidgetViewHelper {

	/**
	 * @var \TYPO3\ExtensionXY\Controller\PaginateController
	 */
	protected $controller;

	/**
	 * Injection of widget controller
	 * 
	 * @param \TYPO3\ExtensionXY\Controller\PaginateController $controller
	 * @return void
	 */
	public function injectController(\TYPO3\ExtensionXY\Controller\PaginateController $controller) {
		$this->controller = $controller;
	}

	/**
	 * The render method of widget
	 *
	 * @param mixed $objects \TYPO3\CMS\ExtBase\Persistence\QueryResultInterface,
	 *        \TYPO3\CMS\ExtBase\Persistence\ObjectStorage object or array
	 * @param string $as
	 * @param array $configuration
	 * @return string
	 */
	public function render($objects, $as, array $configuration = array('itemsPerPage' => 10, 'insertAbove' => FALSE, 'insertBelow' => TRUE)) {
		return $this->initiateSubRequest();
	}
}

?>

typo3conf/ext/ExtensionXY/Classes/Controller/PaginateController.php

<?php

namespace TYPO3\ExtensionXY\Controller;

/***************************************************************
 *  Copyright notice
 *
 *  (c) 2013 Paul Beck <pb@teamgeist-medien.de>, Armin Ruediger Vieweg <info@professorweb.de>
 *
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/

/**
 * This view helper uses the technology of paginate widget but works with arrays
 * and the assigned objects don't need the QueryResultInterface.
 *
 * @package    Typo3
 *
 * @author     Paul Beck <pb@teamgeist-medien.de>
 * @author	   Armin Ruediger Vieweg <info@professorweb.de>
 * @author     Benjamin Schulte <benjamin.schulte@diemedialen.de>
 * @license    http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
 */
class PaginateController extends \TYPO3\CMS\Fluid\Core\Widget\AbstractWidgetController {
	/**
	 * @var array
	 */
	protected $configuration = array('itemsPerPage' => 5, 'insertAbove' => FALSE, 'insertBelow' => TRUE, 'maximumVisiblePages' => 7);

	/**
	 * @var array
	 */
	protected $objects;

	/**
	 * @var integer
	 */
	protected $currentPage = 1;

	/**
	 * @var integer
	 */
	protected $numberOfPages = 1;

	/**
	 * @var integer
	 */
	protected $itemsPerPage = 0;

	/**
	 * Initialize Action of the widget controller
	 *
	 * @return void
	 */
	public function initializeAction() {
		$this->objects = $this->widgetConfiguration['objects'];
		$this->configuration = \TYPO3\CMS\Core\Utility\GeneralUtility::array_merge_recursive_overrule($this->configuration, $this->widgetConfiguration['configuration'], TRUE);
	}

	/**
	 * Returns the items per page
	 *
	 * @return integer the items per page
	 */
	public function getItemsPerPage() {
		return $this->itemsPerPage;
	}

	/**
	 * Sets the items per page
	 *
	 * @param integer $itemsPerPage the items per page
	 *
	 * @return void
	 */
	public function setItemsPerPage($itemsPerPage) {
		if (empty($itemsPerPage)) {
			$this->itemsPerPage = (integer)$this->configuration['itemsPerPage'];
		} else {
			$this->itemsPerPage = $itemsPerPage;
		}
	}

	/**
	 * Returns the number of pages
	 *
	 * @return integer
	 */
	public function getNumberOfPages() {
		return $this->numberOfPages;
	}

	/**
	 * Sets the number of pages
	 *
	 * @param integer $numberOfPages the number of pages
	 *
	 * @return void
	 */
	public function setNumberOfPages($numberOfPages) {
		$this->numberOfPages = $numberOfPages;
	}

	/**
	 * Returns the current page
	 *
	 * @return integer the current page
	 */
	public function getCurrentPage() {
		return $this->currentPage;
	}

	/**
	 * Sets the current page and limits it between 1 and $this->numberOfPages.
	 *
	 * @param integer $currentPage the current page
	 *
	 * @return void
	 */
	public function setCurrentPage($currentPage) {
		$this->currentPage = $currentPage;
		if ($this->currentPage < 1) {
			$this->currentPage = 1;
		} elseif ($this->currentPage > $this->numberOfPages) {
			$this->currentPage = $this->numberOfPages;
		}
	}

	/**
	 * Returns all visible objects within a range, depending on itemsPerPage and the currentPage.
	 *
	 * @param \TYPO3\CMS\ExtBase\Persistence\QueryResult|array $objects the list of objects
	 *
	 * @return array<mixed> the list of visible objects
	 */
	public function getVisibleObjects($objects) {
		$i = 0;
		$modifiedObjects = array();
		$indexMin = $this->itemsPerPage * ($this->currentPage - 1);
		$indexMax = $this->itemsPerPage * $this->currentPage - 1;

		foreach ($objects as $object) {
			if ($i >= $indexMin && $i <= $indexMax) {
				$modifiedObjects[] = $object;
			}
			$i++;
		}

		return $modifiedObjects;
	}

	/**
	 * Index action of the widget controller
	 *
	 * @param integer $currentPage
	 * @param integer $itemsPerPage
	 *
	 * @return void
	 */
	public function indexAction($currentPage = 1, $itemsPerPage = 0) {
		$this->setItemsPerPage($itemsPerPage);
		$this->setNumberOfPages(intval(ceil(count($this->objects) / (integer)$this->itemsPerPage)));
		$this->setCurrentPage((integer)$currentPage);

		$this->view->assign('contentArguments', array(
			$this->widgetConfiguration['as'] => $this->getVisibleObjects($this->objects)
		));
		$this->view->assign('configuration', $this->configuration);
		if($this->numberOfPages >= 2) {
			$this->view->assign('pagination', $this->buildPagination());			
		}
		$this->view->assign('itemsPerPage', $this->itemsPerPage);
	}

	/**
	 * Returns an array with the keys "pages", "current", "numberOfPages", "nextPage" & "previousPage"
	 *
	 * @return array
	 */
	protected function buildPagination() {
		$sidePageCount = intval($this->configuration['maximumVisiblePages']) >> 1;

		$firstPage = max($this->currentPage - $sidePageCount, 1);
		$lastPage = min($firstPage + $sidePageCount * 2, $this->numberOfPages);
		$firstPage = max($lastPage - $sidePageCount * 2, 1);

		$pages = array();
		foreach (range($firstPage, $lastPage) as $index) {
			$pages[] = array(
				'number' => $index,
				'isCurrent' => ($index === $this->currentPage)
			);
		}

		$pagination = array(
			'pages' => $pages,
			'current' => $this->currentPage,
			'numberOfPages' => $this->numberOfPages,
			'itemsPerPage' => $this->itemsPerPage,
			'firstPage' => 1,
			'lastPage' => $this->numberOfPages,
			'isFirstPage' => ($this->currentPage == 1),
			'isLastPage' => ($this->currentPage == $this->numberOfPages)
		);

		return $this->addPreviousAndNextPage($pagination);
	}

	/**
	 * Adds the nextPage and the previousPage to the pagination array
	 *
	 * @param array $pagination the pagination array which get previous and
	 *        next page
	 *
	 * @return array the pagination array which contains some meta data and
	 *         another array which are the pages
	 */
	protected function addPreviousAndNextPage($pagination) {
		if ($this->currentPage < $this->numberOfPages) {
			$pagination['nextPage'] = $this->currentPage + 1;
		}
		if ($this->currentPage > 1) {
			$pagination['previousPage'] = $this->currentPage - 1;
		}

		return $pagination;
	}
}
?>

typo3conf/ext/ExtensionXY/Resources/Private/Templates/Paginate/Index.html

<f:if condition="{configuration.insertAbove}">
	<f:render section="paginator" arguments="{pagination: pagination}" />
</f:if>

<f:renderChildren arguments="{contentArguments}" />

<f:if condition="{configuration.insertBelow}">
	<f:render section="paginator" arguments="{pagination: pagination}" />
</f:if>

<f:section name="paginator">
	<ul class="f3-widget-paginator">
		<!-- First -->
		<f:if condition="{f:translate(key:'pagination_first')}">
			<f:if condition="{pagination.isFirstPage}">
				<f:then>
					<li class="first">
						<span><f:translate key="pagination_first" /></span>
					</li>
				</f:then>
				<f:else>
					<li class="first">
						<f:widget.link><f:translate key="pagination_first" /></f:widget.link>
					</li>
				</f:else>
			</f:if>
		</f:if>

		<!-- Previous -->
		<f:if condition="{f:translate(key:'pagination_previous')}">
			<f:if condition="{pagination.previousPage}">
				<f:then>
					<li class="previous">
						<f:if condition="{pagination.previousPage} > 1">
							<f:then>
								<!-- <f:translate key="previous" /> -->
								<f:widget.link arguments="{currentPage: pagination.previousPage}"><f:translate key="pagination_previous" /></f:widget.link>
							</f:then>
							<f:else>
								<f:widget.link><f:translate key="pagination_previous" /></f:widget.link>
							</f:else>
						</f:if>
					</li>
				</f:then>
				<f:else>
					<li class="previous">
						<span><f:translate key="pagination_previous" /></span>
					</li>
				</f:else>
			</f:if>
		</f:if>

		<!-- Numbered pages -->
		<f:for each="{pagination.pages}" as="page">
			<f:if condition="{page.isCurrent}">
				<f:then>
					<li class="current">
						<span>{page.number}</span>
					</li>
				</f:then>
				<f:else>
					<li>
						<f:if condition="{page.number} > 1">
							<f:then>
								<f:widget.link arguments="{currentPage: page.number}">{page.number}</f:widget.link>
							</f:then>
							<f:else>
								<f:widget.link>{page.number}</f:widget.link>
							</f:else>
						</f:if>
					</li>
				</f:else>
			</f:if>
		</f:for>

		<!-- Next -->
		<f:if condition="{f:translate(key:'pagination_next')}">
			<li class="next">
				<f:if condition="{pagination.nextPage}">
					<f:then>
						<f:widget.link arguments="{currentPage: pagination.nextPage}"><f:translate key="pagination_next" /></f:widget.link>
					</f:then>
					<f:else>
						<span><f:translate key="pagination_next" /></span>
					</f:else>
				</f:if>
			</li>
		</f:if>

		<!-- Last -->
		<f:if condition="{f:translate(key:'pagination_last')}">
			<li class="last">
				<f:if condition="{pagination.isLastPage}">
					<f:then>
						<span><f:translate key="pagination_last" /></span>
					</f:then>
					<f:else>
						<f:widget.link arguments="{currentPage: pagination.lastPage}"><f:translate key="pagination_last" /></f:widget.link>
					</f:else>
				</f:if>
			</li>
		</f:if>
	</ul>
</f:section>

Er nimmt dieselben Parameter wie der normale Paginate Viewhelper und darüber hinaus auch Arrays. Genutzt werden kann der Viewhelper nun, indem ihr wie üblich in einem Template den Namespace zuweist:

{namespace m=TYPO3\ExtensionXY\ViewHelpers}

Und dann so einzusetzen:

<m:Paginate objects="{paginateObjektOderArray}" as="paginatedObjekt" configuration="{itemsPerPage: 5, insertAbove: 1, insertBelow: 1}">

Unbedingt daran denken alle Namespaces an eure Extension anzupassen 😉

28 Kommentare

  • Thank you very much for this post….It was really very useful while dealing with an array….

    Keep up the good work.

  • Super. Das war genau das was ich gesucht habe. Vielen Dank fürs Teilen

  • Erstmal danke für’s Teilen. Ich habe schon mit dem Standard-Pagination-Widget gekämpft, weil ich einen Array vorliegen habe, der auch so bleiben muss. Das gesamte Handling der Abfrage im Repository lässt sich nunmal nicht so einfach in einem QueryResultInterface abbilden.

    Nachdem ich im ViewHelper
    „class PaginateViewHelper extends \TYPO3\CMS\Fluid\Core\Widget\AbstractWidgetViewHelper“
    zu
    „Tx_ExtensionXY_ViewHelpers_PaginateViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper“
    geändert habe und die Namespace-Zeile ganz oben auskommentiert habe, wurde dieser dann auch gefunden (T3 6.2.3)

    Allerdings bekomme ich jetzt die folgende Fehlermeldung:
    „Call to undefined method […]_ViewHelpers_PaginateViewHelper::initiateSubRequest() in […]/Classes/ViewHelpers/PaginateViewHelper.php[…]“

  • Also in TYPO3 6.2 solltest Du unbedingt mit Namespaces arbeiten. Was meinst Du, dass er erst dann gefunden wurde? Hast Du bei dem ViewHelper denn alle Namespaces entsprechend angepasst?

  • Ja, hab ich. Ich habe eine neue Extension gekickstartet und einige Datensätze angelegt mit Standard-Listenansicht. Da hat es funktioniert. Es muss also an meiner Extension liegen. Danke trotzdem für die schnelle Antwort.

    • Aha! Meine eigene Extension hatte noch nicht überall Namespaces gesetzt. Jetzt geht es auch 🙂
      Vielen Dank nochmal.

  • Vielen Dank für deinen Code. Habe diesen vor einigen Tagen auch in eine Erweiterung von mir eingebaut und noch ein Problem festgestellt.
    Und zwar habe ich eine Erweiterung „Content Teaser“ geschrieben, der vorhandene Typo3 Contentelemente aus den Systemkategorien auslesen und im Frontend anzeigen / anteasern soll. Das klappt soweit auch gut. Mein Problem ist aber, dass ich nicht mehr als 1 Teaser anlegen kann, da das Paginate Widget mir dann immer jedes Contentelement weiterblättert, obwohl ich eigentlich nur ein Contentelement blättern wollte.
    Hat hier jemand vielleicht eine Idee, wie ich das lösen kann?! 🙂

    Danke und liebe Grüße

    Kevin

  • Kannst Du mir dazu mal das dazugehörige Fluid Template mal hier posten oder zumindest den entsprechenden Abschnitt aus dem Template?

    Pack den hier bitte in die Tags [ code ] XXX [ / code ]

    Test
  • Klar kann ich gerne machen. Ich bin auch schon etwas weitergekommen mit dem Problem. Zumindest konnte ich denke ich die Ursache dazu finden:

    Hierzu existiert auch ein Bug auf: https://forge.typo3.org/issues/47006

    Das aktuell eingebundene Widget für die Pagination erzeugt immer dieselben Links mit der gleichen Widgetid.

    Beispiel-Url:

    thailand/bangkok.html?tx_teasercontent_teasercontentanzeige%5B%40widget_0%5D%5BcurrentPage%5D=2&cHash=017eb02d902960bc6350c3617a025095

    Das Verhalten kann auch direkt angeschaut werden unter: http://www.mary-und-kevin.de/thailand/bangkok.html

    Benutzer: test
    Passwort: geheim

    Bitte Bescheid geben, wenn die Benutzerdaten nicht mehr gebraucht werden, da das keine öffentliche Seite ist 🙂 Danke.

    Und anbei noch der Ausschnitt meinen Teasercontent Fluid Template:

    [ code ]
    {namespace kj=Kevinjack\Teasercontent\ViewHelpers}

    {teaser.header}

    {teaser.bodytext}

    [ / code ]

  • Hm das mit dem Code hat noch nicht so funktioniert.
    Ich versuche es nochmal:

    Wenn es wieder nicht klappt, einfach mein Kommentar löschen 🙂

    {namespace kj=Kevinjack\Teasercontent\ViewHelpers}
    
    <f:layout name="default" />
    
    <f:section name="main">
        <kj:Paginate objects="{contents}" as="paginatedObject" configuration="{itemsPerPage: 3, insertAbove: 0, insertBelow: 1}">
            <f:for each="{paginatedObject}" as="teaser" iteration="teaserIteration">
                <f:comment>
                <f:if condition="{teaserIteration.isLast} == 1">
                    <f:then>
                        <div class="small-12 medium-4 large-4 left lastTeaser">
                    </f:then>
                    <f:else>
                        <div class="small-12 medium-4 large-4 left teaserPadding">
                    </f:else>
                </f:if>
                </f:comment>
                <div class="small-12 medium-4 large-4 columns">
                    <f:link.page pageUid="{teaser.pid}">
                        <f:image src="{teaser.image.originalResource.originalFile.uid}" alt="{teaser.image.originalResource.description}" title="{teaser.image.originalResource.title}" />
                    </f:link.page>
                    <f:link.page pageUid="{teaser.pid}"><h3>{teaser.header}</h3></f:link.page>
                    <f:link.page pageUid="{teaser.pid}">
                        <f:format.stripTags><f:format.crop maxCharacters="200" append="&nbsp;[...]"><p>{teaser.bodytext}</p></f:format.crop></f:format.stripTags>
                    </f:link.page>
                </div>
            </f:for>
        </kj:Paginate>
    
    </f:section>
    
  • Okay Problem erkannt, ich brauche die Benutzerdaten nicht mehr. Dieses Paginate Widget in diesem Beitrag ist ja nur eine überarbeitete Kopie der Standard-Pagination… vielleicht wurde dieser Fehler in der normalen Pagination ja schon behoben? Falls nicht würde ich dafür gerne ein Fix bereitstellen, aber mir fehlt leider die Zeit dafür.

  • Aber wie wäre es für dich denn, wenn Du diese Datensätze nicht wirklich über eine Pagination auf Seiten verteilst, sondern irgendwie als Slider oder per AJAX nachlädst, indem Du dir dafür ein bisschen Javascript schreibst?

  • Hey,
    kein Problem. Habe auch nicht die Erwartungshaltung gehabt, dass du einen Fix bereitstellst 🙂 Ich schaue mal, ob ich mich selbst zurechtfinde damit 🙂

    In der letzten Typo3-Version scheint das noch nicht behoben zu sein in der Standard-Pagination.

    Im schlimmsten Fall werde ich natürlich auf Javascript zurückgreifen, bevor ich gar nicht weiterkomme 🙂 Dann gibt es eben eine Pagination mit jQuery.
    Falls ich dennoch eine Lösung zu dem Thema haben sollte, werde ich diese hier notieren.

    Wünsche dir einen entspannten Nachmittag.

  • Also wie ich das gesehen habe, wird das etwas schwieriger bezüglich dem Widgetidentifier.

    In der Klasse: AbstractWidgetViewHelper existiert eine Methode, welche für die ID zuständig ist:

    	/**
    	 * The widget identifier is unique on the current page, and is used
    	 * in the URI as a namespace for the widget's arguments.
    	 *
    	 * @return string the widget identifier for this widget
    	 * @return void
    	 * @todo clean up, and make it somehow more routing compatible.
    	 */
    	private function initializeWidgetIdentifier() {
    		if (!$this->viewHelperVariableContainer->exists('TYPO3\\CMS\\Fluid\\Core\\Widget\\AbstractWidgetViewHelper', 'nextWidgetNumber')) {
    			$widgetCounter = 0;
    		} else {
    			$widgetCounter = $this->viewHelperVariableContainer->get('TYPO3\\CMS\\Fluid\\Core\\Widget\\AbstractWidgetViewHelper', 'nextWidgetNumber');
    		}
    		$widgetIdentifier = '@widget_' . $widgetCounter;
    		$this->viewHelperVariableContainer->addOrUpdate('TYPO3\\CMS\\Fluid\\Core\\Widget\\AbstractWidgetViewHelper', 'nextWidgetNumber', $widgetCounter + 1);
    		$this->widgetContext->setWidgetIdentifier($widgetIdentifier);
    	}
    

    Leider ist die Methode private und kann von Außen nicht verändert werden :/

  • Vielleicht faile ich gerade, aber müsste man eine private Function nicht überschreiben können?

  • Da könntest du eventuell Recht haben. Ich prüfe das heute Abend einmal in Ruhe 🙂

  • Nur zur Info: Im Typo3 Flow 2.2.2 ist dieser Part im Fluid Paket übrigens schon angepasst worden:

    Dort kann die ID mittlerweile von Außen mitgegeben werden…

    	/**
    	 * The widget identifier is unique on the current page, and is used
    	 * in the URI as a namespace for the widget's arguments.
    	 *
    	 * @return string the widget identifier for this widget
    	 * @return void
    	 */
    	private function initializeWidgetIdentifier() {
    		$widgetIdentifier = ($this->hasArgument('widgetId') ? $this->arguments['widgetId'] : strtolower(str_replace('\\', '-', get_class($this))));
    		$this->widgetContext->setWidgetIdentifier($widgetIdentifier);
    	}
    

    Dann müsste der ja eigentlich auch bald in das Typo3 CMS kommen 🙂

    • Mir half hier der folgende dirty hack:

          /**
           * Initialize the arguments of the ViewHelper, and call the render() method of the ViewHelper.
           *
           * @return string the rendered ViewHelper.
           */
          public function initializeArgumentsAndRender() {
              // manipulate viewHelperVariableContainer to get real unique widget ids
              if (!$GLOBALS['T3_VAR']['widgetCounter']) {
                  $GLOBALS['T3_VAR']['widgetCounter'] = 10;
              } else {
                  $GLOBALS['T3_VAR']['widgetCounter']++;
              }
              if (!$this->viewHelperVariableContainer->exists('Tx_Fluid_Core_Widget_AbstractWidgetViewHelper', 'nextWidgetNumber')) {
                  $widgetCounter = 0;
              } else {
                  $widgetCounter = $this->viewHelperVariableContainer->get('Tx_Fluid_Core_Widget_AbstractWidgetViewHelper', 'nextWidgetNumber');
              }
              $this->viewHelperVariableContainer->addOrUpdate('Tx_Fluid_Core_Widget_AbstractWidgetViewHelper', 'nextWidgetNumber', $widgetCounter + $GLOBALS['T3_VAR']['widgetCounter']);
              // back to parent method
              return parent::initializeArgumentsAndRender();
          }
      

      (eingefügt in einen eigenen PaginateViewHelper extending Tx_Fluid_ViewHelpers_Widget_PaginateViewHelper)

  • Pingback: Tyop3 | Pearltrees

  • When i am trying to use it with ajax at the time next page link will not created properly.

    $ajaxView = $this->objectManager->get(‚TYPO3\\CMS\\Fluid\\View\\StandaloneView‘);
    $templateName = ‚AjaxView/AjaxFilter.html‘;
    $extbaseFrameworkConfiguration = $this->configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
    $templateRootPath = \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName($extbaseFrameworkConfiguration[‚view‘][‚templateRootPath‘]);
    $templatePathAndFilename = $templateRootPath . $templateName;
    $ajaxView->setTemplatePathAndFilename($templatePathAndFilename);
    $ajaxView->assignMultiple(array(‚resultCategory‘ => $result, ‚resultCount‘ => $cnt));
    echo $ajaxView->render();die;

    // In AjaxFilter.html

    when pagination is generated next page link is wrong. its generating like.
    tx__%5B%40widget_0%5D%5BcurrentPage%5D=2&cHash=54de5b89ea817dc6babdf7918176e788

    • I guess your problem is that the url is not absolute. In a standalone view you maybe have to pass the desired pageUid to the link viewhelper anyway.

  • Ich habe den ViewHelper heute erfolgreich bei mir unter TYPO3 6.2.x eingebaut. Auf den ersten Blick schien alles zu funktionieren, dann habe ich aber bemerkt, dass ich zwar die Paginierung durch klicken kann, mir aber immer nur die Content-Elemente der erste Seite ausgespielt werden. Scheinbar findet keine Übergabe statt zwischen URL-Parameter und der Paginierung. Habt ihr mir einen Tipp woran das liegen könnte?

    Danke und Gruß,
    Markus

  • Hallo Markus,

    das hört sich auf den ersten Blick nach einem Caching Problem an. Hast Du mal probiert das Caching auf der Seite mit der Pagination den Cache zu deaktivieren um zu schauen ob es dann geht?

  • Hallo Paul,
    ja das war auch mein erster Gedanke. Am Cache liegt es allerdings nicht. Nach deaktiverten des Caches für die Seite mit dem Pager trat das Problem nach wie vor auf.

    Mein Kollege betreibt gerade Ursachenvorschung. Wenn wir was raus finden, gebe ich bescheid.

    Gruß Markus

  • Jennifer Koenig

    Danke für diesen Code – er ist genau, was ich gesucht habe!

    Allerdings funktioniert es bei mir noch nicht. Auf die Seite wird berichtet dass der Template nicht gefunden werden können:

    No template was found. View could not be resolved for action „index“ in class „(mydomain)\(myext)\Controller\PaginateController“.

    Dabei ist die Struktur:
    myext/Classes/Controller/PaginateController.php
    myext/Classes/ViewHelpers/Rating/PaginateViewHelper.php
    myext/Resources/Private/Partials/Rating/List.html – wo die paginate ViewHelper aufgerufen wird
    myext/Resources/Private/Templates/Rating/ViewHelpers/Widget/Paginate/Index.html

    Vorher habe ich die eigene ViewHelpers/Widget/Paginate/Index.html genutzt mit dem TYPO3 Paginate Controller, ohne Probleme.

    Was übersehe ich?

    • Jennifer Koenig

      Ich sehe schon -ich muss mein Paginate/Index.html direkt in den Ordner Templates/Rating ziehen, den andere löschen… jetzt funktioniert es.

  • Ahoi,
    erstmal danke für den Code. Folgendes Prob:
    ich habe eine list.html, die zwei listen generiert:
    [code]
    {namespace m=TYPO3\Downloads\ViewHelpers}

    [code]

    Der Pager wird eingesetzt, aber die itemsPerPage werden ignoriert?
    Wie komme ich da raus?
    TIA!

Schreibe einen Kommentar zu Kevin Jäck Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Highlighting von Codes ist mit den Tags  [ts], [php], [html], [javascript], [xml] oder [code] möglich.