СРОчно нужна помощь - вывод родителя термина в node.tpl.php

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

Аватар пользователя lobster1 lobster1 3 октября 2010 в 0:05

Доброго времени суток Smile

Ребята, нужна помощь с выводом родителя термина таксономии.
Есть словарь "Книги"
есть термин "Веб технологии"
и есть его дочерний термин "Друпал"

путем написания куска php кода, пытаюсь вывести РОДИТЕЛЯ термина "Друпал"
верчусь около кода:
id словаря задается руками.

<?php

$terms 

taxonomy_node_get_terms($node);
 
$parents taxonomy_get_parents_all($terms->tid);
 foreach (
$parents as $parent){
 if(
$parent->vid ==8){
    print 
$parents->name;
}
}

?>

php совсем не знаю, сталкиваюсь впервый раз..
помогите, пожалуйста досообразить код

Комментарии

Аватар пользователя gorr gorr 3 октября 2010 в 14:33

<?php
$vid = 8;
$terms = taxonomy_node_get_terms_by_vocabulary($node, $vid);
$parents = taxonomy_get_parents(key($terms));//родители первого встреченного термина из словаря 8
$parent = array_shift($parents);
print $parent->name;
?>

Аватар пользователя lobster1 lobster1 5 октября 2010 в 23:35

Огромное спасибо, как раз то чего я и хотел добиться!
--
Осталась еще одна задача, в которой я застрял,прошу еще помощи..

с помошью кода:

<?php
$terms 
taxonomy_node_get_terms($node);
foreach(
$terms as $term){
if(
$term->vid==8){
$node_field[0]['value'] = $term->name;  // использую модуль для CCK (computed field), чтобы все 
                                        //выводить чрз $content и легко менять позиции 
                                        //полей в админке
}
}

?>

вывожу термины словаря "8" присвоенные ноде..
выводить необходимо только один, самый последний(глубокий) в иерархии термин,
но проблема в том что на сайте используется hierarhical_select модуль, с помошью которого ноды закидываются не только в самый посл. термин а и в его родителя, что собственно нужно и откл. нельзя..
пытаюсь обойти как то этот момент, но пока не получилось:
пытался дописать в if'e

<?php
( ... && $term->parent !== 0// выводить только термин у которого есть родитель
?>

но, увы, что то не вышло, толи знаний пхп нехватает, толи еще что..
прошу помочь достичь нужного эффекта, еще раз спасибо Smile

Аватар пользователя Orion76 Orion76 6 октября 2010 в 2:10

функция taxonomy_node_get_terms($node) вроде только выводит термины,ассоциированные с типом материала ноды?
Чет опять не понятна задача...

Аватар пользователя gorr gorr 6 октября 2010 в 10:56

А Вы выведите сначала объекты терминов на экран, чтобы посмотреть все свойства терминов и какое условие добавить с помощью print_r():
<?php
$terms = taxonomy_node_get_terms($node);
print_r($terms);
?>

Аватар пользователя lobster1 lobster1 6 октября 2010 в 19:27

"gorr" wrote:
А Вы выведите сначала объекты терминов на экран, чтобы посмотреть все свойства терминов и какое условие добавить с помощью print_r():

интересно! сейчас попытаюсь..

"orion76" wrote:
функция taxonomy_node_get_terms($node) вроде только выводит термины,ассоциированные с типом материала ноды?
Чет опять не понятна задача...

Именно, а задача в том чтобы вывести в полном материале только один, нужный термин!

Словарь
- термин 1
-- термин 1.1
- термин 2
-- термин 2.1
...
вывести один термин 2.1, который присвоен ноде (taxonomy_node_get_terms($node))
с тем условием что ноде присвоен и термин 2, т.е. его , по сути, нужно отбросить из вывода

Аватар пользователя lobster1 lobster1 6 октября 2010 в 19:45

"gorr" wrote:
А Вы выведите сначала объекты терминов на экран, чтобы посмотреть все свойства терминов и какое условие добавить с помощью print_r():

Вывел, а там и близко ничего нету о родителях Sad
лишь - stdClass Object ( [tid] => 48 [vid] => 8 [name] => Кировский [description] => [weight] => 0 )
а как еще можно "отфильтровать"?

Аватар пользователя Orion76 Orion76 6 октября 2010 в 22:42

Блин сами запутались...и меня запутали...
Обыскался функции, которая термины ноды выводит...
А нет такой функции, потому что она не нужна...

посмотрите при помощи r_print переменную $node...
Обратите внимание на поле объекта 'taxonomy'....

Аватар пользователя lobster1 lobster1 6 октября 2010 в 23:14

посмотрел

Array ( [9] => stdClass Object ( [tid] => 9 [vid] => 4 [name] => Земельные участки [description] => [weight] => 7 ) [89] => stdClass Object ( [tid] => 89 [vid] => 6 [name] => сдать [description] => Снимем для наших клиентов: [weight] => 0 ) [69] => stdClass Object ( [tid] => 69 [vid] => 8 [name] => Оконешниковский [description] => [weight] => 0 ) [43] => stdClass Object ( [tid] => 43 [vid] => 8 [name] => Омская область [description] => [weight] => 0 ) )

нужно выводить только термины(район), т.е. по данной ноде из словаря 8 нужно чтобы был только "Оконешниковский", а область не выводилась, не вижу уникально отличия по которому можно было бы отбросить!

Аватар пользователя Orion76 Orion76 7 октября 2010 в 0:06

уникальное отличие в данном случае - родитель
находите для каждого термина из 8-го словаря родителя, если он присутствует в массиве $node->taxonomy
то удаляем его.
В итоге остануться только термины, у которых нет "детей".
да...
можно еще проще..:

foreach($node->taxonomy as $key=>$value){
   if($value['vid']==8){
      $children=taxonomy_get_children($value['tid']);
      if(!count($chidren)){
         print l($value['name'],"taxonomy/$value['vid']/$value['tid']");
      }
   }
}

как то так...

Аватар пользователя lobster1 lobster1 7 октября 2010 в 0:31

ааа taxonomy_get_children()
идею понял, здорово!
только не могу разобраться с пхп, ругается:

«Fatal error: Cannot use object of type stdClass as array in D:\wamp\www\sbr.localhost\sites\all\themes\sbr\node-robject.tpl.php on line 67
»

<?php
foreach($node->taxonomy as $key=>$value){
   if(
$value['vid']==8){                             // <-- line #67
      
$children=taxonomy_get_children($value['tid']);
      if(!
count($chidren)){
         print 
$value['name'];
      }
   }
}
?>
Аватар пользователя Orion76 Orion76 7 октября 2010 в 2:16

АААА!!! Все правильно...извиняюсь..
Он говорит, типа не могу использовать объект как массив..
$value - это же не массив, а объект...

foreach($node->taxonomy as $key=>$value){
   if($value['vid']==8){
      $children=taxonomy_get_children($value->tid);
      if(!count($chidren)){
         print l($value->name,"taxonomy/$value->vid/$value->tid");
      }
   }
}
Аватар пользователя lobster1 lobster1 7 октября 2010 в 18:59

Вообщем вывожу вот так:

<?php
foreach($node->taxonomy as $key=>$value){
   if(
$value->vid==8){
      
$children=taxonomy_get_children($value->tid);
      if(!
$children){
      print 
$value->name;}
     
// if(count($chidren)){
        // print l($value->name,"taxonomy/$value->vid/$value->tid");
      //}
   
}
}
?>

не знаю правильно ли, но вроде показывает что надо Smile
спасибо!