Как в node.tpl прописать вывод термина с родительскими терминами? Есть иерархический словарь: Район - Населенный пункт - Улица. Нужно вывести в ноду всю иерархию.
не совсем понятен цикл
foreach ($term_node as $val) {
$tid = $val->tid;
};
И зачем его гонять? Чтобы в $tid в результате попал всего лишь самый последний термин из массива? Вы вроде собирались выводить всю иерархию? А если уж вышло, что все-таки нужно получить последний элемент массива, то для этого есть простейшая функция end();
А что-бы узнать термины ноды например, проще обратиться к $node->taxonomy, минуя лишнее обращение к БД - ну это уже к вопросу о производительности.
не совсем понятен цикл
foreach ($term_node as $val) {
$tid = $val->tid;
};
И зачем его гонять? Чтобы в $tid в результате попал всего лишь самый последний термин из массива?
В этом цикле получаю tid термина, ведь taxonomy_node_get_terms_by_vocabulary возвращает массив, а не tid.
"kosilko" wrote:
А что-бы узнать термины ноды например, проще обратиться к $node->taxonomy, минуя лишнее обращение к БД - ну это уже к вопросу о производительности.
А как через $node->taxonomy получить tid термина из нужного словаря (ноде назначены термины из разных словарей)?
Вообще-то нужный результат я достиг, но хотелось бы, чтобы это было оптимальней по производительности.
Если вам нужен один только элемент, то foreach ненужен, т.к. нет смысла пробегать по всем его элементам, все равно у вас в итоге в переменной будет последний элемент. Так не проще ли взять его сразу?:)
Или мы о разном, или я чего-то не догоняю. Разве end() в этом массиве ( [1866] => stdClass Object ( [tid] => 1866 [vid] => 8 [name] => 48 Стрелковой Бригады б-р [description] => [weight] => 0 ) ) переместит курсор на tid?
Рекомендую прежде чем задавать вопросы по PHP, прочитать документацию. Я же дал ссылку. end() вернет последний элемент массива (объект), а потом надо взять поле этого объекта (tid).
Так все таки нужно избегать лишний раз к базе обращаться или нет?
Вызвав taxonomy_node_get_terms_by_vocabulary() в темизации мы повторяем действия ядра при формировании массива $node в начальной стадии. См. функцию taxonomy_nodeapi() в одноименном модуле - при загрузке ноды выполняется taxonomy_node_get_terms() с запросом в БД - по сути то же самое, только без фильтрации по номеру словаря.
Комментарии
Сделал так, гуру подскажите, правильно?
<?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 . ', ';
}
?>
Я не гуру, но на мой взгляд должно быть так:
$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 . ' - ';
}
};
?>
не совсем понятен цикл
foreach ($term_node as $val) {
$tid = $val->tid;
};
И зачем его гонять? Чтобы в $tid в результате попал всего лишь самый последний термин из массива? Вы вроде собирались выводить всю иерархию? А если уж вышло, что все-таки нужно получить последний элемент массива, то для этого есть простейшая функция end();
А что-бы узнать термины ноды например, проще обратиться к $node->taxonomy, минуя лишнее обращение к БД - ну это уже к вопросу о производительности.
В этом цикле получаю tid термина, ведь taxonomy_node_get_terms_by_vocabulary возвращает массив, а не tid.
А как через $node->taxonomy получить tid термина из нужного словаря (ноде назначены термины из разных словарей)?
Вообще-то нужный результат я достиг, но хотелось бы, чтобы это было оптимальней по производительности.
Если вам нужен один только элемент, то foreach ненужен, т.к. нет смысла пробегать по всем его элементам, все равно у вас в итоге в переменной будет последний элемент. Так не проще ли взять его сразу?:)
Что - то у меня не получается напрямую получить 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 ) )
http://tinyurl.com/yzuj8hj
Я добрый, поэтому даже подскажу функцию end.
Или мы о разном, или я чего-то не догоняю. Разве end() в этом массиве ( [1866] => stdClass Object ( [tid] => 1866 [vid] => 8 [name] => 48 Стрелковой Бригады б-р [description] => [weight] => 0 ) ) переместит курсор на tid?
вы пробовали посмотреть внутрь массива $node, в частности $node->taxonomy ?
Рекомендую прежде чем задавать вопросы по PHP, прочитать документацию. Я же дал ссылку. end() вернет последний элемент массива (объект), а потом надо взять поле этого объекта (tid).
Спасибо за замечания. С их учетом сделал так:
<?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 . ', ';
}
?>
Теперь все правильно и оптимально в плане производительности?
на мой взгляд нет:) Ладно, не буду мучить, вот код:
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 . ' - ';
}
}
Думаю как-то так будет оптимально.
Я примерно так же сделал, но меня вот это:
подвигло действовать через node->taxonomy. Так все таки нужно избегать лишний раз к базе обращаться или нет?
а да, вообще ваш вариант быстрее, соглашусь..:)
Вызвав taxonomy_node_get_terms_by_vocabulary() в темизации мы повторяем действия ядра при формировании массива $node в начальной стадии. См. функцию taxonomy_nodeapi() в одноименном модуле - при загрузке ноды выполняется taxonomy_node_get_terms() с запросом в БД - по сути то же самое, только без фильтрации по номеру словаря.
Подскажите, пожалуйста, как выглядит этот код для седьмой версии.