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

13

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 créer un champ CCK comme "réglage du pager" et lui donner ensuite une option entière de xy. 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?

Geai
la source

Réponses:

18

Le point de vue que vous souhaitez utiliser est celui hook_views_pre_buildqui 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 soit construite de cette façon, 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.

ericduran
la source
Super merci. Je n'ai pas encore d'expérience en développement de modules, mais je commence avec quelques choses que je veux accomplir. J'ai une bonne compréhension de PHP, donc je peux suivre ce qui se passe dans ce morceau de code que vous avez collé ci-dessus. Je pense que cela m'aide beaucoup. Je vous remercie.
Jay
1
Pour les vues 3.x, le code correspondant doit être remplacé par$view->items_per_page = $pager_count;
stevenw00
est-il possible de définir dynamiquement le décalage de chaque page?
shekoufeh
2

Pour Drupal 7, Only doit é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.

heilop
la source
1

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
}
dobeerman
la source
"preprocess" est pour le thème et pre_render est trop tard (la requête a déjà été exécutée) - le hook pre_build est bien meilleur.
mojzis
1

Pour mettre à jour le résultat des vues et le téléavertisseur dans hook_views_pre_render, vous pouvez procéder comme suit:

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

tanmayk
la source
Excellent! Je voulais limiter le nombre d'éléments sur une page donnée en fonction des éléments renvoyés par la requête. Va vérifier cette méthode dès que possible.
Jens
Cela ne fonctionne pas exactement. Les lignes que vous déchargez n'apparaissent pas sur la page suivante. Vous vous retrouvez donc avec du contenu manquant. A besoin de plus d'enquête.
Jens
0

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.

adevms
la source