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

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

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

  • Существует ли соглашение о присвоении имен для создания функции препроцессора для определенной темы? Например, если у меня есть названный шаблон поля CCK content-field-field_transmission_make_model.tpl, как я назвал бы функцию препроцессора?
  • Я могу использовать шаблонные функции препроцессора для шаблонов узла, шаблонов поля CCK и шаблонов Представлений? У них есть различные методы изменения переменных шаблона или добавления новых?
36
задан Steffen Opel 22 March 2010 в 11:37
поделиться

1 ответ

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


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

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

{{1} }

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

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

themeName_preprocess_page (& $ переменных)

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

Ваш текущий пример является одним из таких случаев, поскольку 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 должно было измениться (все записи верхнего уровня в массиве $ variables будут преобразованы в отдельные переменные для файла шаблона, названные в честь индекса массива).


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

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

Похожие вопросы: