it-swarm-es.com

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

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 x-y. 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?

13
Jay

El enlace de vistas que desea utilizar es hook_views_pre_build que se llama antes de que se construya 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.

18
ericduran

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.

2
heilop

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

1
tanmayk

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
}
1
dobeerman

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.

0
adevms