Добавить класс в тело drupal

Как я могу добавить идентификатор термина всех терминов, связанных с узлом, в этот класс тела узла на сайте drupal?

Например, узел с именем stackoverflow помечен четырьмя терминами.

term1
term2
term3
term4
term5

Я хочу добавить их в класс тела узла ...

article-term-(term1tid) 
article-term-(term2tid)
article-term-(term3tid) 
article-term-(term4tid)
article-term-(term5tid)

Это страницы, на которых я хочу изменить имена классов:

вы имеете в виду 5 терминов, верно?

mast3rd3mon 10.04.2018 14:31

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

leymannx 10.04.2018 19:19
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Разработка Drupal и AngularJS: Идеальное сочетание для вашей веб-стратегии
Разработка Drupal и AngularJS: Идеальное сочетание для вашей веб-стратегии
Один опытный веб-разработчик назвал комбинацию Drupal и AngularJS "сочетанием, созданным на небесах". Почему так? Потому что вместе они могут создать...
2
2
735
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте использовать template_preprocess_html ()

это находится в файле template.php вашей темы:

YOURTHEMENAME_preprocess_html(&$variables) {
  $term_id = arg(1); // For example, or use some &drupal_static() to store a value while preprocessing from module
  $variables['classes_array'][] = 'article-term-' . $term_id;
}

Итак, как вы можете видеть, вы должны сначала изменить template_ на ваше имя_элемента_

Как уже указывал @ P1ratRuleZZZ, template_preprocess_html (реализованный из файла template.php вашей подтемы) - это функция для добавления классов тела.

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

Замените MYTHEME и field_MYFIELD своими именами.

/**
 * Implements template_preprocess_html().
 */
function MYTHEME_preprocess_html(&$variables) {

  // Get the node.
  if ($node = menu_get_object()) {

    // Check node type.
    if ($node->type === 'article') {

      // Get taxonomy terms.
      $terms = field_get_items('node', $node, 'field_MYFIELD');

      foreach ($terms as $term) {
        // Add body class.
        $variables['classes_array'][] = 'article-term-' . $term['tid'];
      }
    }        
  }
}

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

Sadegh Pandlo 11.04.2018 12:25
Ответ принят как подходящий

Код leymannx действительно полный и прекрасный.

но он не содержит всех членов узла.

Я сам пишу этот код и хочу, чтобы он был вам полезен.

function YOURTHEME_preprocess_html(&$variables) {

    if (arg(0) == 'node' && is_numeric(arg(1))) {
        $node    = node_load(arg(1));
        $results = stackoverflow_taxonomy_node_get_terms($node);
        if (is_array($results)) {
            foreach ($results as $item) {
                $variables['classes_array'][] = "article-term-" . $item->tid;
            }
        }
    }

}

Существует функция с именем "" stackoverflow_taxonomy_node_get_terms "", которая возвращает все термины, прикрепленные к узлу.

function stackoverflow_taxonomy_node_get_terms($node, $key = 'tid'){
    static $terms;
    if (!isset($terms[$node->vid][$key])) {
        $query   = db_select('taxonomy_index', 'r');
        $t_alias = $query->join('taxonomy_term_data', 't', 'r.tid = t.tid');
        $v_alias = $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid');
        $query->fields($t_alias);
        $query->condition("r.nid", $node->nid);
        $result                  = $query->execute();
        $terms[$node->vid][$key] = array();
        foreach ($result as $term) {
            $terms[$node->vid][$key][$term->$key] = $term;
        }
    }
    return $terms[$node->vid][$key];
}

Я бы хотел, чтобы этот код был лучшим.

напишите все эти коды в файле template.php вашей темы.

если вы хотите, чтобы только некоторые узлы имели имя класса, добавьте замену этой части кода.

> if (arg(0) == 'node' && is_numeric(arg(1)) && ( arg(1)==X || arg(1)==Y
> )  ) {

Отличная работа! Пожалуйста, посмотрите drupal.org/docs/develop/standards и исправьте отступ (только два пробела).

leymannx 11.04.2018 12:48

Другие вопросы по теме