web-gelistirme-sc.com

Ana terimi hiyerarşili bir sınıflandırmada nasıl edinebilirim?

Ben "devlet >> ilçe" gibi terimler hiyerarşisinin bir parçası olan bir sınıflandırma terimi ile etiketlenmiş bir düğüm var.

Kullanıcı "ilçe" etiketlerinden birini seçtiğinden, ana terimin adını nasıl alabilirim?

5
Arosboro

Veritabanını kendiniz sorgulayabilir veya API işlevini kullanabilirsiniz: taxonomy_get_parents

Birkaç ebeveyniniz olabileceğinden, veritabanını kendiniz sorgulamak daha kolay olabilir:

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

Güncelleme - Neden yukarıdaki sorgunun Drupal 6 içinde akıllı olduğunu düşünüyorum

Bazıları (kiamlaluno) Drupal 6 içinde db_query İçin yukarıdaki argümanı kullanmanın yanlış olduğunu iddia eder.

Drupal 6'da db_query'yi üç şekilde kullanabilirsiniz:

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

Yukarıdakilerin hepsi aynı şeyi döndürür, bu yüzden her şeyi bir arada kullanarak fonksiyonel bir fark yoktur. O zaman neden sorabilirsiniz, bence sonuncuyu kullanmak akıllıca mı?

Drupal 7'nin nasıl çalıştığına bakarsanız göreceksiniz:

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

Drupal 7, özel bir şekilde biçimlendirilmiş sorgu bağımsız değişkenlerini gerektirir. Bu örnekte göremediğiniz şey, SQL'in de değiştirilmesi gerektiğidir. %d Gibi yer tutucuları kullanmak yerine :arg1 Gibi yer tutucuları kullanmanız gerekir. Bu nedenle, db_query kullanmanın 3 Drupal 6 yolunun ikincisi en ayrıntılı olsa da, Drupal 6 modülünüzü _'e yükseltmeniz gerektiğinde size çok fazla iş kazandıracaktır.Drupal 7. Hangi yılda ne yaptığınızı ve nedenini hatırlamadığınız bir yıl içinde gerçekleşebilir.

Ancak günün sonunda, her iki şekilde de iyi çalışacağından, kişisel tercihinizdir.

2
googletorp

taxonomy_get_parents () , sınıflandırma terimi için tüm üst terimleri bağımsız değişken olarak iletilen kimliğiyle döndürür.
İşlevden döndürülen değer, aşağıdaki yapıya sahip bir dizidir:

 dizi (
 'terim kimliği' => [sınıflandırma terimi nesnesi] 
) 

Sınıflandırma terimi nesnesi, "term_data" tablosunda bulunan alanların her biri için bir özellik içerir.

İşlevden kullanılan kod aslında aşağıdaki koddur.

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

Gördüğünüz gibi, argüman olarak geçirilen ana terimlerin üst terimlerini döndürmez. Bunun için aşağıdaki kodu çalıştıran taxonomy_get_parents_all () gerekir.

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

İşlev, hiyerarşideki tüm üst terimleri döndürür.

5
kiamlaluno