Làm cách nào để có được danh sách tất cả các thuật ngữ phân loại được gán cho một nút?


13

Tôi có một nút và muốn nhận tất cả các thuật ngữ phân loại được gán cho nút.

Trong drupal 6 tôi có thể sử dụng $node->taxonomyvà các taxonomy_*chức năng nhưng chúng không tồn tại trong drupal 7.

Câu trả lời:


21

Các thuật ngữ phân loại được triển khai trong các trường trong Drupal 7. Giả sử bạn đã xác định trường phân loại có tên là trường_cách cho loại nội dung của mình, bạn có thể truy cập dưới dạng:

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

Nếu bạn không có quyền truy cập vào tên trường, có lẽ cách dễ nhất cho các nút là truy vấn trực tiếp cơ sở dữ liệu:

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

Mặc dù vậy, hãy ghi nhớ rằng bạn có thể sẽ xử lý một mớ thuật ngữ từ các từ vựng khác nhau nếu bạn có nhiều hơn một lĩnh vực phân loại.


Nếu tôi không biết tên trường phân loại thì sao? Tên sẽ khác nhau giữa các loại nội dung và tôi muốn nhận tất cả các điều khoản cho bất kỳ nút nào.
Rwky

1
Đã thêm một phương thức nếu bạn không biết tên trường.
keithm

4
Đặc biệt trong phiên bản thứ hai, bạn có thể sử dụng taxonomy_term_load_multiple($results->fetchCol());để tải các thuật ngữ trong một truy vấn duy nhất.
Berdir

1
Ồ, và bạn có thể sử dụng field_get_items('node', $node, 'field_category')để có được các trường trong ngôn ngữ chính xác.
Berdir

Lưu ý chọn từ kỹ thuật taxonomy_index chỉ hoạt động với các nút được xuất bản. Bảng đó không được duy trì cho nội dung chưa được công bố.
Dave Cohen

2

Đây là một cách rất chung chung để lấy tất cả các thuật ngữ mà không chỉ định tên trường và không có 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;
}

Đối với người mới bắt đầu Drupal, tôi sẽ thêm if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}để có được nid$node = node_load($nid);để làm cho chức năng của bạn hoạt động.
Sébastien Gicquel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.