views – ¿Cómo puedo alterar el valor de un filtro y modificar la salida antes de que se muestre la vista?

Pregunta:

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

Probé todo lo mencionado aquí para D6.

Aunque algunas personas lo hicieron funcionar, Merlín afirma que modificar display_options es la forma incorrecta de lograrlo, pero es vago 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_carolina que tiene dos tipos de pantallas: una página y un bloque (page_1 y block_1).

2) Mis filtros son los mismos en todas mis pantallas, por lo 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 observe que estoy tratando de cambiarlo a 'Georgia'

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

También intenté ejecutar ese mismo código a través de hook_views_pre_build y hook_views_pre_execute .

¿Alguna sugerencia?

EDITAR:

Como se sugirió, 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 los proporciona el módulo de ubicaciones. Específicamente para el filtro "Ubicación: Provincia", recibo un formulario de autocompletado. Cuando escribo en Carolina del Norte, aparece y tengo que elegir eso. Sin embargo, observe en la declaración SQL que las vistas generan usan 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

Respuesta:

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

El siguiente fragmento no está modificado y funciona como se esperaba en uno de mis sitios de producción. Con suerte, es suficiente para que se dirija en la dirección correcta (obviamente, esto está en un módulo personalizado llamado offer_select ). Si puede proporcionar el código de la vista exportada, alguien podría echarle 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();
  }
}

–ACTUALIZAR–
Para su vista específica, instalé el módulo Ubicación y creé algunos nodos en NC y algunos en Georgia e importé su vista para probar. En mi módulo personalizado (llamado dev ) comencé con este código (con devel 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 imprimió North Carolina en Krumo. En ese punto, 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.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım