hook_preprocess_page (): jak powiedzieć stronie wyświetleń?

10

Piszę niestandardowy moduł, który musi wstawiać niektóre pliki javascript i css tylko na stronie Widoki.

Korzystam ze strony hook_preprocess_page, ale nie wiem, czy bieżąca strona jest z widoku:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if([view page])
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
        // Rebuild scripts 
        $scripts = drupal_get_js();
        $vars['scripts'] = $scripts;
        // Same for css
    }
}

Wiem, że mogę użyć pliku szablonu (page-my_view_page_path.tpl.php), ale js i dodatkowy css muszą być dołączone tylko wtedy, gdy mój moduł jest włączony; więc lubię to trzymać bezpośrednio w kodzie modułu .

Pomysły?

Strae
źródło
Możesz używać plików szablonów w swoim module.
Jeremy French
@Jeremy: dodaj swoją odpowiedź wyjaśniającą jak, aby ludzie mogli głosować i kłócić się.
Strae
Nie było to bezpośrednio związane z odpowiedzią, po prostu wskazując, że plik tpl może być zawarty w module. DANieL wydawało się wskazywać, że nie może.
Jeremy French
cóż .. mógłbym dołączyć stronę tematyczną.tpl, ale moim celem jest, aby ten moduł był całkowicie niezależny od tematu ..
Strae
Możesz wdrożyć szablony widoków wstępnie przetwarzając swój moduł, jak sugeruje odpowiedź Jeremy French.
Pierre Buyle

Odpowiedzi:

12

views_get_page_view()dowiaduje się, jakie jest aktualnie używane wyświetlanie strony. Jeśli zwraca NULL, bieżąca strona nie jest stroną wyświetleń.

Ale użycie drupal_add_js()i drupal_add_css()w hook_preprocess_page()nie będzie działać zgodnie z oczekiwaniami, ponieważ zmienna $scripti $stylezmienne zostały już ustawione przez template_preprocess_page(). Wstępne przetwarzanie szablonów widoków (patrz odpowiedź Jeremy French) jest prawdopodobnie lepszym miejscem na dodanie CSS i JavaScript.

Pierre Buyle
źródło
Zaktualizowałem swoją odpowiedź dla ciebie drugi akapit - wiem, że dobrą praktyką jest dodawanie css lub js w kompozycji (theme_preprocess_ *), ale potrzebuję modułu zależnego.
Strae
Doskonale, views_get_page_view po prostu pobiera już załadowany widok z pamięci podręcznej, więc nie powinien mieć wpływu na wydajność. IMHO powinna to być zaakceptowana odpowiedź.
marcvangend
@Strae Moją sugestią było użycie HOOK_preprocess_views_view(&$variables)lub innego haka do wstępnego przetwarzania szablonu innego Widoku zamiast HOOK_preprocess_page(&$variables). W ten sposób można uzyskać widoki w $variablesi wykorzystania drupal_add_js()i drupal_add_css()bezpiecznie.
Pierre Buyle,
11

Tutaj jest długi wątek na temat preprocesorów . Ten komentarz wydaje mi się bardzo prosty.

function mymodule_theme_registry_alter(&$theme_registry) {
  //dpm($theme_registry);
  $theme_registry['views_view__YOUR_VIEW_NAME_HERE']['preprocess functions'][] = 'mymodule_preprocess_func';
}

// now go on and play with your new preprocess function
function mymodule_preprocess_func(&$vars) {
  // etc
}
Jeremy French
źródło
Zgadzam się, że wstępne przetwarzanie danych wyjściowych Widoku zamiast całej strony jest prawdopodobnie bardziej poprawnym podejściem.
Garrett Albright
8

Jeśli korzystasz z hook_preprocess_page (), z definicji twój widok ma wyświetlanie strony i ścieżkę menu, które muszą być unikalne - abyś mógł to zrobić:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if($_GET['q'] == 'my/view/path')
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
    }
}

Jeśli masz argumenty przekazywane na tę stronę, więc potrzebujesz części $_GET['q'], zrób to zamiast tego za pomocą arg()funkcji Drupala :

if(arg(0) == 'my' && arg(1) == 'view' && arg(2) == 'path')

http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/arg

Greg
źródło
Nie polecałbym sprawdzania $ _GET ['q']. Zamiast tego użyj menu_get_item () lub menu_get_object () . Żaden nie wymaga argumentu, jeśli przeglądasz bieżącą stronę, i oba zapisują wyniki w pamięci podręcznej.
Mikey P
Używanie drupal_add_js () i drupal_add_css () w hook_preprocess_page () nie będzie działać zgodnie z oczekiwaniami, ponieważ zmienne $ script i zmienne stylu $ zostały już ustawione przez template_preprocess_page (). Użytkownik views_get_page_view (), aby pobrać widok dla bieżącej strony (jeśli istnieje).
Pierre Buyle
3

Dla mnie to działa:

function MYMODULE_preprocess_page(&$vars) {
  $view = (array)views_get_page_view();
  if (!empty($view)) {
    // do stuff
  }
}
leymannx
źródło