Facebook
Twitter
Google+
Kommentare
0

Propel paginate meets twig macros

Hello,

Daniel hat euch ja im letzten Beitrag ein paar Basics zur neuen Propel Version 1.5.6 näher gebracht und gezeigt wie man es in eine ZendFramework Applikation integrieren kann.

Ich möchte euch heute gerne zeigen, wie schön man die paginate Funktion von Propel mit der Makro Funktionalität der Twig Template Engine verbinden kann, um ein wiederverwendbares paging zu erstellen.

So let’s go:

Nehmen wir mal an, wir haben eine Tabelle “guestbook_entry” mit Gästebucheinträgen und möchten pro Seite 5 Einträge anzeigen lassen. Zunächst holen wir uns mal den Paginator über die Queryklasse der Tabelle:

$paginator = GuestbookEntryQuery::create()->paginate($page, 5);

Die paginate Funktion berechnet automatisch ein Offset und ein Limit anhand der aktuellen Seite und der Einträge/Seite und gibt ein PropelModelPager Objekt zurück, über das man dann im Skript oder im Template iterieren kann. Des Weiteren bietet der Paginator von Haus aus schon alle Funktionen an, die man für ein funktionales Paging benötigt.

$paginator->getPage(); // aktuelle Seite
$paginator->getFirstPage(); // die erste Seite
$paginator->getLastPage(); // die letzte Seite
$paginator->getPreviousPage(); // die vorherige Seite
$paginator->getNextPage(); // die nächste Seite
$paginator->getLinks(); // Seiten um die aktuelle Seite herum
$paginator->count(); // Gesamtzahl aller Einträge

Da wir innerhalb unserer Templates ebenfalls auf diese Funktionen zurückgreifen können, sobald wir das PropelModelPager Objekt über die render Funktion an unser Template übergeben haben, können wir nun unser Twig Makro (z.B. m_pagination.html) erstellen.
Dieses könnte so aussehen:

{% macro paginationControl(paginator, url) %}
   <div id="pagination">
     <a href="{{ url }}?page={{ paginator.getFirstPage }}">start</a>
     <a href="{{ url }}?page={{ paginator.getPreviousPage }}">back</a>
     {% for page in paginator.getLinks(3) %}
     <a href="{{ url }}?page={{ page }}" {%if page == paginator.page  %}style="font-weight:700;"{% endif %}>{{ page }}</a>
     {% endfor %}
     <a href="{{ url }}?page={{ paginator.getLastPage }}">end</a>
     <a href="{{ url }}?page={{ paginator.getNextPage }}">next</a>
   </div>
{% endmacro %}

Wie ihr euer Paging gestaltet ist natürlich euch überlassen.

Nun müssen wir nur noch unser Makro in das Layout oder in das jeweilige Template importieren:

{% import "m_pagination.html" as m_pagination %}

und können nun schön an jeder Stelle im Template, wo wir ein PropelModelPager Objekt verwenden ein fertiges Paging verwenden:

{{ m_pagination.paginationControl(paginator, '/path/to/anywhere') }}

That’s it und bis zum nächsten mal ;)

Über den Autor

devtalk

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen