Fluid: Blätterfunktion ohne Widget „paginate“

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'}">
                        &lt;&lt;
                    </f:link.action>
                </li>
                <li class="prev">
                    <f:link.action addQueryString="1" arguments="{page: paginatePrev}">
                        &lt;
                    </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}">
                        &gt;
                    </f:link.action>
                </li>
                <li class="last">
                    <f:link.action addQueryString="1" arguments="{page: paginateMax}">
                        &gt;&gt;
                    </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>

 

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.