Nehmen wir an, wir möchten in einer Ansicht die Anzahl der ausgespielten Ergebnisse dynamisch anpassen, jenachdem welche Argumente an die Ansicht übergeben wurden. ViewExecutable stellt die Methode setItemsPerPage() zur Verfügung. Auf den ersten Blick scheint das also schnell gemacht, aber der Teufel steckt – wie immer – im Detail.
Falls wir noch kein ViewExecutable
-Objekt zur Hand haben, implementieren wir am besten zunächst einen Hook des Views-Moduls. Das machen wir nicht wie bei anderen Hooks üblich in unserer Modul-Datei, sondern wir erstellen eine neue Datei namens module_name.views_execution.inc
im Wurzel-Ordner unseres benutzerspezifischen Moduls und implementieren den Hook dort. Views lädt diese Datei dann, wenn es nötig ist, automatisch. Ein guter Hook um die Änderungen an unserem Pager vorzunehmen, ist hook_views_pre_view(), der genau zu Beginn der Initialisierungs-Phase einer Ansicht ausgeführt wird.
Eine weitere hilfreiche Methode, die von ViewExecutable
zur Verfügung gestellt wird, ist setOffset(), die es erlaubt, das Offset anzupassen (z.B. die ersten zwei Einträge der Ergebnisse zu überspringen).
Wichtiger Hinweis: Falls ein Pager-Plugin verwendet wird, das diese Optionen nicht verwendet, dann werden die Aufrufe dieser Methoden keine Auswirkungen haben. Falls Sie z.B. das none
Pager-Plugin verwenden (also die Display all results Pager-Einstellung im UI), wird die Ansicht immer alle Ergebnisse anzeigen, selbst wenn Sie die Methode setItemsPerPage()
für diese Ansicht aufrufen. In dem Fall muss zunächst auf ein Pager-Plugin gewechselt werden, das die entsprechende Einstellung auch verwendet (z.B. some
, was der Einstellung Display a specified number of items im UI entspricht). Um das zu tun, können wir die Pager-Option des display handler mit Hilfe der Methode getOption() abrufen. Diese gibt uns ein Array mit den Schlüsseln type und options zurück. Der Wert von type ist ein String, der den Namen des Pager-Plugins enthält und der Wert von options ist wiederum ein Array, das die Einstellungen des Pager-Plugins enthält. Nachdem wir das Array wie von uns benötigt angepasst haben, können wir die Methode setOption() verwenden um die Pager-Option zu aktualisieren. Auf diesem Weg können auch beliebige andere Pager-Einstellungen geändert werden, man muss nur das Array anpassen.
In Code gegossen sieht das dann so aus:
<?php /** * @file * Hook implementations for hooks provided by Views API. */ use Drupal\views\ViewExecutable; /** * Implements hook_views_pre_view(). */ function example_views_pre_view(ViewExecutable $view) { if ($view->id() == 'example_view' && $view->current_display == 'display_id') { // Show only three items. This assumes, that we already use a pager plugin, // that uses this option. Otherwise it wouldn't have any effect. $view->setItemsPerPage(3); // Skip the first 5 items. Again, this assumes, that we already use a // pager plugin, that uses this option. Otherwise it wouldn't have any // effect. $view->setOffset(5); // If we need to change the pager type or other options of the pager, we // need to modify the pager option of the display handler. $pager = $view->display_handler->getOption('pager'); // Change the pager plugin. Some will show a specified number of results. $pager['type'] = 'some'; // All options used by the plugin are available in $pager['options']. // If you want to change them, that's fine. You just need to know the keys. // Update pager option of the display handler. $view->display_handler->setOption('pager', $pager); } }