it-swarm.com.de

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

Angenommen, Sie haben eine Ansicht, die angezeigt wird, wenn ein bestimmter Knotentyp angezeigt wird. Sie 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 ihm dann eine ganzzahlige Option von x-y zu geben. Aber ich weiß nicht, ob es möglich ist, dieses Feld dynamisch in die Einstellungen der Ansichten einzufügen. Oder gibt es vielleicht einen anderen Weg, dies zu tun?

13
Jay

Der Ansichts-Hook, den Sie verwenden möchten, ist hook_views_pre_build, das aufgerufen wird, bevor die Abfrage erstellt wird. Dies setzt voraus, dass Sie über grundlegende Erfahrungen in der Modulentwicklung verfügen und mit den Ansichten der 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: Ansichten-Hooks sollten nur verwendet werden, wenn Sie verstehen, was los ist. Der obige Code wurde für views-2.x geschrieben.

Hoffe das hilft.

18
ericduran

Für Drupal 7, sollte nur 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.

2
heilop

Um das Ergebnis und den Pager der Ansichten in hook_views_pre_render zu aktualisieren, haben Sie folgende Möglichkeiten:

<?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!! ;)

1
tanmayk

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
}
1
dobeerman

@tanmayks Code hat den Trick für mich getan. 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.

0
adevms