2012-05-03 11 views
6

Mam następujący kod w moim Drupal 7 template.php pliku:Drupal 7 preprocess_views nie działa

function mytheme_preprocess_views_view__videos__videos(&$vars) { 
     drupal_add_css(drupal_get_path('theme', 'mytheme') . "/css/qwembed-jquery-1.0.css"); 
     drupal_add_js(drupal_get_path('theme', 'mytheme').'/js/jquery.swfobject.1-1-1.min.js', array('type' => 'file', 'scope' => 'footer')); 
     drupal_add_js(drupal_get_path('theme', 'mytheme').'/js/qwembed-jquery-1.0.js', array('type' => 'file', 'scope' => 'footer')); 
    } 

muszę załadować te css i js złożyć tylko wtedy, gdy wyświetlany jest ten pogląd.

widok nazwa pojawi się: Videos widok Nazwa komputera to: videos

i Nadpisywane pliki są:

views-view--videos--videos.tpl.php 

views-view-unformatted--videos--videos.tpl.php 

views-view-fields--videos--videos.tpl.php 

jakieś pomysły dlaczego to nie działa?

+0

Czy podwójne "__videos__videos" to tylko literówka? Jeśli nazwa widoków to "filmy", spodziewam się, że "[twoja_nazwa_uczytu] _preprocess_views_view__videos (& $ vars)". –

+0

Uznałem, że to dlatego, że nazwa użytkownika to filmy, a w tym przypadku nazwa komputera to wideo. Wymienione powyżej pliki szablonów działają idealnie i są filmami - wideo. Na wszelki wypadek spróbuję je usunąć. Dzięki – Cybercampbell

+1

Trzymaj się, myślę, że się pomyliłem przez coś, więc myślę, że to * nie * zadziała tylko z jednym "__videos". Sprawdzi ponownie i doda odpowiedź. –

Odpowiedz

21

Problem polega na tym, że próbujesz zaimplementować funkcję przetwarzania wstępnego na podstawie tego samego wzorca nazewnictwa, który był stosowany do zastępowania szablonów. Jednak funkcje przetwarzania wstępnego są nieco inne, domyślnie mogą być realizowane tylko na podstawie nazwy szablonu "podstawowego" i nie mają tego samego mechanizmu dla "konkretnych" wersji opartych na sugestiach szablonów. Zobacz mój numer answer to a more generic question, aby uzyskać szczegółowe informacje.

Więc trzeba by spaść z powrotem do realizacji „bazy” funkcję Preprocesuj, i sprawdzić, czy jest wywoływana dla żądanego widzenia (i ewentualnie wyświetlaczu) w obrębie tej funkcji, z grubsza tak:

function [yourThemeName]_preprocess_views_view(&$vars) { 
    $view = $vars['view']; 
    if ('videos' == $view->name) { 
    // Add desired manipulations for all 'videos' views 
    if ('videos' == $view->current_display) { 
     // Add desired manipulations for the 'videos' display only 
    } 
    } 
} 

Możesz także dodać zachowanie, którego się spodziewałeś, implementując ogólną funkcję preprocesu, która próbuje wywoływać określone wersje, sprawdzając funkcje o poprawnej nazwie - patrz na przykład koniec końcówki this article - ale to wprowadza całkiem sporo narzutów przetwarzania i ma sens tylko, jeśli potrzebujesz wielu funkcji przetwarzania wstępnego dla wielu widoków.

Istnieje więcej "podstawowych" funkcji przetwarzania wstępnego dla każdego typu widoku, które można zaimplementować bezpośrednio - zobacz listę template_preprocess_views_view_* w "views/theme/theme.inc" dla dostępnych opcji.

Jako zasada podstawowa, zawsze gdy istnieje funkcja template_preprocess_* dla szablonu, można również zastosować odpowiednią funkcję yourThemeOrModuleName_preprocess_*. Jeśli potrzebujesz manipulować szablonami w oparciu o sugestie nazw szablonów, musisz znaleźć "podstawową" nazwę funkcji preprocesu, zaimplementować ją i sprawdzić w tym przypadku konkretny przypadek (jak w przypadku określonego widoku, jak w powyższym przykładzie).

+2

Wow !!! dziękuję bardzo za tak jasną i szczegółową odpowiedź. Nie mogę wyrazić, jak bardzo doceniam wysiłek, który przyszedłeś, aby pomóc komuś, kogo nawet nie znasz. I mogę potwierdzić twoją odpowiedź jest w 100% poprawna !! przetestowany i działający !! Jeszcze raz dziękuję @Henrik Opel – Cybercampbell

+0

Dla przyszłych czytelników Twojej fantastycznej odpowiedzi, chciałem zaznaczyć, że jest to konieczne tylko na samym początku z powodu znaczącego błędu w rdzeniu Drupala 7. Sprawdź ten problem, aby uzyskać więcej informacji: http://drupal.org/node/939462 – CoreDumpError