Подскажите, п-та, каким образом можно получить id терма таксономии (на страничке заданного типа контента). Хотелось бы его получить, чтоб передать id в контекстный фильтр блока представления.
Такой вызов не срабатывает, ссылаясь на неверный нулевой индекс:
$terms = taxonomy_get_term_by_name("Машинное имя поле со значением терма таксономии");
return $terms[0]->tid;
Комментарии
Так а что это за ситуация, когда Вы знаете значение терма, но не знаете его tid ?
на страничке есть поле с машинным именем "машинное имя терма" - я хочу выбрать id терма который выбран в этом поле, чтоб подсунуть его в контекстный фильтр блока (view), который размещается на этой странице
На какой страничке ?
На странице ноды, в которой этот терм используется ?
потому что нету термина с tid = 0
какой смысл в исполнении этой строки?
была надежда на получение идентификатора нулевого элемента массива термов
пробовали смотреть что заноситься в $terms с помощью var_dump или print_r. Сам функцией не пользовался, думаю что нолик лишний, ибо если термин с таким именем 1 то $terms будет 1.
Посмотрел API, вродь у Вас все верно, но var_dump покажет точно.
пока не получилось посмотреть...
var_dump или print_r я могу вызвать где-то в devel или их нужно прописать где-то в коде?
на любой, важен сам вывод функции, а он, при одинаковых вводных, будет тот же
да где угодно. Загляните в переменную что выводится любым удобным для Вас способом)
подскажите, п-та, какой-ть способ заглядывания в переменную
Делается это примерно (примерно) так.
$tid = $node_wrapper->названиеполятаксономии->getIdentifier();
Или, если поле таксономии множественное:
$tid = $node_wrapper->названиеполятаксономии[0]->getIdentifier(); //для первого из выбранных терминов
(чтобы были node-wrapper-ы - надо иметь модуль entity api)
ну тогда уже проще
$node->field_tags[LANGUAGE_NONE][0]['tid']
если модуль devel установлен , то
dpm($var);
подскажите, п-та, этот вызов где-то в коде прописать нужно (где?) или можно вызвать из интерфейса модуля 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'] (с многоточием на самом инересном месте...)
Это проще, но на мой взгляд гораздо менее кошерно.
ну действительно когда на странице уже есть объект ноды , в котором в свойствах есть все необходимые данные , нужно получить еще один оберточный объект и потом выяснять какими методами можно получить из него нужный нам id термина
да и меня кошерность не интересует - видимо не та у меня национальность
Просто когда работаешь с километровыми кодами, особенно с вложенными сущностями, как в коммерце, враппер становится настолько удобнее, что все эти ['und'][0][блаблабла][блаблабла] иначе как говнокодом уже не называешь.
array_shift используйте АПд: с мобилки жутко неудобно, примерно так аррей шифт ( такс терм нет бай нейм ( имя термина) ) - это термин. И потом получаете ид термин->ид
$node = menu_get_object();
return $node->field_tags[LANGUAGE_NONE][0]['tid'];
}
название имя поля можешь уточнить site.ru/node/53/devel
есть модуль https://drupal.org/project/ebt для автодополнения методов и свойств в ide для кошерных entity metadata wrapper объектов - не знаю правда насколько кошерным модуль считается
Ужс, что пошло... Как уже сказал imarat:
$terms = taxonomy_get_term_by_name("Машинное имя поле со значением терма таксономии");
$term = array_shift($terms);
return $term->tid;
Человек, судя по всему, хочет на странице ноды какого-то типа получить id заданного для ноды термина.
Понятно ли, что это надо делать не по имени термина?
Спроси у носителей "той" национальности - может подскажут.
Если референс в IDE подключить как следует, то методы и свойства объектов из enity api и так нормально разворачиваются в автодополнении.
Ну изначально топик называется "получение term id по имени", собсно способ выше. Если вытянуть из ноды, то можно $node->машинное_имя_поля_таксономии["und"][0]["tid"]
Ага, это уже написали.
Просто мне глаза режут эти ['und'], поэтому я пропагандирую унифицированную альтернативу.
А что топик называется - это по-моему ТС не то написал. Не зря же в аргумент передается загадочное "Машинное имя поле со значением терма таксономии"
у меня очень похожая задача, но не получается решить - нужно получить ID термина из поля в профиле пользователя. Т.е. машинное имя поля "user_otdel", как получить ID термина для текущего пользователя, который просматривает views - нужно вставить в контекстный фильтр.
Спасибо!
двойной пост, дел
просмотрите global $user. Но созданного Вами поля там скорее всего не будет, но лучше проверить. Если нету, то:
<?php
global $user;
$user = user_load($user->uid);
?>
из него уже достаете нужное поле.
не сочтите дебилом но я вообще не знаком с ПХП, тем более говорить терминологии движка друпала подавно. Я делаю по аналогии - нахожу код в сети и меняю переменные на свои. в случае с поставленной задачей - не вышло, пришлось потревожить форум.
Если не трудно, можете подробнее расписать, т.е. чтобы в итоге мне выдало нужный id через return я так понимаю, и фильтр подхватил его значение
Спасибо.
ну если у юзера в поле 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;
?>
то должно быть так
что-то не сработало, пробовал даже кэш очистить, в синтаксисе у меня ошибки нет - проверил несколько раз.
Возможно: поле находится в группе полей, я даже специально вынес поле из группы в корень профиля - но все равно не отрабатывает. Хотя, если я задаю жесткое значение цифрой (т.е. id термина) в контекстных фильтрах представления - все отрабатывает. А ПХП код нет.
Не знаю, важно это или нет, в профиле пользователь выбирает термин из раскрывающегося списка.
А название поля не нужно брать в скобки?
ну в фигурные можно попробывать взять
я бы с помощью модуля Devel попробовал бы выполнить код:
<?php
global $user;
$user = user_load($user->uid);
dprint_r ($user->user_otdel);
?>
Не видя структуру объекта сложно гадать над переменными.
кстати, чуть не забыл. Мы кудесим над текущим пользователем. Тобишь в данный момент над Вашим (пока Вы под собой эксперементируете), значит нужно что бы у Вас это поле было не пустое, ну или тестить каким-то другим юзером
ставил в "" - тоже не работает
тест провожу через второй браузер под другим юзером с установленным значением поля
Как-то ставил модуль девел - ушатал им сайт в ноль =), может руки кривые, но если сейчас не выйдет, сделаю копию проекта и поставлю заново.
Что подразумевается под структурой? имена полей и словарей? или еще что
ну тогда попробуйте через Девел. Меня очень смущает этот кусок $user->user_otdel, это моя догадка что у Вас оно лежит там)
я имею ввиду подгружаемую переменную $user и расположение в ней user_otdel. Если поле многозначное (может быть несколько значений) может быть $user->user_otdel[0] или $user->user_otdel[0]['value'] или ещё фик знает что...Проще один раз посмотреть, чем гадать
Так, может стоит еще уточнить у вас, кто разбирается в ядре и т.д.
У меня есть пользователь - у него есть поле, при регистрации пользователь указывает его значение из списка терминов словаря.
Есть представление материалов, у материалов есть тоже поле (другое машинное имя поля, не такое как в профиле) но значение берется из того же словаря что и у пользователя.
В представлении я задаю контекстный фильтр по полю из материала (содержимому), но хочу подсунуть пхп кодом значение id термина из профиля юзера. Т.е. мне нужна только цифра id, так как они одинаковы для двух полей (что у юзера что у материала), словарь ведь один для двух полей.
Если указываю жестко цифру - все работает, а вот пхп код нет.
В двух случаях поле принимает только одно значение.
Пошел ковырять модуль девел
<?php
global $user;
$user = user_load($user->uid);
dprint_r ($user->user_otdel);
?>
куда нужно вставить этот код из девела, чтобы он отработал?
выполнить код php
только
<?php
global $user;
$user = user_load($user->uid);
dprint_r ($user);
?>
без указания поля
Я конечно извиняюсь, но может так получиться, что ваше поле user_otdel на самом деле называется field_user_otdel?
вчитался внимательнее. Указывает пользователь выбирая из имен таксономии, а вот в поле скорее всего заносится уже АйДи этого термина.
и это не исключено
вообщем, dprint_r ($user); расставит всё на места
радует что люди смотрят внимательно, но в этом ошибки нет, когда писал первый пост, писал просто имя поля, но в скрипте конечно все набирал правильно - из машинного имени.
скоро будет результат из девела
не могу я совладать и девелом.
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);
?>
и выдало мне на странице такую картинку:
(
[uid] => Array
(
[0] => array
(
[tid] => 3
)
)
)
Кстати, 3-это реальный id термина из моего профиля.
4- нужно ли на странице page.tpl прописывать <?php dpm($node); ?> или еще что?
тоесть, если в шаблоне прописать
<?php
global $user;
$user = user_load($user->uid);
print $user['uid'][0]['tid'];
?>
он будет выводить нужно Вам значение?
нет, такая конструкция вообще крошит страницу и ругается на ошибку в строке с print $user['uid'][0]['tid'];
$user->uid[0]['tid'];
?
тоже ошибка в этой строке
А можно просто приложить скриншот с картинкой развернутого вывода dpm($user); ?
если я прописываю в page.tpl <?php dpm($user) ?>, мне через Крумо выводит инфу по пользователю, но ни одно из моих полей что я добавлял профиль сам - не отображается, по ним нет инфы.
$user = user_load($user->uid);
dpm($user);
и скриншот развернутого крумо - сюда.
Или же:
dpm($user);
не знаю как но девел мне выдал по моему полю такую конструкцию
$...->field_user_otdel['uid'][0]['tid'] и мое нужно значение строчкой выше 3
Именно так оно и должно быть. В значении поля-ссылки на термин таксономии лежат 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); ? во множественном числе, когда везде в одиночном?
Нет конечно.
В значения поля ссылки уже лежит id, а не имя, соответственно по имени искать не нужно.
Правильно
return $user->field_user_otdel['und'][0]['tid'];
Это если без учета необходимости проверять, установлено ли у пользователя значение в это поле.
вчера не смог отписаться.
Протестировать смогу немного позже, отпишусь.
Проверять на заполнение не нужно - при регистрации это поле обязательно.
не запустилось, пробовал так:
<?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"; ?>
return
То что вы не знаете php - не означает, что не нужно пытаться понять написанное.
$user = user_load($user->uid);
return $user->field_user_otdel['und'][0]['tid'];
Ну а return там, или еще что - это уже зависит от того, куда вы этот код втыкаете.
в контекстный фильтр представления
под полем надпись "не использовать <?php ?>"
ЗАРАБОТАЛО! УРА!
после такого чувствуешь мягко говоря себя хуже "чайника".
Огромное спасибо ребята за помощь! Рад что есть люди готовые откликнуться вот так оперативно! Всего вам наилучшего по жизни!