Как использовать функции препроцессора темы для моих собственных шаблонов? - PullRequest
36 голосов
/ 05 марта 2010

У меня есть несколько файлов .tpl.php для узлов, полей CCK и тем для Views. Эти файлы шаблонов содержат много логики для перемещения, удаления ссылок, создания новых ссылок и т. Д. Я понимаю, что это плохая разработка, а не «Путь Drupal».

Если я правильно понимаю, «Путь Drupal» заключается в использовании функций препроцессора в вашем файле template.php для управления переменными и добавления новых переменных. Несколько вопросов об этом:

  • Существует ли соглашение об именах для создания функции препроцессора для определенной темы? Например, если у меня есть шаблон поля CCK с именем content-field-field_transmission_make_model.tpl, как бы я назвал функцию препроцессора?
  • Можно ли использовать функции препроцессора шаблонов для шаблонов узлов, шаблонов полей CCK и шаблонов представлений? Есть ли у них разные методы изменения шаблонных переменных или добавления новых?

Ответы [ 2 ]

56 голосов
/ 05 марта 2010

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


Что касается соглашения об именах, это обычно довольно просто, но для вашего текущего примера есть одна загвоздка (см. Ниже):

Подпись функций предварительной обработки должна быть

[yourModuleName|yourThemeName]_preprocess_[themeFunctionName](&$variables)

, поэтому реализация шаблона для шаблона страницы в файле theme.php приведет к

themeName_preprocess_page(&$variables)

В большинстве случаев именем функции темы будет имя файла * .tpl.php без окончания .tpl.php и с подчеркиванием вместо дефисов. Но есть ловушка , если файл шаблона выбирается на основе предложений шаблона , поскольку функция предварительной обработки может быть реализована только для базового имени, но не для дополнительных предложений! (Предложения по альтернативным файлам шаблонов добавляются в функции предварительной обработки.)

Ваш текущий пример - один из таких случаев, так как content-field-field_transmission_make_model.tpl.php является таким предложением, с базовым именем content-field.tpl.php и соответствующей функцией темы content_field. Таким образом, вам придется реализовать функцию препроцессора с именем yourThemeName_preprocess_content_field(&$variables), и в рамках этого проверить доступные записи в массиве $ variable, чтобы проверить, действительно ли вы вызваны для 'field_transmission_make_model', а не для совершенно другого поля CCK, например:

function yourThemeName_preprocess_content_field(&$variables) {
  // Are we called for the right field?
  if ('field_transmission_make_model' == $variables['field_name']) {
    // Yes, add/manipulate entries within the variables array
    $variables['new_entry'] = 'A useless new variable';
    $variables['label'] = 'A useless change of the existing label variable';
  }
}

(Примечание: непроверенный код, остерегайтесь опечаток)

После этого в вашем файле шаблона должна быть доступна новая переменная $new_entry, а содержимое переменной $label должно было измениться (все записи верхнего уровня в массиве $ variable будут превращены в отдельные переменные). для файла шаблона, названного в честь индекса массива).


Что касается вашего второго вопроса, базовое использование функций предварительной обработки одинаково для всех файлов шаблонов, но имейте в виду:

  • Функции предварительной обработки доступны только для вызовов тем, использующих файлы * .tpl.php, не для функций тем
  • Содержимое массива $ variable сильно варьируется в зависимости от тематики
  • Другие модули могут также реализовывать функции предварительной обработки, и они будут вызываться одна за другой, поэтому, если вы хотите изменить что-то, добавленное другим модулем, вы можете сделать это только в том случае, если ваша реализация вызывается после этого (что не будет проблемой в вашем случае, так как реализации внутри темы вызываются после всех реализаций в модулях - просто хочу отметить, что может быть много реализаций одновременно)
2 голосов
/ 21 января 2013

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

Вот видео, которое объясняет это подробно - http://buildamodule.com/video/drupal-theming-essentials-template-files-theme-function-overrides-and-preprocessing-functions-how-to-use-simple-preprocessing-functions

...