Fluid: Blätterfunktion ohne Widget „paginate“
Geändert: Dienstag, 11. Oktober 2016 | Erstellt: Freitag, 18. Juli 2014
Wie man das Widget „paginate“ nutzt, kann man unter anderem auf typo3blogger.de nachlesen. Wenn man dieses Widget aber nicht einsetzen kann, z.B. weil man die Datenbankabfrage im Repository mit
$query->statement("SELECT * FROM..."); |
erzeugt, muss man den Pager selbst erzeugen, hier eine mögliche Vorgehensweise:
Pager-Array generieren
EXT:myExt/Classes/Controller/MyController.php
/** * action list * * @param integer $page: paginator, starts with 0 * @return void */ public function listAction($page = 0) { $page = (int)$page; $this->view->assign('page', $page); $myRecords = $this->objectManager->get(\Vendor\MyExt\Domain\Repository\MyRepository::class)->myQuery(); $this->view->assign('myRecords', $myRecords); // generate pager if($myRecords->count()) { $paginate = array(); for($i = 0; $i < $myRecords->count(); $i += (int)$this->settings['pager']['itemsPerPage']) { $paginate[] = $i; } $this->view->assign('paginate', $paginate); } } |
TypoScript Setup für Berechnungen in Fluid
Für den Pager werden im Fluid Template Berechnungen durchgeführt. Da Fluid selbst keine Berechnungen durchführen kann, wird dies über TypoScript erledigt.
EXT:myExt/Configuration/TypoScript/setup.txt
Pager als Partial
EXT:myExt/Resources/Private/Partials/Pager/Pager.html
<f:if condition="{paginate->f:count()} > 1"> <f:alias map="{ paginateMax: '{f:cObject(typoscriptObjectPath: \'plugin.tx_myext.math\', data: \'{paginate->f:count()}-1\')}', paginatePrev: '{f:cObject(typoscriptObjectPath: \'plugin.tx_myext.math\', data: \'{currentPage}-1\')}', paginateNext: '{f:cObject(typoscriptObjectPath: \'plugin.tx_myext.math\', data: \'{currentPage}+1\')}' }"> <ul class="tx_myext-list-browse"> <f:if condition="{currentPage} > 0"> <li class="first"> <f:link.action addQueryString="1" arguments="{page: '0'}"> << </f:link.action> </li> <li class="prev"> <f:link.action addQueryString="1" arguments="{page: paginatePrev}"> < </f:link.action> </li> </f:if> <f:for each="{paginate}" as="paginateItem" key="p" iteration="i"> <li> <f:link.action addQueryString="1" arguments="{page: p}" class="{f:if(condition: '{p} == {currentPage}', then: 'active')}"> {i.cycle} </f:link.action> </li> </f:for> <f:if condition="{currentPage} < {paginateMax}"> <li class="next"> <f:link.action addQueryString="1" arguments="{page: paginateNext}"> > </f:link.action> </li> <li class="last"> <f:link.action addQueryString="1" arguments="{page: paginateMax}"> >> </f:link.action> </li> </f:if> </ul> </f:alias> </f:if> |
Einbindung des Partials im Template
Im Template wird der Pager eingebunden und nur die Datensätze der gewählten Seite ausgegeben.
EXT:myExt/Resources/Private/Templates/MyController/List.html
<f:if condition="{myRecords}"> <f:render partial="Pager/Pager" arguments="{paginate:paginate, currentPage:page}" /> <f:for each="{myRecords}" as="myRecord" iteration="i"> <f:if condition="{i.index} >= {f:cObject(typoscriptObjectPath: 'plugin.tx_myext.math', data: '{page}*{settings.pager.itemsPerPage}')}"> <f:if condition="{i.index} < {f:cObject(typoscriptObjectPath: 'plugin.tx_myext.math', data: '({page}+1)*{settings.pager.itemsPerPage}')}"> Record UID: {myRecord.uid} </f:if> </f:if> </f:for> </f:if> |
Thema: TYPO3 Programmierung | Keine Kommentare