Как программно определить к какому словарю относится нода?

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

Аватар пользователя lexa74 lexa74 26 октября 2006 в 17:24

вобщем надо выводить разные блоки в зависимости от того к какому словарю относится публикация...
как-то можно в php-условии это прописать?

Комментарии

Аватар пользователя lexa74 lexa74 26 октября 2006 в 18:26

"taxonomy_node_get_terms($nid, ‘vid’);
возвращает массив результатов"

э... а как этим пользоваться?
что конкретно прописать если мне надо выводить если словарь называется "статьи"?

Аватар пользователя inc inc 27 октября 2006 в 9:53

Создать блок, выбрать формат PHP, вставить в него текст:

<?php
if(arg(0)=='node'&&is_numeric(arg(1)))
{
$nid=arg(1);
$res=taxonomy_node_get_terms($nid);
$vid=current($res); $vid=$vid->vid;
$voc_name=taxonomy_get_vocabulary($vid);
 switch($voc_name->name?$voc_name->name:'')
 {
  case 'vocabulary1': echo 'v1 text'; break;
  case 'vocabulary2': echo 'v2 text'; break;
  case 'vocabulary3': echo 'v3 text'; break;
  default: echo 'no vocabulary??';
 }
}
else
{
 echo 'node isn\'t selected';
}
?>

Заменить 'vocabulary1', 'vocabulary2', 'vocabulary3' на названия своих словарей, а тексты 'v1 text', 'v2 text', 'v2 text' на тексты, специфичные для данных словарей.

Аватар пользователя lexa74 lexa74 27 октября 2006 в 10:47

спасибо!
"а тексты ‘v1 text’, ‘v2 text’, ‘v2 text’ на тексты, специфичные для данных словарей"
а это можно расшифровать?

Аватар пользователя emzi emzi 27 октября 2006 в 12:42

если это для определения условий видимости, то там вместо switch должно быть что-то типа if($voc_name->name=='Мой любимый терм 1') { return true;} else { return false;}

Аватар пользователя lexa74 lexa74 27 октября 2006 в 14:53

эх... не стало мне понятнее...
как там вообще условия писать - никак не пойму, сейчас экспериментирую...

Аватар пользователя coyotle coyotle 27 октября 2006 в 16:16
switch($voc_name->name?$voc_name->name:'')
{
  case 'vocabulary1': echo 'v1 text'; break;
  case 'vocabulary2': echo 'v2 text'; break;
  case 'vocabulary3': echo 'v3 text'; break;
  default: echo 'no vocabulary??';
}

Это расшифровывается так:
если $voc_name->name совпадает с 'vocabulary1' - то выполнить echo 'v1 text';
если $voc_name->name совпадает с 'vocabulary2' - то выполнить echo 'v2 text';
...
если совпадений не было - то выполнить echo 'no vocabulary??';

команда echo - выводит текст. Вместо нее можете вставить нужные вам комманды или изменить выводимый текст н нужный в зависимости от условий.

можно делать так:

if ($voc_name->name == 'myfavorvoc')
{
  echo "Эта нода принадлежит моему любимому словарю";
}
else
{
  echo "Эта нода НЕ принадлежит моему любимому словарю";
}
Аватар пользователя lexa74 lexa74 27 октября 2006 в 19:33

ага... уже стало понятней ))
т.е. надо прописать в условии видимости блока PHP
$voc_name->name == 'myfavorvoc' правильно?

Аватар пользователя lexa74 lexa74 29 октября 2006 в 18:23

вроде сам разобрался...
<?php
$nid=arg(1);
$res=taxonomy_node_get_terms($nid);
$vid=current($res); $vid=$vid->vid;
$voc_name=taxonomy_get_vocabulary($vid);
if ($voc_name->name == 'Новости'){
return TRUE;
} else return FALSE;
?>
работает... надо бы в faq закинуть куда-то, нужная штукенция...

Аватар пользователя inc inc 1 ноября 2006 в 19:46

Кстати если нода находится в нескольких словарях, то будет определяться ее принадлежность только к первому из них

Аватар пользователя inc inc 2 ноября 2006 в 12:53

node isn't selected
т.к. выделение nid (node id) происходит из пути в адресной строке (при использовании алиасов тоже будет работать):

if(arg(0)=='node'&&is_numeric(arg(1)))
{

А уже исходя из nid определяется принадлежность к словарю.
Кстати в вашем варианте кода присутствует ошибка: если пройти по адресу /user/{id юзера}, то {id юзера} будет восприниматься как идентификатор ноды

Аватар пользователя ultraboy@drupal.org ultraboy@drupal.org 3 ноября 2006 в 11:25

Я не вижу там ошибки. Так как если "пройти по адресу /user/{id юзера}", то условие <?php if(arg(0)=='node'&&is_numeric(arg(1))) ?> не выполнится, и, соответственно, до "воспринятия идентификатора ноды" дело не дойдет. Ведь так?

Аватар пользователя Dan Dan 6 ноября 2006 в 22:46

Вместо:
<?php
if ($voc_name->name == 'Новости'){
return TRUE;
} else return FALSE;
?>
Просто:
<?php
return ($voc_name->name == 'Новости');
?>

Аватар пользователя lexa74 lexa74 14 ноября 2006 в 22:45

возник еще вопрос...

есть словарь "Новости", а в нём термины.
Метод этот позволяет определить словарь к которому относится, а вот как доделать чтоб посмотреть к какому термину?
Чувствую что просто, только полный ламер я в пхп Sad

Аватар пользователя lexa74 lexa74 23 ноября 2006 в 20:59

мдя... тяжело быть ламером...

щас стоит скрипт

<?php
$nid=arg(1);
$res=taxonomy_node_get_terms($nid);
$vid=current($res); $vid=$vid->vid;
$voc_name=taxonomy_get_vocabulary($vid);
if ($voc_name->name == 'Юрист на связи'){
return TRUE;
} else return FALSE;
?>

что тут поменять чтоб использовать его не для термина 'Юрист на связи', а для категории "Статьи"

Аватар пользователя Dan Dan 23 ноября 2006 в 22:53

Я, наверное, чего-то не понимаю...

есть словарь "Новости", а в нём термины......как доделать чтоб посмотреть к какому термину?
Если у словаря номер пять, то следующий код:
$terms = taxonomy_node_get_terms_by_vocabulary(arg(1), 5));
поместит в переменную $terms все термины из словаря "Новости", к которым привязана данная нода.
или нужно что-то другое?

Аватар пользователя lexa74 lexa74 23 ноября 2006 в 22:58

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