2012-05-03 3 views
6

У меня есть следующий код в моем Drupal 7 template.php файл:Drupal 7 preprocess_views не работает

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')); 
    } 

Мне нужно, чтобы загрузить эти CSS и JS файл только тогда, когда отображается этот вид.

имя дисплей мнение: Videos вид Имя машины является: videos

и переопределение файлы:

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

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

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

какие-либо идеи, почему это не работает?

+0

Является ли двойная '__videos__videos' просто опечаткой? Если имя вида - «видео», я бы ожидал '[yourThemeName] _preprocess_views_view__videos (& $ vars)'. –

+0

Я посчитал, что это было потому, что имя disply было видео, и в этом случае имя машины было видео. Файлы шаблонов, перечисленные выше, отлично работают, и это видео - видео. В любом случае, я попытаюсь удалить его. Спасибо – Cybercampbell

+1

Держись, я думаю, что что-то ошибся, поэтому я думаю, что это не будет * работать только с одним «__videos». Повторно проверит и добавит ответ. –

ответ

21

Возможно, проблема заключается в попытке реализовать функцию препроцесса на основе того же шаблона именования, который используется для переопределения шаблона. Но функции препроцесса по-разному отличаются друг от друга, они могут быть реализованы только на основе имени базового шаблона и не имеют того же механизма для «конкретных» версий на основе предложений шаблонов. Подробности см. В моем answer to a more generic question.

Таким образом, вы должны были бы возвратиться к реализации «базовой» функции препроцессирования, и проверить, если он вызывается для нужного представления (и, возможно дисплея) в пределах этой функции, примерно так:

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

Вы можете также добавить поведение, которое вы ожидали, путем реализации общей функции препроцесса, которая пытается вызвать определенные версии, проверяя функции с собственным именем - например, в конце примера this article - но это вводит довольно определенные накладные расходы и будет только имеет смысл, если вам нужны специальные функции предварительного программирования для многих представлений.

Есть более «базовые» функции препроцесса для каждого типа просмотра, которые можно реализовать напрямую - см. Список template_preprocess_views_view_* в разделе «views/theme/theme.inc» для доступных опций.

В качестве базового правила, когда есть функция template_preprocess_* для шаблона, вы также можете реализовать соответствующую функцию yourThemeOrModuleName_preprocess_*. Если вам нужно манипулировать шаблонами на основе предложений имени шаблона, вам нужно найти имя функции «базового» препроцесса, реализовать это и проверить свой конкретный случай в этой функции (например, для конкретного представления, как в примере выше).

+2

Ничего себе !!! Большое вам спасибо за такой ясный и подробный ответ. Я не могу выразить, насколько я ценю усилия, которые вы предприняли, чтобы помочь кому-то, кого вы даже не знаете. И я могу подтвердить, что ваш ответ на 100% правильный! испытал и работал !! Еще раз спасибо @Henrik Opel – Cybercampbell

+0

Для будущих читателей вашего фантастического ответа я хотел бы указать, что это необходимо только в первую очередь из-за значительной ошибки в ядре Drupal 7. Ознакомьтесь с этой проблемой для получения дополнительной информации: http://drupal.org/node/939462 – CoreDumpError