ฉันจะรับรายการเงื่อนไขอนุกรมวิธานทั้งหมดที่กำหนดให้กับโหนดได้อย่างไร


13

ฉันมีโหนดและต้องการรับเงื่อนไขอนุกรมวิธานทั้งหมดที่กำหนดให้กับโหนด

ใน drupal 6 ฉันสามารถใช้$node->taxonomyและtaxonomy_*ฟังก์ชั่นได้ แต่สิ่งเหล่านี้ไม่มีอยู่ใน drupal 7

คำตอบ:


21

เงื่อนไขการใช้งาน Taxonomy ถูกนำไปใช้ในฟิลด์ใน Drupal 7. สมมติว่าคุณได้กำหนดฟิลด์ taxonomy ชื่อ field_category สำหรับประเภทเนื้อหาของคุณคุณสามารถเข้าถึงได้ตาม:

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

หากคุณไม่มีสิทธิ์เข้าถึงชื่อฟิลด์วิธีที่ง่ายที่สุดสำหรับโหนดคือการสืบค้นฐานข้อมูลโดยตรง:

$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);
}

โปรดระลึกไว้เสมอว่าคุณอาจมีข้อตกลงที่ไม่ชัดเจนจากคำศัพท์ต่าง ๆ หากคุณมีมากกว่าหนึ่งสาขาอนุกรมวิธาน


ถ้าฉันไม่รู้ชื่อฟิลด์อนุกรมวิธาน? ชื่อจะแตกต่างกันระหว่างประเภทเนื้อหาและฉันต้องการรับเงื่อนไขทั้งหมดสำหรับโหนดใด ๆ
Rwky

1
เพิ่มวิธีการถ้าคุณไม่รู้ชื่อฟิลด์
keithm

4
โดยเฉพาะอย่างยิ่งในรุ่นที่สองคุณสามารถใช้taxonomy_term_load_multiple($results->fetchCol());เพื่อโหลดคำศัพท์ในแบบสอบถามเดียว
Berdir

1
โอ้และคุณสามารถใช้field_get_items('node', $node, 'field_category')เพื่อรับฟิลด์ในภาษาที่ถูกต้อง
Berdir

หมายเหตุเทคนิค select จาก taxonomy_index ใช้ได้กับโหนดที่เผยแพร่เท่านั้น ตารางนั้นไม่ได้รับการบำรุงรักษาสำหรับเนื้อหาที่ไม่ได้เผยแพร่
Dave Cohen

2

ต่อไปนี้เป็นวิธีทั่วไปในการรับเงื่อนไขทั้งหมดโดยไม่ระบุชื่อฟิลด์และไม่มี db_query:

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 ฉันจะเพิ่มif (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}เพื่อรับnidและ$node = node_load($nid);เพื่อให้การทำงานของคุณ
Sébastien Gicquel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.