Bir düğüme atanmış tüm sınıflandırma terimlerinin bir listesini nasıl alabilirim?


13

Bir düğüm var ve düğüme atanan tüm sınıflandırma terimleri almak istiyorum.

Drupal 6'da kullanabilirsiniz $node->taxonomyve taxonomy_*fonksiyonları ancak bunlar drupal 7'de mevcut değildir.

Yanıtlar:


21

Sınıflandırma terimleri Drupal 7'deki alanlara uygulanır. İçerik türünüz için field_category adında bir sınıflandırma alanı tanımladığınız varsayalım:

$language = 'und'; // or will be provided by some Drupal hooks
foreach ($node->field_category[$language] as $delta => $value) {
  $term = taxonomy_term_load($value['tid']);
}

Alan adına erişiminiz yoksa, düğümlerin muhtemelen en kolay yolu veritabanını doğrudan sorgulamaktır:

$results = db_query('SELECT tid FROM {taxonomy_index} WHERE nid = :nid', array(':nid' => $node->nid));
foreach ($results as $result) {
  $term = taxonomy_term_load($result->tid);
}

Ancak, birden fazla sınıflandırma alanınız varsa farklı kelime dağarcığından gelen terimlerle uğraşabileceğinizi unutmayın.


Sınıflandırma alanı adını bilmiyorsam ne olur? Adlar içerik türleri arasında farklılık gösterir ve herhangi bir düğüm için tüm terimleri almak istiyorum.
Rwky

1
Alan adını bilmiyorsanız bir yöntem eklendi.
keithm

4
Özellikle ikinci versiyonda, taxonomy_term_load_multiple($results->fetchCol());terimleri tek bir sorguya yüklemek için kullanabilirsiniz .
Berdir

1
Oh, ve field_get_items('node', $node, 'field_category')alanları doğru dilde almak için kullanabilirsiniz .
Berdir

Taxonomy_index tekniğinden seçimin yalnızca yayınlanan düğümlerle çalıştığını unutmayın. Bu tablo, yayınlanmamış içerik için korunmaz.
Dave Cohen

2

Alan adları belirtmeden ve db_query olmadan tüm terimleri almanın çok genel bir yolu:

function example_get_terms($node) {
  $terms = array();

  foreach (field_info_instances('node', $node->type) as $fieldname => $info) {
    foreach (field_get_items('node', $node, $fieldname) as $item) {
      if (is_array($item) && !empty($item['tid']) && $term = taxonomy_term_load($item['tid'])) {
        $terms[] = $term->name;
      }
    }
  }
  return $terms;
}

Drupal acemi için, işlevinizi işe if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}almak için nidve almak için ekleyeceğim $node = node_load($nid);.
Sébastien Gicquel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.