Quando si utilizza Drupal 7 e Views 3, qual è il modo corretto di modificare un valore del filtro Views in modo che influisca sul contenuto che sta per essere visualizzato?
Ho provato tutto quanto menzionato qui per D6.
Anche se alcune persone sono riuscite a farlo funzionare, Merlin afferma che modificare display_options è il modo errato per raggiungere questo obiettivo, ma è vago nella sua risposta su cosa fare ( http://drupal.org/node/789710#comment- 2927556 ).
Ho provato:
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']);
}
Appunti:
1) Ho creato una vista chiamata north_carolina
che ha due tipi di display: una pagina e un blocco (pagina_1 e blocco_1).
2) i miei filtri sono gli stessi su tutti i miei schermi, quindi sto provando a cambiare il display "predefinito" in modo che influisca su tutti.
3) Il valore predefinito del mio filtro è "North Carolina" (che ho impostato nell'interfaccia utente di Views) ma noti che sto cercando di cambiarlo in "Georgia"
4) Se eseguo DSM immediatamente dopo, vedo che il filtro è stato modificato, tuttavia i miei risultati mostrano ancora i risultati "North Carolina". La memorizzazione nella cache è disattivata e ottengo sempre la stessa cosa dopo aver eseguito drush cc all.
Ho anche provato a eseguire lo stesso codice attraverso hook_views_pre_build
e hook_views_pre_execute
.
Eventuali suggerimenti?
MODIFICARE:
Come suggerito, può essere utile avere ulteriori informazioni. Ecco un dump della 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';
Si noti che questi gestori sono forniti dal modulo locations. In particolare per il filtro "Posizione: provincia", mi viene fornito un modulo di completamento automatico. Quando scrivo in Carolina del Nord, si apre e devo sceglierlo. Tuttavia, notare nell'istruzione SQL che le viste generano utilizza l'abbreviazione di due caratteri per stato:
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