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?

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.


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.


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
}

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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.