Jak mogę zmienić wartość filtra i zmienić dane wyjściowe przed renderowaniem widoku?


15

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_carolinaktó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_buildi 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

Odpowiedzi:


8

Trudno jest ustalić dokładną część obiektu widoków do zmodyfikowania. Zwykle najpierw eksportuję widok i szukam na początek wygenerowanego kodu.

Poniższy fragment kodu jest niezmodyfikowany i działa zgodnie z oczekiwaniami w jednym z moich witryn produkcyjnych. Mamy nadzieję, że wystarczy, aby skierować Cię w dobrym kierunku (oczywiście jest to niestandardowy moduł o nazwie offer_select). Jeśli możesz podać kod z wyeksportowanego widoku, ktoś może rzucić okiem.

//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();
  }
}

- AKTUALIZACJA -
Dla twojego konkretnego widoku zainstalowałem moduł Lokalizacja i utworzyłem kilka węzłów w NC i kilka w Gruzji i zaimportowałem twój widok do przetestowania. W moim niestandardowym module (o nazwie dev) zacząłem od tego kodu (z zainstalowanym devel):

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

Stamtąd dodawałem do tablicy oczywiste wartości wyświetlane w krumo, aż doszedłem tutaj:

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

Które po prostu wydrukowano North Carolinaw Krumo. W tym momencie zmieniłem z drukowania wartości na ustawienie w następujący sposób:

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

I voila. To załatwiło sprawę.


Chłodny. Kiedy będę miał okazję, pobawię się twoim widokiem i zobaczę, czy mogę wymyślić bardziej konkretną odpowiedź.
Adam Balsam

@ blue928 patrz wyżej. Zaktualizowałem swoją odpowiedź odpowiedzią na Twoje pytania i ogólnymi instrukcjami, jak się tam dostać.
Adam Balsam

działało świetnie. Uwaga na poprawną odpowiedź: część mojego problemu polega na tym, że nie musiałem wywoływać views_get_view ani ustawiać wyświetlania.
blue928

2

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

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.