将类添加到drupal主体

将类添加到drupal主体,drupal,drupal-7,Drupal,Drupal 7,如何将与节点相关的所有术语的术语id添加到drupal站点中的节点主体类中 例如,名为stackoverflow的节点用四个术语标记 term1 term2 term3 term4 term5 我想将这些类添加到节点体类 article-term-(term1tid) article-term-(term2tid) article-term-(term3tid) article-term-(term4tid) article-term-(term5tid) 以下是我要更改其类名的页面:

如何将与节点相关的所有术语的术语id添加到drupal站点中的节点主体类中

例如,名为
stackoverflow
的节点用四个术语标记

term1
term2
term3
term4
term5
我想将这些类添加到节点体类

article-term-(term1tid) 
article-term-(term2tid)
article-term-(term3tid) 
article-term-(term4tid)
article-term-(term5tid)
以下是我要更改其类名的页面:


尝试使用模板\u预处理\u 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;
}

因此,正如@P1ratRuleZZZ已经指出的(从子主题的
template.php
文件实现),您应该首先将template_uuu更改为主题名

,这是添加主体类的函数

问题是,在这个函数中,您需要首先加载实际的节点对象,然后获取该术语引用字段的值,最后将它们作为类添加到body标记中

myteme
field\u 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'];
      }
    }        
  }
}

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\u taxonomy\u node\u get\u 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
> )  ) {

你是说5个术语,对吗?最后一个示例与其他示例不同,因为它是一个术语页面。你需要什么样的身体素质?它应该从哪里来?这些术语有字段吗?这段代码非常棒,但是我想要一段代码来处理特定节点的所有术语。非常棒!请查看并修复缩进(仅两个空格)。