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
plugin.tx_myext { math = TEXT math { current = 1 prioriCalc = 1 } } |
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> |