Czy można dynamicznie ustawić ustawienia pagera w Widoku?

13

Powiedzmy na przykład, że masz widok wyświetlany podczas przeglądania określonego typu węzła, ale chcesz, aby ustawienia pagera były różne dla każdego węzła. Zastanawiałem się nad stworzeniem pola CCK, takiego jak „ustawienie pagera”, a następnie dam mu całkowitą opcję xy. Ale nie wiem, czy możliwe jest dynamiczne podłączenie tego pola do ustawień Widoku. A może jest to inny sposób?

Sójka
źródło

Odpowiedzi:

18

Zaczep widoków, którego chcesz użyć, hook_views_pre_buildjest wywoływany przed zbudowaniem zapytania. Teraz zakładamy, że masz podstawowe doświadczenie w programowaniu modułów i że znasz interfejs API widoków.

Powinieneś być w stanie zrobić:

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

Powyżej używamy haka widoków, który jest wywoływany przed utworzeniem zapytania o widok w ten sposób pager i wszystko inne odzwierciedla zmianę.

Uwaga: haczyków do widoków należy używać tylko wtedy, gdy rozumiesz, co się dzieje. Powyższy kod jest napisany dla views-2.x.

Mam nadzieję że to pomoże.

ericduran
źródło
Wspaniale! Dziękuję. Nie mam jeszcze doświadczenia w tworzeniu modułów, ale zaczynam od kilku rzeczy, które chcę osiągnąć. Mam dobrą znajomość PHP, więc mogę śledzić, co dzieje się w tym fragmencie kodu, który wkleiłeś powyżej. Myślę, że to bardzo mi pomaga. Dziękuję Ci.
Jay
1
W przypadku widoków 3.x odpowiedni kod należy zmienić na$view->items_per_page = $pager_count;
stevenw00,
czy możliwe jest również dynamiczne ustawienie przesunięcia każdej strony?
shekoufeh
2

W przypadku Drupal 7, należy napisać tylko:

$view->items_per_page = $pager_count;

W przykładzie:

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

Korzystam z kodu przykład @ericduran.

heilop
źródło
1

Powinieneś użyć funkcji podglądu wstępnego

/*
 * 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
źródło
„Preprocess” dotyczy tematów, a pre_render jest za późno (zapytanie zostało już uruchomione) - hak pre_build jest znacznie lepszy.
mojzis
1

Aby zaktualizować wyniki widoku i pager w hook_views_pre_render, możesz wykonać następujące czynności:

<?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 powinno działać !! ;)

tanmayk
źródło
Doskonały! Chciałem ograniczyć liczbę elementów na danej stronie w zależności od elementów zwróconych przez zapytanie. Sprawdzę tę metodę jak najszybciej.
Jens
To nie do końca działa. Rzędy, które zwalniasz, nie pojawiają się na następnej stronie. W rezultacie brakuje Ci treści. Potrzebuje więcej dochodzeń.
Jens
0

Kod @tanmayk załatwił sprawę. W hook_views_pre_render dodano tylko te 2 wiersze kodu

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

Ale nie musiałem dodawać wyników do widoku.

adevms
źródło