Pagination Widget im Backend anpassen

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.

Kommentare sind geschlossen.