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?


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.


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
}

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


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
  }
}

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.