[Решено] Как получить nid зная tid?

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

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 0:38

Доброе время суток!
Пытаюсь получить заголовок ноды на странице связаного с нею термина с помощью следующего кода (который пока не работает).
Подскажите, пожалуйста, что не так?

<?php
if (arg(0) == 'taxonomy' && is_numeric($tid = arg(2)) {
$result=db_query('SELECT nid FROM {term_node} term_node WHERE term_node.tid=%d',$tid);
if ($result) {
foreach($result as $nid){
$node = node_load($nid);
print $node->title;
}}}
?>

Комментарии

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 1:03

Полный код такой? - Не хочет работать..

<?php
if (arg(0) == 'taxonomy' && is_numeric($tid = arg(2)) {
$result = db_select('term_node', 't')
->fields('t', array('nid'))
->execute()
->fetchCol();
$nids = node_load_multiple($result);
if ($nids) {
foreach($nids as $nid){
$node = node_load($nid);
print $node->title;
}
}
}
?>

Аватар пользователя Inj Inj 30 января 2014 в 1:10

блин, запарился, не посмотрел что для 6-ки и написал для 7-ки.

<?php
if (arg(0) == 'taxonomy' && is_numeric($tid arg(2)) {
$result db_query("SELECT nid FROM {term_node} WHERE term_node.tid=%d',$tid");
$nids = array();
while (
$row db_fetch_object($result)) {
  
$nids[] = $row->nid;
}
$nids_loaded node_load_multiple($nids);
if (
$nids_loaded
foreach(
$nids_loaded as $node){
print 
$node->title;
}
}
?>

блин, надеюсь тут уж ничего не упустил)

Аватар пользователя Inj Inj 30 января 2014 в 1:25
<?php
if (arg(0) == 'taxonomy' && is_numeric($tid arg(2)) {
$result db_query("SELECT nid FROM {term_node} WHERE term_node.tid=%d',$tid");
$nids = array();
while (
$row db_fetch_object($result)) {
  
$nids[] = $row->nid;
}
foreach(
$nids as $nid){
$node node_load($nid);
print 
$node->title;
}
}
?>

*опасливо косится на CSoft Smile

Аватар пользователя CSoft CSoft 30 января 2014 в 1:35

"Inj" wrote:
*опасливо косится на CSoft :)

Biggrin

Мне интересно другое: что за задачу автор себе придумал. На странице термина и без того выводятся ноды с заголовками и прочими прелестями. Что за задумка?

"MasterTrend" wrote:
arg(0) == 'taxonomy' && is_numeric($tid = arg(2))

Кстати, вместо вот этого "чуда в перьях" рекомендую посмотреть в сторону [ru-api=menu_get_object]menu_get_object[/ru-api]

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 1:41

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

<?php
if (arg(0) == 'taxonomy' && arg(1) == 'term') {
$nid = 89;
$node = node_load($nid);
print $node->title;
}
?>

но хотелось бы получать $nid автоматом..

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 1:48

У меня для термина выводятся анонсы нод. В этих анонсах я коротко описываю сами ноды. Чтобы автоматизировать как-то этот процесс мне нужно получить заголовки нод и их адреса (это на закуску:-)). Но пока не получается..

Аватар пользователя CSoft CSoft 30 января 2014 в 1:50

Извиняюсь, но всё равно ничего не понял Sad В шаблоне ноды для тизера можете подставить всё, что угодно, да и заголовок там есть по умолчанию.

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 1:58

Ну допустим, в анонсе содержится картинка (нод с анонсами куча), которая будет ссылаться на ноду. Чтобы не вбивать каждый раз урл ноды и не исправлять содержимое поля alt="node_title", нужно получить значения..

Аватар пользователя CSoft CSoft 30 января 2014 в 2:01

Ещё сильнее запутался.

Значит так. Есть нода. У неё есть анонс. В анонсе есть картинка. Картинка должна быть ссылкой на саму ноду и иметь alt с заголовком ноды. Чтобы при выводе в анонсах на странице термина пользователь при клике на картинку попадал на страницу ноды.

Всё верно? Если да - Вы придумали очень странное решение своей проблемы.

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 2:10

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

Аватар пользователя CSoft CSoft 30 января 2014 в 2:13

Я и говорю - странным путём Вы пошли.

Что предлагаю я: один раз, перед сохранение ноды, сразу в хуке выполнить все правки, они сохранятся в базе и уже будут готовы для вывода. Не придётся при каждом показе анонса заново формировать все эти вещи.

Смотрите в сторону [ru-api=hook_nodeapi]hook_nodeapi[/ru-api] - presave.

Аватар пользователя CSoft CSoft 30 января 2014 в 2:17

Ещё можно в [ru-api=template_preprocess_node]template_preprocess_node[/ru-api] сделать всё то, что Вы хотите. Это будет вариант работы "на лету", выполняющийся каждый раз перед показом ноды. При этом, все переменные у Вас тут уже есть, останется только выполнить необходимые замены в тексте тизера.

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 2:28

Честно, мои знания в api, мягко говоря, не очень.
Я так понимаю первый вариант (сразу в хуке выполнить все правки) более рациональный.. Но не совсем понимаю, что придется поправить и где.
Второй вариант проще, я так понял должно работать следующим образом:
template_preprocess_node(&$variables); где необходимо менять значение $variables

Аватар пользователя CSoft CSoft 30 января 2014 в 2:30

"MasterTrend" wrote:
Я так понимаю первый вариант (сразу в хуке выполнить все правки) более рациональный.. Но не совсем понимаю, что придется поправить и где.

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

"MasterTrend" wrote:
Второй вариант проще, я так понял должно работать так:
template_preprocess_node(&$variables); где необходимо менять значение $variables

Не понял, что Вы показали Smile Должно работать также, как и в коде на странице описания template_preprocess_node.

Без знаний php и Drupal API Вы, увы, с этой задачей не справитесь.

Аватар пользователя CSoft CSoft 30 января 2014 в 2:32

Если есть знания php, то уже проще. Поставьте модуль devel и через его функцию dpm посмотрите содержимое массивов-переменных. Много вопросов сразу отпадёт.

Аватар пользователя CSoft CSoft 30 января 2014 в 2:51

Кстати, ещё идея родилась, если нужно обойтись минимумом знаний.

У нас ведь есть старый добрый модуль Token! Можно сделать подстановку в текст ноды токенов, которые при показе анонса станут ссылкой на ноду и заголовком. Каким это модулем делается - не знаю, сталкиваться не приходилось. Но при быстром поиске глаз пал на вот этот: token_filter. Попробуйте покопать в этом направлении.

И тогда анонс нужно будет оформить типа так, грубо пишу:

<a href="[node-url]"><img src="ссылка_на_картинку" alt="[node-title]" /></a>

Аватар пользователя CSoft CSoft 30 января 2014 в 2:57

Есть ещё вариант "в лоб". Создать конкретное cck-поле для картинки. А дальше уже вывод картинки прекрасно темизируется в тизере и делается ссылкой на ноду, да с нужным alt'ом. При этом ещё и картинки можно будет с помощью imagecache сделать все красиво одинакового размера.

Всё, пойду я, вариантов для размышления дал достаточно Smile Их на самом деле всегда много.

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 3:25

Да, как раз и использую token_filter и token_custom. Но token_filter использует только токены Global. А token_custom позволяет создавать токены Global. Код, который рассматривали выше, я встраивал через token_custom и используя token_filter, вставлял в нужные места анонса, но код так и не заработал.
В данном случае [node-url] и [node-title] не работают, т.к не относятся к "token Global".
Спасибо, за помощь.. (продолжаю поиски)

Аватар пользователя CSoft CSoft 30 января 2014 в 3:24

"MasterTrend" wrote:
Да, как раз и использую token_filter и token_custom

А сразу Вы никак не могли этого написать? Тема бы сократилась в 4 раза при этом!

Ок, поставил для интереса token_custom. Захожу на страницу

admin/build/tokens/create

Если выбрать тип "материал" и в коде вернуть такой результат:

return $node->title;

Токен покажется при вставке его в текст и будет работать?

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 3:34

Для того чтобы token_filter отобразил token_custom нужен тип "Глобальный", значение return $node->title; работает только в теле ноды, но на странице термина нет, вот я и мудрил с тем кодом..

Аватар пользователя CSoft CSoft 30 января 2014 в 3:44

"MasterTrend" wrote:
Только код чуть сложнее для выводе в теле ноды:

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

"MasterTrend" wrote:
if ( (arg(0) == 'node') && is_numeric($nid = arg(1)) ) {
$node = node_load($nid);
print $node->title;
}

Сокращайте код:

if ($node = menu_get_object()) {
  return $node->title;
}
Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 3:49

Этот код:
<?php
if (arg(0) == 'taxonomy' && is_numeric($tid = arg(2)) {
$result = db_query("SELECT nid FROM {term_node} WHERE term_node.tid=%d',$tid");
$nids = array();
while ($row = db_fetch_object($result)) {
$nids[] = $row->nid;
}
foreach($nids as $nid){
$node = node_load($nid);
print $node->title;
}
}
?>
как раз и должен был вернуть нужный nid и вывести title

Аватар пользователя CSoft CSoft 30 января 2014 в 3:51

"MasterTrend" wrote:
как раз и должен был вернуть нужный nid и вывести title

С чего это вдруг?

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

Аватар пользователя CSoft CSoft 30 января 2014 в 3:57

Возьмите мой первый или второй метод. Сделайте программно эту замену через str_replace и все дела. Вы дольше ищете.

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 4:02

Да, я понял, что нужно в эту сторону посмотреть.. Просто это мне не знакомо пока.
Буду благодарен за примерный кусок кода для этих целей..
В любом случае, спасибо за консультацию)

Аватар пользователя CSoft CSoft 30 января 2014 в 4:04

Один вопрос: модуль сделать сумеете? Просто создать 2 файла: info и module, но правильно оформить первый.

Аватар пользователя CSoft CSoft 30 января 2014 в 4:11

Хотя, ладно. Вариант "на лету". В файл своей темы (template.php) добавляем:

function phptemplate_preprocess_node(&$variables) {
  $variables['teaser'] = str_replace('[node-url]', $variables['node_url'], $variables['teaser']);
  $variables['teaser'] = str_replace('[node-title]', $variables['title'], $variables['teaser']);
}

Сбрасываем кэш.

Код в действии не проверял и написан в блокноте. Вроде должен работать, проверьте. Для прикола пусть наши подстановки будут в формате токенов: [node-url] и [node-title] Smile Это не важно.

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 4:28

С созданием модуля справлюсь (по аналогии с имеющимися - Сtrl C <-> Сtrl V, ну и редактируем) ..
Этот вариант попробую обязательно и отпишусь, только чуть позже.
Спасибо огромное)

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 12:56

Что-то не так в этом коде - идею понял (в функции находится $variables['teaser'] и в ней [node-url] меняется на $variables['node_url'], но ошибку пока не нашел. Выводится в анонсе [node-url] без замены (кэш чистил).

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 19:48

Итого:

function phptemplate_preprocess_node(&$variables) {
$variables['content'] = str_replace('[adress]', $variables['node_url'], $variables['content']);
$variables['content'] = str_replace('[text]', $variables['title'], $variables['content']);
}
уже пользуюсь)

Аватар пользователя MasterTrend MasterTrend 30 января 2014 в 19:58

С переменной "teaser" тоже кое-что творилось сайтом, это подсказывало, что код работает, но не совсем верно. Ну а дальше, интуитивно, по содержимому функции phptemplate_preprocess_node довел до конца.
Благодарю)