É possível definir dinamicamente as configurações do pager do Views?

13

Por exemplo, você tem uma exibição que é exibida ao exibir um determinado tipo de nó, mas deseja que as configurações do pager sejam diferentes para cada nó individual. Eu estava pensando em criar um campo CCK como "pager setting" e, em seguida, dar a ele uma opção inteira de xy. Mas não sei se é possível, de alguma forma, conectar dinamicamente esse campo às configurações do Views. Ou existe outra maneira de fazer isso, talvez?

Jay
fonte

Respostas:

18

O gancho de visualizações que você deseja usar hook_views_pre_buildé o chamado antes da criação da consulta. Agora, isso pressupõe que você tenha alguma experiência básica em desenvolvimento de módulos e que esteja familiarizado com a API de visualizações.

Você deve ser capaz de:

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

Acima, usamos um gancho de visualizações chamado antes que a consulta de visualização seja criada dessa maneira, o pager e tudo o mais refletirá a alteração.

Palavra de cautela: os ganchos de visualizações só devem ser usados ​​se você entender o que está acontecendo. O código acima foi escrito para views-2.x.

Espero que isto ajude.

ericduran
fonte
Perfeito, obrigado. Ainda não tenho nenhuma experiência em desenvolvimento de módulos, mas estou começando por algumas coisas que quero realizar. Eu tenho uma compreensão prática do PHP, para que eu possa acompanhar o que está acontecendo naquele pedaço de código que você colou acima. Eu acho que isso me ajuda muito. Obrigado.
Jay
1
Para a Views 3.x, o código relevante deve ser alterado para$view->items_per_page = $pager_count;
stevenw00
também é possível definir dinamicamente o deslocamento de cada página?
shekoufeh
2

Para o Drupal 7, Somente deve escrever o seguinte:

$view->items_per_page = $pager_count;

No exemplo:

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

Eu uso exemplo de código por @ericduran.

heilop
fonte
1

Você deve usar a função de pré-processamento de visualizações

/*
 * 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
fonte
"preprocess" é para temas e o pre_render é muito tarde (a consulta já foi executada) - o gancho do pre_build é muito melhor.
Mjzis
1

Para atualizar o resultado das visualizações e o pager em hook_views_pre_render, você pode fazer o seguinte:

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

Isso deve funcionar !! ;)

tanmayk
fonte
Excelente! Queria limitar o número de itens em uma determinada página, dependendo dos itens retornados pela consulta. Irá verificar este método o mais rápido possível.
Jens
Não funciona exatamente. As linhas que você descarrega não aparecem na próxima página. Então você acaba com o conteúdo ausente. Precisa de mais investigação.
Jens
0

O código do @tanmayk fez o truque para mim. Em hook_views_pre_render adicionou apenas estas 2 linhas de código

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

Mas não precisei adicionar os resultados à exibição.

adevms
fonte