Kiedy korzystasz z Drupal 7 i Views 3, jaki jest prawidłowy sposób zmiany wartości filtru Views, aby wpływał na treść, która właśnie ma być renderowana?
Próbowałem wszystkiego, co tu wspomniano dla D6.
Chociaż kilka osób sprawiło, że zadziałało, Merlin twierdzi, że modyfikacja opcji display_options jest niewłaściwym sposobem na osiągnięcie tego, ale nie jest pewny, co do tego, co robić ( http://drupal.org/node/789710#comment- 2927556 ).
Próbowałem:
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']);
}
Uwagi:
1) Mam utworzony widok o nazwie, north_carolina
który ma dwa typy wyświetlaczy - stronę i blok (strona_1 i blok_1).
2) moje filtry są takie same na wszystkich ekranach, dlatego próbuję zmienić ekran „domyślny”, aby wpłynął na wszystkie z nich.
3) Domyślną wartością mojego filtra jest „Karolina Północna” (którą ustawiłem w interfejsie użytkownika Widok), ale zauważ, że próbuję zmienić go na „Georgia”
4) Jeśli uruchomię DSM natychmiast po tym, zauważę, że filtr został zmieniony, jednak moje wyniki nadal pokazują wyniki z „Karoliny Północnej”. Buforowanie jest wyłączone, a nadal otrzymuję to samo po uruchomieniu drush cc all.
Próbowałem również uruchomić ten sam kod przez hook_views_pre_build
i hook_views_pre_execute
.
Jakieś sugestie?
EDYTOWAĆ:
Zgodnie z sugestią może to pomóc w uzyskaniu dodatkowych informacji. Oto zrzut widoku:
$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';
Pamiętaj, że te moduły obsługi są dostarczane przez moduł lokalizacji. Specjalnie dla filtra „Lokalizacja: Prowincja” otrzymuję formularz autouzupełniania. Kiedy piszę w Karolinie Północnej, pojawia się i muszę to wybrać. Jednak w instrukcji SQL, która generuje widoki, należy zauważyć, że dla stanu należy użyć dwuznakowego skrótu:
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
W przypadku, gdy ktoś wyświetla ten wątek podczas wyszukiwania tego samego rozwiązania na D8 (tak jak ja):
Nowe API pozwala manipulować tymi parametrami w znacznie bardziej przejrzysty sposób. Odwołaj się do tej sekcji .
Mały przykład
źródło