Подтвердить что ты не робот

Как использовать функции препроцессора для моих собственных шаблонов?

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

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

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

Ответ 1

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


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

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

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

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

themeName_preprocess_page(&$variables)

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

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


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

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

Ответ 2

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

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