Постановка задачи
Необходимо по-разному оформить ноду в зависимости от значения одного из ее полей. Такая задача может возникнуть, например, для страницы товара каталога, когда на него назначена скидка или он является новинкой, и необходимо выделить цену цветом, перечеркнуть поле старой цены и т.д.
Решение
Столкнувшись с данной задачей, я не стал добавлять класс в шаблоне ноды (вообще стараюсь не плодить в теме много шаблонов), а воспользовался функцией template_preprocess_node. Сразу привожу код:
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'];
}
}
Добрый день. Спасибо за
Добрый день. Спасибо за инструкцию. Только есть вопрос, какой собственно класс добавляется к ноде? все сделал по инструкции, но так и не понял какой класс добавляется в зависимости от выбора значения поля.
Здравствуйте, прочитайте
Здравствуйте, прочитайте внимательно текст статьи после блока кода. Вам нужно создать поле типа Список с опциями в виде ключ|значение, тогда в качестве дополнительного класса будет ключ выбранного значения в этом поле у конкретной ноды.