Drupal → Темизация полей в Drupal 7

07.04.2011

Для темизации поля, нужно скопировать файл modules/field/theme/field.tpl.php в папку templates вашей темы и дать ему новое имя согласно одному из шаблонов:

  • field--FIELD-TYPE.tpl.php — шаблон будет применён ко всем полям типа FIELD_TYPE. Например, чтобы темизировать все поля типа Image, нужно создать шаблон с именем field--image.php.

  • field--FIELD-NAME.tpl.php — шаблон будет применён к полю с именем FIELD_NAME. Например, чтобы темизировать поле с именем field_images, нужно создать шаблон с именем field--field-images.tpl.php.

  • field--BUNDLE.tpl.php — шаблон будет применён ко всем полям добавленных к сущности с типом BUNDLE. Например, чтобы темизировать все поля в материале типа page, нужно создать шаблон с именем field--page.tpl.php.

  • field--FIELD-NAME--BUNDLE.tpl.php — шаблон будет применён только к полю FIELD_NAME, которое добавлено к сущности с типом BUNDLE. Например, чтобы темизировать поле field_images в материале типа page, нужно создать шаблон с именем field--field-images--page.tpl.php.

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

Видео (смотреть с конца третьей минуты):

[video:http://www.youtube.com/watch?v=sxZQqgvJk3s]

Написанное актуально для
Drupal 7
Похожие записи

Комментарии

Шаблон поля обычно содержит всего несколько строчек. Поэтому такой код удобней оформить в виде theme функции в template.php, чтобы не делать лишних "инклудов".

в смысле переопределить в hook_theme и написать свои функции?

Нет, hook_theme не нужен.
Например, для темизации поля с именем field_images достаточно в template.php добавить такую функцию

function mytheme_field__field_image($vars) {
  // Тут код
}

Имена этих функций похожи на имена соответствующих шаблонов. Только вместо дефисов нужно подставлять нижнее подчеркивание.

В примере букву s в имя функции надо добавить.
mytheme_field__field_images

Кстати, это работает для всех шаблонов, даже page.tpl.php при необходимости можно заменить, на theme_page().
Хотя тут конечно, надо не перестараться. Если тема делается для того, кто далёк от php, то использовать шаблоны предпочтительней, хотя бы потому, что они не так устрашающе выглядят, как template.php.

Никита
11.10.2012, 23:19

Хочу еще добавить - если вам надо темизировать не вывод поля, а элемент формы, то похоже единственный способ - использовать хук _form_element

function mytheme_form_element($vars) { 
  if ($vars['element']['#type'] == 'managed_file' && $vars['element']['#field_name'] == 'field_personal_photo') {
    krumo($vars['element']); die;
  }
}
Алексей
10.12.2013, 15:21

Спасибо, а можно ли темизировать поле body? какой нужен шаблон? Или как функкцию в template.php для этого назвать?

Алексей
12.12.2013, 16:34

ПО поводу темизации body - все решилось само собой. в 4-й Омеге это не сделаешь, там файл field.tpl.php не используется для темизации body, данные для этого поля берутся из файла field.theme.inc.этим объясняется интересная особенность классов для body - в их именах вместо дефисов - подчеркивания.

Артур
22.06.2014, 07:29

Как добавить в тегу img свой класс?
Нашел такой пример.

<?php
$class = array();
if ( !empty($content['field_image']) ) {
  if ( !empty($content['field_image']['#attributes']) ) {
    if ( !empty($content['field_image']['#attributes']['class']) ) {
      $c = $content['field_image']['#attributes']['class'];
      if ( is_array($c) ) {
        $class = $c;
      }
      else {
         $class = explode(' ', $c);
      }
    }
  }
  $class[] = 'your_class';
  $content['field_image']['#attributes']['class'] = $class;
}

Или есть вариант более правильный?

Артур
22.06.2014, 07:36

Или как вариант просто перед выводом img добавить
$item['field_image']['#attributes']['class'][0] = 'your_class'

Получим

<?php foreach ($items as $delta => $item) : ?>
       $item['field_image']['#attributes']['class'][0] = 'your_class';
      <div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"
       <?php print $item_attributes[$delta]; ?>><?php print render($item); ?></div>
<?php endforeach; ?>
Артур
22.06.2014, 09:33

Спасибо, супер! Модуль это хорошо, если надо много и часто выполнять действия, но ради установки одного класса ставить модуль, на мой взгляд это не рационально :-)

Подскажите!
Как добавить свой класс для тег

<a>

поля image?

Гость
07.10.2015, 19:03

Нужно программно создать поле типа " Ссылка на термин"
Не знаю в какой теме спросить, спрошу тут. я программно создаю словари таксономии и мне нужно, что бы при создании словаря я типе метериала создавалось поле типа " ссылка на термин".
как создать поле я нашел в гугле но как создать именно "ссылку на термин" не нашел.
спасите!

Гость
06.01.2016, 12:23

А можно ли сделать шаблон поля который использовался только при определенных условиях? Скажем вид ноды "полный" шаблон вывода один, вид вывода "анонс" используем другой шаблон для поля.

Добавить комментарий