Ich habe ein Modul implementiert, in dem bestimmte Datensätze gelistet werden. Über der Auflistung hatte ich einen Filter für die Datensätze implementiert und für die Paginierung das Fluid BE-Pagination Widget verwendet. Nun musste ich erstaunt feststellen, dass das BE-Paginate-Widget (be.widget.paginate) keine weiteren Argumente mitschleppen kann und es auch nicht konfigurierbar ist. Das bedeutet: beim Blättern gehen die Einstellungen aus dem Filter verloren.
Ich habe es hinbekommen mit einem eigenen ViewHelper und einem eigenen Template fürs Pagination-Widget.
Als erstes muss Fluid so konfiguriert werden, dass es ein anderes Template für das BE Pagination-Widget verwendet. Ich habe die folgende Konfiguration in die ext_typoscript_setup.txt Datei meiner Extension eingefügt:
config.tx_extbase.view.widget { TYPO3\CMS\Fluid\ViewHelpers\Be\Widget\PaginateViewHelper { templateRootPath = EXT:myext/Resources/Private/Templates/ } }
Dann muss in der Extension im Ordner EXT:myext/Resources/Private/Templates/ViewHelpers/Be/Widget/Paginate/ die Datei Index.html erstellt werden, die am besten erstmal eine Kopie der Originaldatei ist (sysext/fluid/Resources/Private/Templates/ViewHelpers/Be/Widget/Paginate/Index.html). Dann kann man in der neu erstellten Datei eine Ausgabe reinschreiben und schauen, ob die Datei greift.
In der Widget-Template-Datei sind alle Links wie folgt aufgebaut: <a href="{f:widget.uri(arguments:{currentPage: 1})}" [...]>
. Ich habe beschlossen, einen eigenen ViewHelper zu schreiben, der die Filter-Parameter in die Links integriert. Der ViewHelper leitet von \TYPO3\CMS\Fluid\ViewHelpers\Widget\UriViewHelper ab und wird somit wie folgt verwendet:
<a href="{my:widget.uri(arguments:{currentPage: 1})}" [...]>
.
Im Code des ViewHelpers sollte die Funkton render
des Original-ViewHelpers übernommen werden. Die Funktion getWidgetUri wird nur geringfügig angepasst. Um die Filter Parameter auszulesen, habe ich eine neue Funktion implementiert, die etwas angepasst unten zu finden ist.
namespace My\MyExt\ViewHelper\Widget; class UriViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Widget\UriViewHelper { protected function getWidgetUri() { $uriBuilder = $this->controllerContext->getUriBuilder(); $argumentPrefix = $this->controllerContext->getRequest()->getArgumentPrefix(); $arguments = $this->hasArgument('arguments') ? $this->arguments['arguments'] : []; if ($this->hasArgument('action')) { $arguments['action'] = $this->arguments['action']; } if ($this->hasArgument('format') && $this->arguments['format'] !== '') { $arguments['format'] = $this->arguments['format']; } // NEU $uriArguments = [$argumentPrefix => $arguments]; ArrayUtility::mergeRecursiveWithOverrule($uriArguments, $this->getFilterArguments()); return $uriBuilder->reset() ->setArguments($uriArguments) // diese Zeile auch angepasst ->setSection($this->arguments['section']) ->setAddQueryString(true) ->setAddQueryStringMethod($this->arguments['addQueryStringMethod']) ->setArgumentsToBeExcludedFromQueryString([$argumentPrefix, 'cHash']) ->setFormat($this->arguments['format']) ->build(); } protected function getFilterArguments() { $moduleKey = 'hier_den_module_key_einsetzen'; $moduleArguments = GeneralUtility::_GP($moduleKey); if(!is_array($moduleArguments) && empty($moduleArguments)) { return []; } $arguments = []; $argumentKeys = ['param1', 'param2']; foreach($argumentKeys as $key) { if(array_key_exists($key, $moduleArguments) && !empty($moduleArguments[$key])) { $arguments[$key] = $moduleArguments[$key]; } } return [$moduleKey => $arguments]; } } ?>
Und damit werden die Filter-Parameter beim Blättern übernommen. Wundert mich nur ein bisschen, dass das BE-Pagination-Widget das nicht kann, das FE-Pagination-Widget kann zumindest konfiguriert werden.
Neueste Kommentare