Доброе время суток!
Пытаюсь получить заголовок ноды на странице связаного с нею термина с помощью следующего кода (который пока не работает).
Подскажите, пожалуйста, что не так?
<?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;
}}}
?>
Комментарии
$result=db_query('SELECT nid FROM {term_node} term_node WHERE term_node.tid=%d',$tid)->fetchCol();
$nids = node_load_multiple($result);
вродь так
Хотя лучше так:
$result = db_select('term_node', 't')
->fields('t', array('nid'))
->execute()
->fetchCol();
$nids = node_load_multiple($result);
Полный код такой? - Не хочет работать..
<?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;
}
}
}
?>
блин, запарился, не посмотрел что для 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;
}
}
?>
блин, надеюсь тут уж ничего не упустил)
Продолжу издеваться
https://api.drupal.org/api/drupal/modules%21node%21node.module/function/...
что-то пока не нашел ничего))
лучше сразу поправьте)
node_load_multiple - эта функция появилась в d7.
та блин))
привычка вторая натура)
Красиво), но на 6-ке не работает..
<?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
Мне интересно другое: что за задачу автор себе придумал. На странице термина и без того выводятся ноды с заголовками и прочими прелестями. Что за задумка?
Кстати, вместо вот этого "чуда в перьях" рекомендую посмотреть в сторону [ru-api=menu_get_object]menu_get_object[/ru-api]
Вроде бы все нормально, но вот положительный результат отсутствует пока.. не выводит заголовок..
Работает такой код:
<?php
if (arg(0) == 'taxonomy' && arg(1) == 'term') {
$nid = 89;
$node = node_load($nid);
print $node->title;
}
?>
но хотелось бы получать $nid автоматом..
У меня для термина выводятся анонсы нод. В этих анонсах я коротко описываю сами ноды. Чтобы автоматизировать как-то этот процесс мне нужно получить заголовки нод и их адреса (это на закуску:-)). Но пока не получается..
Извиняюсь, но всё равно ничего не понял В шаблоне ноды для тизера можете подставить всё, что угодно, да и заголовок там есть по умолчанию.
CSoft - выручай, ведь решение уже близко.. как я понимаю)
Я не могу понять задачу, об этом и пишу. Помогать вслепую смысла не вижу.
Ну допустим, в анонсе содержится картинка (нод с анонсами куча), которая будет ссылаться на ноду. Чтобы не вбивать каждый раз урл ноды и не исправлять содержимое поля alt="node_title", нужно получить значения..
Inj - огромное спасибо, мы почти у цели)
Ещё сильнее запутался.
Значит так. Есть нода. У неё есть анонс. В анонсе есть картинка. Картинка должна быть ссылкой на саму ноду и иметь alt с заголовком ноды. Чтобы при выводе в анонсах на странице термина пользователь при клике на картинку попадал на страницу ноды.
Всё верно? Если да - Вы придумали очень странное решение своей проблемы.
Ну, примерно, так.. вместе с картинками может быть просто упоминание "node_title" в анонсе, которое также установится автоматом.. Т.е. анонс будет полностью автоматизирован - написав его один раз - он подойдет для всех нод (при условии, что у меня будут автоматом получатся заголовки и урл-ы нод)
Я и говорю - странным путём Вы пошли.
Что предлагаю я: один раз, перед сохранение ноды, сразу в хуке выполнить все правки, они сохранятся в базе и уже будут готовы для вывода. Не придётся при каждом показе анонса заново формировать все эти вещи.
Смотрите в сторону [ru-api=hook_nodeapi]hook_nodeapi[/ru-api] - presave.
..
Ещё можно в [ru-api=template_preprocess_node]template_preprocess_node[/ru-api] сделать всё то, что Вы хотите. Это будет вариант работы "на лету", выполняющийся каждый раз перед показом ноды. При этом, все переменные у Вас тут уже есть, останется только выполнить необходимые замены в тексте тизера.
Честно, мои знания в api, мягко говоря, не очень.
Я так понимаю первый вариант (сразу в хуке выполнить все правки) более рациональный.. Но не совсем понимаю, что придется поправить и где.
Второй вариант проще, я так понял должно работать следующим образом:
template_preprocess_node(&$variables); где необходимо менять значение $variables
В обоих вариантах делается, по сути, одно и то же. Поэтому я и рекомендую первый, так как один раз выполняется.
Не понял, что Вы показали Должно работать также, как и в коде на странице описания template_preprocess_node.
Без знаний php и Drupal API Вы, увы, с этой задачей не справитесь.
Если есть знания php, то уже проще. Поставьте модуль devel и через его функцию dpm посмотрите содержимое массивов-переменных. Много вопросов сразу отпадёт.
Ладно, будем ознакомиться и копать дальше, спасибо за советы. *решить пока не удалось
Кстати, ещё идея родилась, если нужно обойтись минимумом знаний.
У нас ведь есть старый добрый модуль Token! Можно сделать подстановку в текст ноды токенов, которые при показе анонса станут ссылкой на ноду и заголовком. Каким это модулем делается - не знаю, сталкиваться не приходилось. Но при быстром поиске глаз пал на вот этот: token_filter. Попробуйте покопать в этом направлении.
И тогда анонс нужно будет оформить типа так, грубо пишу:
<a href="[node-url]"><img src="ссылка_на_картинку" alt="[node-title]" /></a>
Есть ещё вариант "в лоб". Создать конкретное cck-поле для картинки. А дальше уже вывод картинки прекрасно темизируется в тизере и делается ссылкой на ноду, да с нужным alt'ом. При этом ещё и картинки можно будет с помощью imagecache сделать все красиво одинакового размера.
Всё, пойду я, вариантов для размышления дал достаточно Их на самом деле всегда много.
Да, как раз и использую token_filter и token_custom. Но token_filter использует только токены Global. А token_custom позволяет создавать токены Global. Код, который рассматривали выше, я встраивал через token_custom и используя token_filter, вставлял в нужные места анонса, но код так и не заработал.
В данном случае [node-url] и [node-title] не работают, т.к не относятся к "token Global".
Спасибо, за помощь.. (продолжаю поиски)
А сразу Вы никак не могли этого написать? Тема бы сократилась в 4 раза при этом!
Ок, поставил для интереса token_custom. Захожу на страницу
admin/build/tokens/create
Если выбрать тип "материал" и в коде вернуть такой результат:
return $node->title;
Токен покажется при вставке его в текст и будет работать?
Для того чтобы token_filter отобразил token_custom нужен тип "Глобальный", значение return $node->title; работает только в теле ноды, но на странице термина нет, вот я и мудрил с тем кодом..
Ага, теперь понятно. Посмотрите, может есть модули, подставляющие токены ноды.
Только код чуть сложнее для выводе в теле ноды:
if ( (arg(0) == 'node') && is_numeric($nid = arg(1)) ) {
$node = node_load($nid);
print $node->title;
}
Модуль пока такой не нашел..
В теле ноды - да, а вот на странице термина ничего не придумать. Фиг знает, какая конкретно сейчас нода выводится, чтобы понять какой заголовок ей нужен.
Сокращайте код:
return $node->title;
}
Этот код:
<?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
но..
С чего это вдруг?
Вы выбрали все ноды этого термина. И что дальше? Откуда Вы знаете, что конкретно такая-то нода сейчас получит при подстановке в тизер из этого списка нужный заголовок?
Возьмите мой первый или второй метод. Сделайте программно эту замену через str_replace и все дела. Вы дольше ищете.
Да, я понял, что нужно в эту сторону посмотреть.. Просто это мне не знакомо пока.
Буду благодарен за примерный кусок кода для этих целей..
В любом случае, спасибо за консультацию)
Один вопрос: модуль сделать сумеете? Просто создать 2 файла: info и module, но правильно оформить первый.
Хотя, ладно. Вариант "на лету". В файл своей темы (template.php) добавляем:
$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] Это не важно.
С созданием модуля справлюсь (по аналогии с имеющимися - Сtrl C <-> Сtrl V, ну и редактируем) ..
Этот вариант попробую обязательно и отпишусь, только чуть позже.
Спасибо огромное)
..
Что-то не так в этом коде - идею понял (в функции находится $variables['teaser'] и в ней [node-url] меняется на $variables['node_url'], но ошибку пока не нашел. Выводится в анонсе [node-url] без замены (кэш чистил).
CSoft - все получилось!
Ваш код заработал (после небольшой игры с переменными).
Спасибо, спасибо, спасибо! ))
Не за что Какой в итоге код получился?
Итого:
function phptemplate_preprocess_node(&$variables) {
$variables['content'] = str_replace('[adress]', $variables['node_url'], $variables['content']);
$variables['content'] = str_replace('[text]', $variables['title'], $variables['content']);
}
уже пользуюсь)
Ещё хотел предложить на всякий случай про переменную content помнить, но Вы сами нашли, хорошо
С переменной "teaser" тоже кое-что творилось сайтом, это подсказывало, что код работает, но не совсем верно. Ну а дальше, интуитивно, по содержимому функции phptemplate_preprocess_node довел до конца.
Благодарю)