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

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

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

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

Комментарии

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

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

22 января 2014 в 11:25

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

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

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

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

21 января 2014 в 22:57

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

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

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

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

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

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

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

22 января 2014 в 11:38

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

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

22 января 2014 в 11:54

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

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

22 января 2014 в 12:24

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

$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)

22 января 2014 в 12:15

"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']

22 января 2014 в 12:23

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

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

22 января 2014 в 12:26

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

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

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

22 января 2014 в 12:31

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

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

22 января 2014 в 12:41

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'] (с многоточием на самом инересном месте...)

22 января 2014 в 13:38

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

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

22 января 2014 в 13:35

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

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

22 января 2014 в 14:05

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

22 января 2014 в 14:01

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

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

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

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

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

22 января 2014 в 14:27

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

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

22 января 2014 в 14:45

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

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

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

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

22 января 2014 в 15:08

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

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

22 января 2014 в 15:21

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

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

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

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

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

7 февраля 2014 в 11:03

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

Спасибо.

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

ну если у юзера в поле 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;
?>

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

7 февраля 2014 в 11:41

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

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

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

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

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

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

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

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

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

7 февраля 2014 в 13:17

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

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

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

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

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

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

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

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

7 февраля 2014 в 13:33

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

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

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

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

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

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

7 февраля 2014 в 13:36
<?php
global $user;
$user user_load($user->uid);
dprint_r ($user->user_otdel);
?>

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

7 февраля 2014 в 13:39

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

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

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

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

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

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

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

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

7 февраля 2014 в 14:06

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

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

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

7 февраля 2014 в 14:57

не могу я совладать и девелом.
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); ?> или еще что?

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

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

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

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

7 февраля 2014 в 16:33

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

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

7 февраля 2014 в 16:38

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

7 февраля 2014 в 16:51

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

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

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

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

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

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

7 февраля 2014 в 16:58

"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); ? во множественном числе, когда везде в одиночном?

7 февраля 2014 в 17:14

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

7 февраля 2014 в 17:18

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

8 февраля 2014 в 11:54

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"; ?>

8 февраля 2014 в 21:33

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

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

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

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

9 февраля 2014 в 1:12

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

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

10 ноября 2015 в 11:49

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

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

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

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

9 февраля 2014 в 23:43