it-swarm-eu.dev

Je možné dynamicky nastavit nastavení pageru Zobrazení?

Řekněme například, že máte pohled, který se zobrazí při prohlížení určitého typu uzlu, ale chcete, aby se nastavení pageru pro každý jednotlivý uzel lišilo. Přemýšlel jsem o vytvoření pole CCK, jako je „nastavení pageru“, a pak jsem mu dal celočíselnou možnost x-y. Ale nevím, jestli je možné nějakým způsobem dynamicky připojit toto pole do nastavení Zobrazení. Nebo existuje nějaký jiný způsob, jak toho dosáhnout?

13
Jay

Háček zobrazení, který chcete použít, je hook_views_pre_build které se volá před vytvořením dotazu. Nyní se předpokládá, že máte nějaké základní zkušenosti s vývojem modulu a že jste obeznámeni s api pohledy.

Měli byste být schopni udělat:

/*
 * 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;
    }
  }
}

Výše používáme háček na zobrazení, který se volá před vytvořením dotazu na zobrazení tak, aby pager a všechno ostatní odráželo změnu.

Upozornění: háčky na zobrazení by se měly používat pouze tehdy, pokud rozumíte tomu, co se děje. Výše uvedený kód je zapsán pro zobrazení-2.x.

Snad to pomůže.

18
ericduran

Pro Drupal 7, pouze by měl napsat následující text:

$view->items_per_page = $pager_count;

V příkladu:

/**
 * 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;
    }
  }
}

Používám příklad kódu od @ericduran.

2
heilop

Chcete-li aktualizovat výsledek zobrazení a pager v hook_views_pre_render, můžete provést následující:

<?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;
  }
}

To by mělo fungovat !! ;)

1
tanmayk

Měli byste použít funkci předzpracování pohledů

/*
 * 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

@tanmaykův kód mi udělal trik. Do hook_views_pre_render přidali právě tyto 2 řádky kódu

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

Ale nemusel jsem přidat výsledky do pohledu.

0
adevms