Drupal 7 preprocess_views не работает

В моем template.php файле Drupal 7 есть следующий код:

 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

есть идеи, почему это не работает?


person Cybercampbell    schedule 03.05.2012    source источник
comment
Двойник __videos__videos просто опечатка? Если название просмотров - «видео», я бы ожидал [yourThemeName]_preprocess_views_view__videos(&$vars).   -  person Henrik Opel    schedule 04.05.2012
comment
Я предположил, что это было потому, что имя дисплея было видео, а в данном случае имя машины было видео. Перечисленные выше файлы шаблонов работают отлично, и это видео - видео. Я все равно попробую удалить один на всякий случай. Спасибо   -  person Cybercampbell    schedule 04.05.2012
comment
Погодите, я думаю, что я в чем-то ошибся, так что я думаю, это тоже не будет работать только с одним '__videos'. Перепроверим и добавлю ответ.   -  person Henrik Opel    schedule 04.05.2012


Ответы (1)


Вероятно, проблема в том, что вы пытаетесь реализовать функцию предварительной обработки на основе того же шаблона именования, который используется для переопределений шаблонов. Но функции предварительной обработки немного отличаются тем, что по умолчанию они могут быть реализованы только на основе имени «базового» шаблона и не имеют того же механизма для «конкретных» версий, основанных на предложениях шаблонов. См. Мой ответ на дополнительные общий вопрос для получения более подробной информации.

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

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

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

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

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

person Henrik Opel    schedule 04.05.2012
comment
Ух ты!!! Большое спасибо за такой ясный и подробный ответ. Не могу выразить, насколько я ценю ваши усилия, чтобы помочь кому-то, кого вы даже не знаете. И я могу подтвердить, что ваш ответ на 100% правильный !! проверено и работает !! Еще раз спасибо @Henrik Opel - person Cybercampbell; 04.05.2012
comment
Будущим читателям вашего фантастического ответа я хотел бы указать, что это необходимо только в первую очередь из-за значительной ошибки в ядре Drupal 7. Ознакомьтесь с этой проблемой для получения дополнительных сведений: drupal.org/node/939462 - person coredumperror; 28.09.2012