получение term id по имени

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

Аватар пользователя kurl kurl 21 января 2014 в 22:09

Подскажите, п-та, каким образом можно получить id терма таксономии (на страничке заданного типа контента). Хотелось бы его получить, чтоб передать id в контекстный фильтр блока представления.

Такой вызов не срабатывает, ссылаясь на неверный нулевой индекс:
$terms = taxonomy_get_term_by_name("Машинное имя поле со значением терма таксономии");
return $terms[0]->tid;

Комментарии

Аватар пользователя kurl kurl 22 января 2014 в 11:25

roman-yrv wrote:
Так а что это за ситуация, когда Вы знаете значение терма, но не знаете его tid ?

на страничке есть поле с машинным именем "машинное имя терма" - я хочу выбрать id терма который выбран в этом поле, чтоб подсунуть его в контекстный фильтр блока (view), который размещается на этой странице

Аватар пользователя drupby drupby 21 января 2014 в 22:57

"kurl" wrote:
Такой вызов не срабатывает, ссылаясь на неверный нулевой индекс:

потому что нету термина с tid = 0

"kurl" wrote:
return $terms[0]->tid;

какой смысл в исполнении этой строки?

Аватар пользователя kurl kurl 22 января 2014 в 11:26

drupby wrote:
"kurl" wrote:
Такой вызов не срабатывает, ссылаясь на неверный нулевой индекс:

потому что нету термина с tid = 0

"kurl" wrote:
return $terms[0]->tid;

какой смысл в исполнении этой строки?

была надежда на получение идентификатора нулевого элемента массива термов

Аватар пользователя Inj Inj 22 января 2014 в 11:38

пробовали смотреть что заноситься в $terms с помощью var_dump или print_r. Сам функцией не пользовался, думаю что нолик лишний, ибо если термин с таким именем 1 то $terms будет 1.
Посмотрел API, вродь у Вас все верно, но var_dump покажет точно.

Аватар пользователя kurl kurl 22 января 2014 в 11:54

Inj wrote:
пробовали смотреть что заноситься в $terms с помощью var_dump или print_r. Сам функцией не пользовался, думаю что нолик лишний, ибо если термин с таким именем 1 то $terms будет 1.
Посмотрел API, вродь у Вас все верно, но var_dump покажет точно.

пока не получилось посмотреть...
var_dump или print_r я могу вызвать где-то в devel или их нужно прописать где-то в коде?

Аватар пользователя kurl kurl 22 января 2014 в 12:24

Inj wrote:
да где угодно. Загляните в переменную что выводится любым удобным для Вас способом)

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

Аватар пользователя graker graker 22 января 2014 в 12:15

Делается это примерно (примерно) так.

$node_wrapper = entity_metadata_wrapper('node', $nid); //nid же вы умеете получать?
$tid = $node_wrapper->названиеполятаксономии->getIdentifier();

Или, если поле таксономии множественное:

$node_wrapper = entity_metadata_wrapper('node', $nid); //nid же вы умеете получать?
$tid = $node_wrapper->названиеполятаксономии[0]->getIdentifier(); //для первого из выбранных терминов

(чтобы были node-wrapper-ы - надо иметь модуль entity api)

Аватар пользователя drupby drupby 22 января 2014 в 12:23

"graker" wrote:
Или, если поле таксономии множественное:
$node_wrapper = entity_metadata_wrapper('node', $nid); //nid же вы умеете получать?
$tid = $node_wrapper->названиеполятаксономии[0]->getIdentifier(); //для первого из выбранных терминов
(чтобы были node-wrapper-ы - надо иметь модуль entity api)

ну тогда уже проще
$node->field_tags[LANGUAGE_NONE][0]['tid']

Аватар пользователя drupby drupby 22 января 2014 в 12:26

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

если модуль devel установлен , то
dpm($var);

Аватар пользователя kurl kurl 22 января 2014 в 12:31

drupby wrote:
"kurl" wrote:
подскажите, п-та, какой-ть способ заглядывания в переменную

если модуль devel установлен , то
dpm($var);

подскажите, п-та, этот вызов где-то в коде прописать нужно (где?) или можно вызвать из интерфейса модуля devel (где?).

Аватар пользователя drupby drupby 22 января 2014 в 12:41

"kurl" wrote:
подскажите, п-та, этот вызов где-то в коде прописать нужно (где?) или можно вызвать из интерфейса модуля devel (где?).

да там же и где ты свой код писал

Аватар пользователя kurl kurl 22 января 2014 в 13:38

drupby wrote:
"kurl" wrote:
подскажите, п-та, этот вызов где-то в коде прописать нужно (где?) или можно вызвать из интерфейса модуля devel (где?).

да там же и где ты свой код писал

код я писал в контекстном фильтре блока (view) - оттуда массив переменных печататься не хочет...
могу вывести массив переменных (и найти ту, что мне нужно), воткнув print_r в template.php

function моя_тема_preprocess_node(&$vars){
$vars['sticky_text'] = theme_get_setting('sticky_text');
var_dump($vars);

но что-то не соображу кто и как вызывает эту функцию, чтоб увидеть откуда взялся $vars. Как на странице ноды узнать имя массива переменных? devel показывает такую штуку $...['моё_поле']['und'][0]['tid'] (с многоточием на самом инересном месте...)

Аватар пользователя drupby drupby 22 января 2014 в 13:35

"graker" wrote:
Это проще, но на мой взгляд гораздо менее кошерно.

ну действительно когда на странице уже есть объект ноды , в котором в свойствах есть все необходимые данные , нужно получить еще один оберточный объект и потом выяснять какими методами можно получить из него нужный нам id термина
да и меня кошерность не интересует - видимо не та у меня национальность Wink

Аватар пользователя graker graker 22 января 2014 в 14:05

drupby wrote:
ну действительно когда на странице уже есть объект ноды , в котором в свойствах есть все необходимые данные , нужно получить еще один оберточный объект и потом выяснять какими методами можно получить из него нужный нам id термина
Методы не надо выяснять, их надо знать Smile он один, этот метод, единый для всех сущностей - getIdentifier().

Просто когда работаешь с километровыми кодами, особенно с вложенными сущностями, как в коммерце, враппер становится настолько удобнее, что все эти ['und'][0][блаблабла][блаблабла] иначе как говнокодом уже не называешь.

Аватар пользователя imarat imarat 22 января 2014 в 14:01

array_shift используйте АПд: с мобилки жутко неудобно, примерно так аррей шифт ( такс терм нет бай нейм ( имя термина) ) - это термин. И потом получаете ид термин->ид

Аватар пользователя drupby drupby 22 января 2014 в 14:18

"graker" wrote:
Методы не надо выяснять, их надо знать Smile

есть модуль https://drupal.org/project/ebt для автодополнения методов и свойств в ide для кошерных entity metadata wrapper объектов - не знаю правда насколько кошерным модуль считается

Аватар пользователя Inj Inj 22 января 2014 в 14:27

Ужс, что пошло... Как уже сказал imarat:

$terms = taxonomy_get_term_by_name("Машинное имя поле со значением терма таксономии");
$term = array_shift($terms);
return $term->tid;

Аватар пользователя graker graker 22 января 2014 в 14:45

Inj wrote:
Ужс, что пошло...
В чем ужас, не затруднит пояснить?

Человек, судя по всему, хочет на странице ноды какого-то типа получить id заданного для ноды термина.
Понятно ли, что это надо делать не по имени термина?

Аватар пользователя graker graker 22 января 2014 в 14:26

Спроси у носителей "той" национальности - может подскажут.

Если референс в IDE подключить как следует, то методы и свойства объектов из enity api и так нормально разворачиваются в автодополнении.

Аватар пользователя Inj Inj 22 января 2014 в 15:08

Ну изначально топик называется "получение term id по имени", собсно способ выше. Если вытянуть из ноды, то можно $node->машинное_имя_поля_таксономии["und"][0]["tid"]

Аватар пользователя graker graker 22 января 2014 в 15:21

Ага, это уже написали.
Просто мне глаза режут эти ['und'], поэтому я пропагандирую унифицированную альтернативу.

А что топик называется - это по-моему ТС не то написал. Не зря же в аргумент передается загадочное "Машинное имя поле со значением терма таксономии" Wacko

Аватар пользователя Junegton Junegton 7 февраля 2014 в 10:19

у меня очень похожая задача, но не получается решить - нужно получить ID термина из поля в профиле пользователя. Т.е. машинное имя поля "user_otdel", как получить ID термина для текущего пользователя, который просматривает views - нужно вставить в контекстный фильтр.
Спасибо!

Аватар пользователя Inj Inj 7 февраля 2014 в 11:03

просмотрите global $user. Но созданного Вами поля там скорее всего не будет, но лучше проверить. Если нету, то:

<?php
global $user;
$user user_load($user->uid);
?>

из него уже достаете нужное поле.

Аватар пользователя Junegton Junegton 7 февраля 2014 в 11:37

не сочтите дебилом но я вообще не знаком с ПХП, тем более говорить терминологии движка друпала подавно. Я делаю по аналогии - нахожу код в сети и меняю переменные на свои. в случае с поставленной задачей - не вышло, пришлось потревожить форум.
Если не трудно, можете подробнее расписать, т.е. чтобы в итоге мне выдало нужный id через return я так понимаю, и фильтр подхватил его значение

Спасибо.

Аватар пользователя Inj Inj 7 февраля 2014 в 11:41

ну если у юзера в поле user_otdel имя термина таксономии, то

<?php
global $user;
$user user_load($user->uid);
$terms taxonomy_get_term_by_name($user->user_otdel);
$term array_shift($terms);
return 
$term->tid;
?>

то должно быть так

Аватар пользователя Junegton Junegton 7 февраля 2014 в 12:46

что-то не сработало, пробовал даже кэш очистить, в синтаксисе у меня ошибки нет - проверил несколько раз.

Возможно: поле находится в группе полей, я даже специально вынес поле из группы в корень профиля - но все равно не отрабатывает. Хотя, если я задаю жесткое значение цифрой (т.е. id термина) в контекстных фильтрах представления - все отрабатывает. А ПХП код нет.
Не знаю, важно это или нет, в профиле пользователь выбирает термин из раскрывающегося списка.

А название поля не нужно брать в скобки?

Аватар пользователя Inj Inj 7 февраля 2014 в 13:13

я бы с помощью модуля Devel попробовал бы выполнить код:

<?php
global $user;
$user user_load($user->uid);
dprint_r ($user->user_otdel);
?>

Не видя структуру объекта сложно гадать над переменными.

Аватар пользователя Inj Inj 7 февраля 2014 в 13:17

кстати, чуть не забыл. Мы кудесим над текущим пользователем. Тобишь в данный момент над Вашим (пока Вы под собой эксперементируете), значит нужно что бы у Вас это поле было не пустое, ну или тестить каким-то другим юзером

Аватар пользователя Junegton Junegton 7 февраля 2014 в 13:22

"Inj" wrote:
что бы у Вас это поле было не пустое, ну или тестить каким-то другим юзером

тест провожу через второй браузер под другим юзером с установленным значением поля

Как-то ставил модуль девел - ушатал им сайт в ноль =), может руки кривые, но если сейчас не выйдет, сделаю копию проекта и поставлю заново.
Что подразумевается под структурой? имена полей и словарей? или еще что

Аватар пользователя Inj Inj 7 февраля 2014 в 13:23

ну тогда попробуйте через Девел. Меня очень смущает этот кусок $user->user_otdel, это моя догадка что у Вас оно лежит там)

Аватар пользователя Inj Inj 7 февраля 2014 в 13:33

"Junegton" wrote:
Что подразумевается под структурой? имена полей и словарей? или еще что

я имею ввиду подгружаемую переменную $user и расположение в ней user_otdel. Если поле многозначное (может быть несколько значений) может быть $user->user_otdel[0] или $user->user_otdel[0]['value'] или ещё фик знает что...Проще один раз посмотреть, чем гадать

Аватар пользователя Junegton Junegton 7 февраля 2014 в 13:36

Так, может стоит еще уточнить у вас, кто разбирается в ядре и т.д.

У меня есть пользователь - у него есть поле, при регистрации пользователь указывает его значение из списка терминов словаря.

Есть представление материалов, у материалов есть тоже поле (другое машинное имя поля, не такое как в профиле) но значение берется из того же словаря что и у пользователя.
В представлении я задаю контекстный фильтр по полю из материала (содержимому), но хочу подсунуть пхп кодом значение id термина из профиля юзера. Т.е. мне нужна только цифра id, так как они одинаковы для двух полей (что у юзера что у материала), словарь ведь один для двух полей.

Если указываю жестко цифру - все работает, а вот пхп код нет.

В двух случаях поле принимает только одно значение.

Пошел ковырять модуль девел Smile

Аватар пользователя Junegton Junegton 7 февраля 2014 в 13:39
<?php
global $user;
$user user_load($user->uid);
dprint_r ($user->user_otdel);
?>

куда нужно вставить этот код из девела, чтобы он отработал?

Аватар пользователя graker graker 7 февраля 2014 в 14:04

Я конечно извиняюсь, но может так получиться, что ваше поле user_otdel на самом деле называется field_user_otdel?

Аватар пользователя Inj Inj 7 февраля 2014 в 14:05

"Junegton" wrote:
меня есть пользователь - у него есть поле, при регистрации пользователь указывает его значение из списка терминов словаря.

вчитался внимательнее. Указывает пользователь выбирая из имен таксономии, а вот в поле скорее всего заносится уже АйДи этого термина.

Аватар пользователя Inj Inj 7 февраля 2014 в 14:06

"graker" wrote:
Я конечно извиняюсь, но может так получиться, что ваше поле user_otdel на самом деле называется field_user_otdel?

и это не исключено

вообщем, dprint_r ($user); расставит всё на места Smile

Аватар пользователя Junegton Junegton 7 февраля 2014 в 14:57

"graker" wrote:
Я конечно извиняюсь, но может так получиться, что ваше поле user_otdel на самом деле называется field_user_otdel?

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

скоро будет результат из девела

Аватар пользователя Junegton Junegton 7 февраля 2014 в 16:24

не могу я совладать и девелом.
1 - поставил модуль, включил - все без ошибок
2- при исполнении кода в представлении (т.е. в контекстных фильтрах)

<?php
global $user;
$user user_load($user->uid);
dprint_r ($user);
?>

ничего не происходит - представление остается пустым и нет ничего на странице интересного

3- прописал прямо в page.tpl.php этот же код

<?php
global $user;
$user user_load($user->uid);
dprint_r ($user);
?>

и выдало мне на странице такую картинку:

array
(
 [uid] => Array
  (
    [0] => array
     (
      [tid] => 3
      )
   )
 )

Кстати, 3-это реальный id термина из моего профиля.
4- нужно ли на странице page.tpl прописывать <?php dpm($node); ?> или еще что?

Аватар пользователя Inj Inj 7 февраля 2014 в 16:33

тоесть, если в шаблоне прописать

<?php
global $user;
$user user_load($user->uid);
print 
$user['uid'][0]['tid'];
?>

он будет выводить нужно Вам значение?

Аватар пользователя Junegton Junegton 7 февраля 2014 в 16:38

"Inj" wrote:
он будет выводить нужно Вам значение?

нет, такая конструкция вообще крошит страницу и ругается на ошибку в строке с print $user['uid'][0]['tid'];

Аватар пользователя Junegton Junegton 7 февраля 2014 в 16:51

если я прописываю в page.tpl <?php dpm($user) ?>, мне через Крумо выводит инфу по пользователю, но ни одно из моих полей что я добавлял профиль сам - не отображается, по ним нет инфы.

Аватар пользователя graker graker 7 февраля 2014 в 16:55

Junegton wrote:
если я прописываю в page.tpl <?php dpm($user) ?>, мне через Крумо выводит инфу по пользователю, но ни одно из моих полей что я добавлял профиль сам - не отображается, по ним нет инфы.

global $user;
$user = user_load($user->uid);
dpm($user);

и скриншот развернутого крумо - сюда.
Или же:

$user = user_load("id нужного юзера без кавычек");
dpm($user);
Аватар пользователя Junegton Junegton 7 февраля 2014 в 16:58

не знаю как но девел мне выдал по моему полю такую конструкцию

$...->field_user_otdel['uid'][0]['tid'] и мое нужно значение строчкой выше 3

Аватар пользователя Junegton Junegton 7 февраля 2014 в 17:14

"graker" wrote:

Именно так оно и должно быть. В значении поля-ссылки на термин таксономии лежат tid-ы.


т.е. конструкция была правильная, с поправкой на машинное имя поля field_user_otdel

<?php
global $user;
$user user_load($user->uid);
$terms taxonomy_get_term_by_name($user->field_user_otdel); 
$term array_shift($terms);
return 
$term->tid;
?>

А может быть что не проблема в представлении, т.е. по какой-то причине сам скрипт не отрабатывает?
Это правильно что в этой строчке $terms = taxonomy_get_term_by_name($user->field_user_otdel); ? во множественном числе, когда везде в одиночном?

Аватар пользователя graker graker 7 февраля 2014 в 17:18

Junegton wrote:
"graker" wrote:

Именно так оно и должно быть. В значении поля-ссылки на термин таксономии лежат tid-ы.


т.е. конструкция была правильная, с поправкой на машинное имя поля field_user_otdel

<?php
global $user;
$user user_load($user->uid);
$terms taxonomy_get_term_by_name($user->field_user_otdel); 
$term array_shift($terms);
return 
$term->tid;
?>


Нет конечно.
В значения поля ссылки уже лежит id, а не имя, соответственно по имени искать не нужно.
Правильно
return $user->field_user_otdel['und'][0]['tid'];
Это если без учета необходимости проверять, установлено ли у пользователя значение в это поле.

Quote:
Это правильно что в этой строчке $terms = taxonomy_get_term_by_name($user->field_user_otdel); ? во множественном числе, когда везде в одиночном?

Lol

Аватар пользователя Junegton Junegton 8 февраля 2014 в 11:54

вчера не смог отписаться.
Протестировать смогу немного позже, отпишусь.
Проверять на заполнение не нужно - при регистрации это поле обязательно.

Аватар пользователя Junegton Junegton 8 февраля 2014 в 21:33

Sad не запустилось, пробовал так:
<?php
global $user;
$user = user_load($user->uid);
$terms = taxonomy_get_term_by_name($user->field_user_otdel);
$term = array_shift($terms);
return $user->field_user_otdel['und'][0]['tid'];
?>
и только:
<?php
return $user->field_user_otdel['und'][0]['tid'];
?>
Как вообще проверить выполняется ли в поле скрипт?
этот код ниже должен вернуть только значение "3" вроде, но тоже не работает
<?php Echo "3"; ?>

Аватар пользователя graker graker 9 февраля 2014 в 1:12

Quote:
=( не запустилось, пробовал так:

То что вы не знаете php - не означает, что не нужно пытаться понять написанное.

global $user;
$user = user_load($user->uid);
return $user->field_user_otdel['und'][0]['tid'];

Ну а return там, или еще что - это уже зависит от того, куда вы этот код втыкаете.

Аватар пользователя Junegton Junegton 10 ноября 2015 в 11:49

"graker" wrote:
Ну а return там, или еще что - это уже зависит от того, куда вы этот код втыкаете.

в контекстный фильтр представления

Аватар пользователя Junegton Junegton 9 февраля 2014 в 23:43

ЗАРАБОТАЛО! УРА!

"Inj" wrote:
"не использовать <?php ?>"

после такого чувствуешь мягко говоря себя хуже "чайника".

Огромное спасибо ребята за помощь! Рад что есть люди готовые откликнуться вот так оперативно! Всего вам наилучшего по жизни!