web-dev-qa-db-fra.com

Est-il possible de définir dynamiquement les paramètres du pager de Views?

Supposons, par exemple, que vous ayez une vue qui s'affiche lors de la visualisation d'un certain type de nœud, mais que vous souhaitez que les paramètres du pager soient différents pour chaque nœud individuel. Je pensais faire un champ CCK comme "réglage du pager" et lui donner ensuite une option entière de x-y. Mais je ne sais pas s'il est possible de brancher dynamiquement ce champ dans les paramètres des vues. Ou existe-t-il une autre façon de le faire peut-être?

13
Jay

Le point de vue que vous souhaitez utiliser est hook_views_pre_build qui est appelé avant la génération de la requête. Maintenant, cela suppose que vous avez une certaine expérience de développement de modules de base et que vous êtes familier avec les vues api.

Vous devriez pouvoir faire:

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

Ci-dessus, nous utilisons un hook de vues qui est appelé avant que la requête de vue ne soit construite de cette manière, le pager et tout le reste refléteront le changement.

Attention: les crochets de vue ne doivent être utilisés que si vous comprenez ce qui se passe. Le code ci-dessus est écrit pour views-2.x.

J'espère que cela t'aides.

18
ericduran

Pour Drupal 7, Only devrait écrire ce qui suit:

$view->items_per_page = $pager_count;

Dans l'exemple:

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

J'utilise l'exemple de code par @ericduran.

2
heilop

Pour mettre à jour le résultat des vues et le pager dans hook_views_pre_render, vous pouvez effectuer les opérations suivantes:

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

Cela devrait fonctionner !! ;)

1
tanmayk

Vous devez utiliser la fonction de prétraitement des vues

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

Le code de @tanmayk a fait l'affaire pour moi. Dans hook_views_pre_render ajouté seulement ces 2 lignes de code

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

Mais je n'avais pas besoin d'ajouter les résultats à la vue.

0
adevms