Добавляем стилевой класс к ноде в зависимости от значения поля

29 января 2014 - 23:48

Постановка задачи

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

Решение

Столкнувшись с данной задачей, я не стал добавлять класс в шаблоне ноды (вообще стараюсь не плодить в теме много шаблонов), а воспользовался функцией template_preprocess_node. Сразу привожу код:

function TEMPLATE_preprocess_node(&$variables) {
  if ($variables['type'] == 'product' && $variables['view_mode'] == 'full') {
    if (isset($variables['field_action']['und'])) {
      $variables['classes_array'][] = $variables['field_action']['und'][0]['value'];
    }
  }
}

Пример сработает для ноды типа product, содержащей поле с машинным именем field_action - выбор из списка значений с ключами, например, "action" или "discount". Дополнительно проверяется режим отображения ноды - в данном случае нам необходимо добавить класс к ноде для режима "Содержимое полностью".

Помещаем данную функцию в template.php темы сайта, меняем TEMPLATE на машинное имя темы, очищаем кеш.

Данный метод предполагает, что в значении поля ноды будет использована латиница, т.е. если вам нужно подставлять туда значения из поля типа "Список (текст)", то нужно формировать варианты пар "ключ|значение" для этого поля в виде:

  • action|Акция
  • discount|Скидка

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

Комментарии

Добрый день, подскажите, в чем может быть ошибка, пытаюсь по аналогии добавить класс к полю в template_preprocess_field

function mytheme_preprocess_field(&$variables) {
  if (isset($variables['field_social_network']['und'])) {
    $variables['classes_array'][] = $variables['field_social_network']['und'][0]['value'];
  }
}
но класс не добавляется.

мое поле
["field_social_network"]=>
      array(1) {
        ["und"]=>
        array(1) {
          [0]=>
          array(1) {
            ["value"]=>
            string(2) "ok"

Буду признателен за помощь

Решил следующим образом:

function mytheme_preprocess_field(&$variables) {
  if($variables['element']['#field_name'] == 'field_social_network') {
    $variables['classes_array'][] = $variables['element']['#items'][0]['value'];
  }
}

Добрый день. Спасибо за инструкцию. Только есть вопрос, какой собственно класс добавляется к ноде? все сделал по инструкции, но так и не понял какой класс добавляется в зависимости от выбора значения поля.

Здравствуйте, прочитайте внимательно текст статьи после блока кода. Вам нужно создать поле типа Список с опциями в виде ключ|значение, тогда в качестве дополнительного класса будет ключ выбранного значения в этом поле у конкретной ноды.