it-swarm-vi.com

Làm thế nào tôi có thể có được thuật ngữ cha mẹ trong phân loại học với một hệ thống phân cấp?

Tôi có một nút được gắn thẻ với thuật ngữ phân loại là một phần của hệ thống phân cấp các thuật ngữ như "bang >> quận".

Vì người dùng đã chọn một trong các thẻ "quận", làm cách nào tôi có thể nhận được tên của cụm từ gốc?

5
Arosboro

Bạn có thể tự truy vấn cơ sở dữ liệu hoặc bạn có thể sử dụng chức năng API: taxonomy_get_parents

Vì bạn có thể có một vài cha mẹ, việc truy vấn cơ sở dữ liệu sẽ dễ dàng hơn:

$tid = ? // the tid of the county term
$parent_tid = db_result(db_query("SELECT parent FROM {term_hierarchy} WHERE tid = %d;",
  array(':tid' => $tid)
));
$parent_term = taxonomy_get_term($parent_tid);

Cập nhật - Tại sao tôi nghĩ truy vấn trên là thông minh trong Drupal 6

Một số (kiamlaluno) sẽ cho rằng việc sử dụng đối số trên cho db_query Trong Drupal 6 là sai

Trong Drupal 6 Bạn có thể sử dụng db_query theo ba cách:

$query = db_query($sql, $arg1, $arg2, $arg3);
$query = db_query($sql, array($arg1, $arg2, $arg3));
$query = db_query($sql, array(':arg1' => $arg1, ':arg2' => $arg2, ':arg3' => $arg3));

Tất cả những điều trên sẽ trả lại cùng một thứ, vì vậy không có sự khác biệt về chức năng khi sử dụng một cái hơn. Tại sao sau đó bạn có thể hỏi, tôi có nghĩ là thông minh khi sử dụng cái cuối cùng không?

Nếu bạn nhìn vào cách Drupal 7, bạn sẽ thấy:

$query = db_query($sql, array(':arg1' => $arg1, ':arg2' => $arg2, ':arg3' => $arg3));

Drupal 7 yêu cầu các đối số truy vấn được định dạng theo một cách đặc biệt. Điều bạn không thể thấy trong ví dụ này là SQL cũng cần phải được thay đổi. Thay vì sử dụng trình giữ chỗ như %d, Bạn cần sử dụng trình giữ chỗ như :arg1. Vì vậy, trong khi cách thứ ba trong 3 Drupal 6 cách sử dụng db_query là dài dòng nhất, nó sẽ giúp bạn tiết kiệm rất nhiều công việc, nếu bạn cần nâng cấp mô-đun Drupal 6 của mình lên Drupal 7. Điều đó có thể xảy ra trong một năm, nơi bạn không nhớ những gì bạn đang làm và tại sao.

Nhưng vào cuối ngày, đó chỉ là sở thích cá nhân, vì một trong hai cách sẽ hoạt động tốt.

2
googletorp

taxonomy_get_parents () trả về tất cả các điều khoản gốc cho thuật ngữ phân loại với ID được truyền dưới dạng đối số.
[.__.] Giá trị được trả về từ hàm là một mảng có cấu trúc sau:

[.___.] mảng ([.___

Đối tượng thuật ngữ phân loại chứa một thuộc tính cho mỗi trường có trong bảng "term_data".

Mã được sử dụng từ hàm về cơ bản là mã sau đây.

$result = db_query(db_rewrite_sql('SELECT t.tid, t.* FROM {term_data} t INNER JOIN {term_hierarchy} h ON h.parent = t.tid WHERE h.tid = %d ORDER BY weight, name', 't', 'tid'), $tid);
$parents = array();
while ($parent = db_fetch_object($result)) {
  $parents[$parent->$key] = $parent;
}

Như bạn thấy, nó không trả về các điều khoản gốc của các điều khoản cha mẹ của điều khoản được truyền dưới dạng đối số. Cho rằng bạn cần taxonomy_get_parents_all () , thực thi đoạn mã sau.

  if ($tid) {
    $parents[] = taxonomy_get_term($tid);
    $n = 0;
    while ($parent = taxonomy_get_parents($parents[$n]->tid)) {
      $parents = array_merge($parents, $parent);
      $n++;
    }
  }

Hàm trả về tất cả các thuật ngữ cha trong hệ thống phân cấp.

5
kiamlaluno