Вывод в node.tpl иерархии термина [Решено]

Главные вкладки

Аватар пользователя Drugan Drugan 7 октября 2009 в 11:33

Как в node.tpl прописать вывод термина с родительскими терминами? Есть иерархический словарь: Район - Населенный пункт - Улица. Нужно вывести в ноду всю иерархию.

Комментарии

Аватар пользователя Drugan Drugan 7 октября 2009 в 12:37

Сделал так, гуру подскажите, правильно?

<?php 
  $term_node 
taxonomy_node_get_terms_by_vocabulary($node,8);
  foreach (
$term_node as $val) {
    
$tid $val->tid;
  }; 
  
$parents taxonomy_get_parents_all($tid);
  
$parents array_reverse($parents);
  foreach (
$parents as $val) {
    echo 
$val->name ', ';
  }
?> 
Аватар пользователя Dock@drupal.org Dock@drupal.org 7 октября 2009 в 13:55

Я не гуру, но на мой взгляд должно быть так:

<?php
  $term_node = taxonomy_node_get_terms_by_vocabulary($node,8);
  foreach ($term_node as $val) {
    $tid = $val->tid;
   
    $parents = taxonomy_get_parents_all($tid);
    $parents = array_reverse($parents);
    foreach ($parents as $val) {
      echo $val->name . ' - ';
    }
  };
?>
Аватар пользователя kosilko kosilko 7 октября 2009 в 13:57

не совсем понятен цикл
foreach ($term_node as $val) {
$tid = $val->tid;
};
И зачем его гонять? Чтобы в $tid в результате попал всего лишь самый последний термин из массива? Вы вроде собирались выводить всю иерархию? А если уж вышло, что все-таки нужно получить последний элемент массива, то для этого есть простейшая функция end();
А что-бы узнать термины ноды например, проще обратиться к $node->taxonomy, минуя лишнее обращение к БД - ну это уже к вопросу о производительности.

Аватар пользователя Drugan Drugan 7 октября 2009 в 19:24

"kosilko" wrote:
не совсем понятен цикл
foreach ($term_node as $val) {
$tid = $val->tid;
};
И зачем его гонять? Чтобы в $tid в результате попал всего лишь самый последний термин из массива?

В этом цикле получаю tid термина, ведь taxonomy_node_get_terms_by_vocabulary возвращает массив, а не tid.

"kosilko" wrote:
А что-бы узнать термины ноды например, проще обратиться к $node->taxonomy, минуя лишнее обращение к БД - ну это уже к вопросу о производительности.

А как через $node->taxonomy получить tid термина из нужного словаря (ноде назначены термины из разных словарей)?

Вообще-то нужный результат я достиг, но хотелось бы, чтобы это было оптимальней по производительности.

Аватар пользователя Dock@drupal.org Dock@drupal.org 8 октября 2009 в 21:48

Если вам нужен один только элемент, то foreach ненужен, т.к. нет смысла пробегать по всем его элементам, все равно у вас в итоге в переменной будет последний элемент. Так не проще ли взять его сразу?:)

Аватар пользователя Drugan Drugan 9 октября 2009 в 7:19

Что - то у меня не получается напрямую получить tid. Пишу

$term_node = taxonomy_node_get_terms_by_vocabulary($node,8);
$tid = $term_node->tid;

Я в php не силен. Может нужно другую функцию использовать?

print_r ($term_node) выводит следующее:

Array ( [1866] => stdClass Object ( [tid] => 1866 [vid] => 8 [name] => 48 Стрелковой Бригады б-р [description] => [weight] => 0 ) )

Аватар пользователя Drugan Drugan 9 октября 2009 в 11:46

Или мы о разном, или я чего-то не догоняю. Разве end() в этом массиве ( [1866] => stdClass Object ( [tid] => 1866 [vid] => 8 [name] => 48 Стрелковой Бригады б-р [description] => [weight] => 0 ) ) переместит курсор на tid?

Аватар пользователя kosilko kosilko 9 октября 2009 в 13:21

"Drugan" wrote:
А как через $node->taxonomy получить tid термина из нужного словаря (ноде назначены термины из разных словарей)?

вы пробовали посмотреть внутрь массива $node, в частности $node->taxonomy ?

Аватар пользователя Dock@drupal.org Dock@drupal.org 9 октября 2009 в 21:03

Рекомендую прежде чем задавать вопросы по PHP, прочитать документацию. Я же дал ссылку. end() вернет последний элемент массива (объект), а потом надо взять поле этого объекта (tid).

Аватар пользователя Drugan Drugan 13 октября 2009 в 9:17

Спасибо за замечания. С их учетом сделал так:


<?php 
  
foreach ($node->taxonomy as $val) {
    
$term $val->tid;
    if (
$val->vid == 8) break;
  }
  
$parents taxonomy_get_parents_all($term);
  
$parents array_reverse($parents);
  foreach (
$parents as $val) {
    echo 
$val->name ', ';
  }
?> 

Теперь все правильно и оптимально в плане производительности?

Аватар пользователя Dock@drupal.org Dock@drupal.org 13 октября 2009 в 11:27

на мой взгляд нет:) Ладно, не буду мучить, вот код:

  $term_node = taxonomy_node_get_terms_by_vocabulary($node,8);
  if (!$term_node){
    $tid = end($term_node)->tid;
    $parents = taxonomy_get_parents_all($tid);
    $parents = array_reverse($parents);
    foreach ($parents as $val) {
      echo $val->name . ' - ';
    }
  }

Думаю как-то так будет оптимально.

Аватар пользователя Drugan Drugan 13 октября 2009 в 13:56

Я примерно так же сделал, но меня вот это:

"kosilko" wrote:
А что-бы узнать термины ноды например, проще обратиться к $node->taxonomy, минуя лишнее обращение к БД - ну это уже к вопросу о производительности.

подвигло действовать через node->taxonomy. Так все таки нужно избегать лишний раз к базе обращаться или нет?

Аватар пользователя kosilko kosilko 13 октября 2009 в 21:11

"Drugan" wrote:
Так все таки нужно избегать лишний раз к базе обращаться или нет?

Вызвав taxonomy_node_get_terms_by_vocabulary() в темизации мы повторяем действия ядра при формировании массива $node в начальной стадии. См. функцию taxonomy_nodeapi() в одноименном модуле - при загрузке ноды выполняется taxonomy_node_get_terms() с запросом в БД - по сути то же самое, только без фильтрации по номеру словаря.