Ist es möglich, die Pager-Einstellungen von Views dynamisch festzulegen?

13

Angenommen, Sie haben eine Ansicht, die beim Anzeigen eines bestimmten Knotentyps angezeigt wird, möchten jedoch, dass die Pager-Einstellungen für jeden einzelnen Knoten unterschiedlich sind. Ich dachte daran, ein CCK-Feld wie "Pager-Einstellung" zu erstellen und es dann mit einer Ganzzahloption von xy zu versehen. Aber ich weiß nicht, ob es irgendwie möglich ist, dieses Feld dynamisch in die Einstellungen der Ansichten einzufügen. Oder gibt es vielleicht einen anderen Weg, dies zu tun?

Jay
quelle

Antworten:

18

Der Views-Hook, den Sie verwenden möchten, hook_views_pre_buildwird aufgerufen, bevor die Abfrage erstellt wird. Dies setzt voraus, dass Sie über grundlegende Erfahrung in der Modulentwicklung verfügen und mit den Ansichten von api vertraut sind.

Sie sollten in der Lage sein:

/*
 * Implementation of hook_views_pre_build().
 */
function hook_views_pre_build(&$view) {

  // Make sure this is only for the specific view you want to modified
  if ($view->name == "foo_bar") {

    // Get the x-y value from where you're storing it (in your example the node object).
    $pager_count = get_count_for_this_node();

    // Lets also make sure that this is a number so we won't destroy our view.
    if (is_numeric($pager_count)) {

      // Now lets set the pager item to what ever out count is.
      $view->pager['items_per_page'] = $pager_count;
    }
  }
}

Oben verwenden wir einen Views-Hook, der aufgerufen wird, bevor die View-Abfrage so erstellt wird, dass der Pager und alles andere die Änderung widerspiegeln.

Achtung: Views-Hooks sollten nur verwendet werden, wenn Sie wissen, was los ist. Der obige Code ist für views-2.x geschrieben.

Hoffe das hilft.

Ericduran
quelle
Großartig, danke. Ich habe noch keine Erfahrung in der Modulentwicklung, aber ich beginne mit ein paar Dingen, die ich erreichen möchte. Ich verstehe PHP sehr gut und kann daher nachvollziehen, was in dem Code passiert, den Sie oben eingefügt haben. Ich denke das hilft mir sehr. Vielen Dank.
Jay
1
Für Views 3.x sollte der entsprechende Code auf$view->items_per_page = $pager_count;
stevenw00 29.07.14
Ist es möglich, den Versatz jeder Seite auch dynamisch festzulegen?
Shekoufeh
2

Für Drupal 7 sollte Only Folgendes schreiben:

$view->items_per_page = $pager_count;

Im Beispiel:

/**
 * Implements hook_views_pre_build().
 */
function module_name_views_pre_build(&$view) {
  if ($view->name == "foo_bar" && $view->current_display == 'foo_display') {
    $pager_count = get_count_for_this_node();
    if (is_numeric($pager_count)) {
      $view->items_per_page = $pager_count;
    }
  }
}

Ich benutze ein Codebeispiel von @ericduran.

heilop
quelle
1

Sie sollten die Vorverarbeitungsfunktion für Ansichten verwenden

/*
 * Implementation of hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view){
  // $view->name
  // $view->current_display
  // ...
  // look for other variables in $view object
}
Dobeerman
quelle
"preprocess" ist für das Theming und pre_render ist zu spät (die Abfrage wurde bereits ausgeführt) - der pre_build-Hook ist viel besser.
Mojzis
1

Gehen Sie wie folgt vor, um das Ergebnis der Ansichten und den Pager in hook_views_pre_render zu aktualisieren:

<?php

/**
 * Implementation of hook_views_pre_render().
 */
function MODULENAME_views_pre_render(&$view) {
  if ($view->name == 'my_view' && $view->current_display == 'my_display') {
    // View result update logic.
    // e.g.
    // $result = array();
    // foreach ($view->result as $k => $row) {
    //   if (whatever is your condition) {
    //     $result[$k] = $row;
    //   }
    // }

    // Assuming $result has data as per your logic.
    // Update the pager according to result.
    $view->query->pager->total_items = count($result);
    $view->query->pager->update_page_info();
    // Add results to view.
    $view->result = $result;
  }
}

Das sollte funktionieren!! ;)

Tanmayk
quelle
Ausgezeichnet! Ich wollte die Anzahl der Elemente auf einer bestimmten Seite in Abhängigkeit von den von der Abfrage zurückgegebenen Elementen begrenzen. Wird diese Methode so schnell wie möglich überprüfen.
Jens
Es funktioniert nicht genau. Die Zeilen, die Sie entladen, werden auf der nächsten Seite nicht angezeigt. So haben Sie am Ende fehlende Inhalte. Benötigt mehr Nachforschungen.
Jens
0

@tanmayks Code hat den Trick für mich gemacht. In hook_views_pre_render wurden nur diese 2 Codezeilen hinzugefügt

$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();

Aber ich musste die Ergebnisse nicht zur Ansicht hinzufügen.

adevms
quelle