¿Cómo puedo alterar el valor de un filtro y alterar la salida antes de que se visualice la vista?


15

Al usar Drupal 7 y Views 3, ¿cuál es la forma correcta de alterar un valor de filtro de Views para que afecte el contenido que está a punto de representarse?

Intenté todo lo mencionado aquí para D6.

Aunque algunas personas lo pusieron a trabajar, Merlin afirma que modificar las opciones de visualización es la forma incorrecta de lograr esto, pero es impreciso en su respuesta sobre qué hacer ( http://drupal.org/node/789710#comment- 2927556 ).

Yo he tratado:

function pages_views_pre_view($view){
    $view = views_get_view('north_carolina');
    $view->set_display('default');

    $view->display_handler->options['filters']['province']['value'] = 'Georgia';
    dsm($view->display_handler->options['filters']['province']);
}

Notas:

1) Tengo una vista creada llamada north_carolinaque tiene dos tipos de pantallas: una página y un bloque (página_1 y bloque_1).

2) mis filtros son los mismos en mis pantallas, así que estoy tratando de cambiar la pantalla 'predeterminada' para que los afecte a todos.

3) El valor predeterminado de mi filtro es 'Carolina del Norte' (que configuré en la interfaz de usuario de Vistas), pero tenga en cuenta que estoy tratando de cambiarlo a 'Georgia'

4) Si ejecuto DSM inmediatamente después, veo que el filtro ha cambiado, sin embargo, mis resultados todavía muestran los resultados de 'Carolina del Norte'. El almacenamiento en caché está desactivado, y todavía obtengo lo mismo después de ejecutar drush cc all.

También he intentado ejecutar ese mismo código a través de hook_views_pre_buildy hook_views_pre_execute.

¿Alguna sugerencia?

EDITAR:

Como se sugiere, puede ser útil tener información adicional. Aquí hay un volcado de la vista:

$view = new view();
$view->name = 'north_carolina';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'North Carolina';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'test nc block';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Location: Province */
$handler->display->display_options['filters']['province']['id'] = 'province';
$handler->display->display_options['filters']['province']['table'] = 'location';
$handler->display->display_options['filters']['province']['field'] = 'province';
$handler->display->display_options['filters']['province']['value'] = 'North Carolina';
$handler->display->display_options['filters']['province']['exposed'] = TRUE;
$handler->display->display_options['filters']['province']['expose']['operator_id'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['label'] = 'State';
$handler->display->display_options['filters']['province']['expose']['operator'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['identifier'] = 'province';
$handler->display->display_options['filters']['province']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
);

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block_1');
$handler->display->display_options['block_description'] = 'test nc block';

Tenga en cuenta que estos controladores son proporcionados por el módulo de ubicaciones. Específicamente para el filtro "Ubicación: Provincia", recibo un formulario de autocompletar. Cuando escribo en Carolina del Norte, aparece, y tengo que elegir eso. Sin embargo, observe en la instrucción SQL que las vistas generan que usa la abreviatura de dos caracteres para el estado:

SELECT node.title AS node_title, node.nid AS nid, node.created AS node_created
FROM 
{node} node
LEFT JOIN {location_instance} location_instance ON node.vid = location_instance.vid
LEFT JOIN {location} location ON location_instance.lid = location.lid
WHERE (( (node.status = '1') AND (location.province = 'NC') ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0

Respuestas:


8

Puede ser difícil determinar la parte exacta del objeto de vistas para modificar. Por lo general, primero exporto la vista y miro el código generado para comenzar.

El fragmento a continuación no se modifica y funciona como se esperaba en uno de mis sitios de producción. Esperemos que sea suficiente para que te dirijas en la dirección correcta (obviamente, esto está en un módulo personalizado llamado offer_select). Si puede proporcionar el código desde la vista exportada, alguien podría echar un vistazo.

//Alter the End date filter on the offer views
function offer_select_views_pre_view(&$view) {
  if ($view->name == 'active_offers') {
    $view->display['default']->handler->options['filters']['field_end_value']['value']['value'] = time();
  }
}

--Actualización--
Para su vista específica, instalé el módulo Ubicación y creé algunos nodos en Carolina del Norte y algunos en Georgia e importé su vista para probar. En mi módulo personalizado (llamado dev) comencé con este código (con el desarrollo instalado):

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']);
  }
}

A partir de ahí, continué agregando los valores obvios que se muestran en krumo a la matriz hasta que llegué aquí:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']['province']['value']);
  }
}

Que simplemente impreso North Carolinaen Krumo. En ese momento cambié de imprimir el valor a configurarlo así:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    $view->display['default']->handler->options['filters']['province']['value'] = 'Georgia';
  }
}

Y voilá. Eso hizo el truco.


Frio. Cuando tenga la oportunidad, jugaré con su punto de vista y veré si puedo encontrar una respuesta más concreta.
Adam Balsam

@ blue928 ver arriba. He actualizado mi respuesta con una respuesta específica a sus preguntas e instrucciones generales sobre cómo llegué allí.
Adam Balsam

Eso funcionó muy bien. Nota sobre la respuesta correcta: Parte de mi problema es que no necesitaba llamar a views_get_view o configurar la pantalla.
blue928

2

En caso de que alguien aparezca este hilo mientras buscaba la misma solución en D8 (como lo hice yo):

La nueva API permite manipular estos parámetros de una manera mucho más clara. Ver esta sección para referencias.

Pequeño ejemplo

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.