¿Es posible establecer dinámicamente la configuración del localizador de Vistas?

13

Digamos, por ejemplo, que tiene una vista que se muestra al ver un determinado tipo de nodo, pero desea que la configuración del localizador sea diferente para cada nodo individual. Estaba pensando en hacer un campo CCK como "configuración de buscapersonas" y luego darle una opción entera de xy. Pero no sé si es posible de alguna manera conectar dinámicamente ese campo a la configuración de las Vistas. ¿O tal vez hay otra forma de hacer esto?

Arrendajo
fuente

Respuestas:

18

El enlace de vistas que desea utilizar es el hook_views_pre_buildque se llama antes de que se genere la consulta. Ahora, esto supone que tiene experiencia básica en el desarrollo de módulos y que está familiarizado con la API de vistas.

Deberías poder hacer:

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

Arriba estamos usando un enlace de vistas que se llama antes de que la consulta de vista se construya de esa manera, el localizador y todo lo demás reflejará el cambio.

Palabra de advertencia: los ganchos de vista solo deben usarse si entiendes lo que está sucediendo. El código anterior está escrito para views-2.x.

Espero que esto ayude.

ericduran
fuente
Increíble gracias. Todavía no tengo experiencia en el desarrollo de módulos, pero estoy comenzando con un par de cosas que quiero lograr. Tengo un conocimiento práctico de PHP, por lo que puedo seguir lo que está sucediendo en ese fragmento de código que pegó anteriormente. Creo que esto me ayuda mucho. Gracias.
Jay
1
Para Vistas 3.x, el código relevante debe cambiarse a$view->items_per_page = $pager_count;
stevenw00
¿Es posible establecer el desplazamiento de cada página dinámicamente también?
shekoufeh
2

Para Drupal 7, solo debe escribir lo siguiente:

$view->items_per_page = $pager_count;

En el ejemplo:

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

Yo uso el ejemplo de código de @ericduran.

heilop
fuente
1

Debe usar la función de preproceso de vistas

/*
 * 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
fuente
"preprocess" es para temas y pre_render es demasiado tarde (la consulta ya se ejecutó): el enlace pre_build es mucho mejor.
mojzis
1

Para actualizar el resultado de las vistas y el localizador en hook_views_pre_render, puede hacer lo siguiente:

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

¡¡Esto debería funcionar!! ;)

tanmayk
fuente
¡Excelente! Quería limitar el número de elementos en una página determinada dependía de los elementos devueltos por la consulta. Verificará este método lo antes posible.
Jens
No funciona exactamente. Las filas que descarga no aparecen en la página siguiente. Entonces terminas con contenido perdido. Necesita más investigación.
Jens
0

El código de @tanmayk me sirvió. En hook_views_pre_render agregó solo estas 2 líneas de código

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

Pero no necesitaba agregar los resultados a la vista.

adevms
fuente