Есть хороший снип. В отличии от вьюсовских фильтров, ищет совпадения всех терминов у ноды, а не хотя бы одного
Вот снип
<?php if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) {
$num_nodes = 5; //Максимальное количество выводимых нод с похожими терминами.
$nid = (int)arg(1);
$terms = taxonomy_node_get_terms(node_load($nid));
foreach($terms as $term){
$sql = "SELECT DISTINCT n.title, n.nid, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE n.status = 1 AND tn.tid = ". $term->tid ." AND n.nid != ". $nid ." ORDER BY n.created DESC LIMIT $num_nodes";
$result = db_query(db_rewrite_sql($sql));
$output = node_title_list($result);
}
return $output;
}?>
$num_nodes = 5; //Максимальное количество выводимых нод с похожими терминами.
$nid = (int)arg(1);
$terms = taxonomy_node_get_terms(node_load($nid));
foreach($terms as $term){
$sql = "SELECT DISTINCT n.title, n.nid, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE n.status = 1 AND tn.tid = ". $term->tid ." AND n.nid != ". $nid ." ORDER BY n.created DESC LIMIT $num_nodes";
$result = db_query(db_rewrite_sql($sql));
$output = node_title_list($result);
}
return $output;
}?>
в 7-ке, Call to undefined function taxonomy_node_get_terms() выдает. Подскажите, что поменять надо, чтоб заработало
Комментарии
http://xandeadx.ru/blog/drupal/234
может поможет)
http://drupal.org/node/909968
views 3 в drupal 7 позволяет делать такое :
Filter to items that share all terms
Filter to items that share any term
Так, ща буду разбираться
сниппет андида, вызывает
Cannot redeclare sevportal_preprocess_node() (previously declared in templete.php
Тогда получится, что если не найдет со всеми терминами, не выведет вообще ничего? хорош б что б ранжировалось по релевантности. Нету ноды с тремя терминами, вывел с двумя и тд
Так, код в камментах у андеда, я таки добавил в template.php
Но, как его собственно в ноде выводить?
function [your_theme]_preprocess_node(&$vars) {
if (!empty($vars['field_tags'])) {
if (!$vars['page'] || !$vars['node'] || !count($vars['field_tags'])) {
return;
}
$tids = array();
foreach ($vars['field_tags'] as $tag) {
$tids[] = $tag['tid'];
}
$query = db_select('node', 'n');
$query->fields('n', array('nid', 'title'));
$query->addExpression('COUNT(*)', 'hits');
$query->leftJoin('taxonomy_index', 'ti', 'n.nid = ti.nid');
$query->condition('n.type', $vars['type']);
$query->condition('n.status', NODE_PUBLISHED);
$query->condition('ti.tid', $tids, 'IN');
$query->condition('n.nid', $vars['nid'], '<>');
$query->groupBy('n.nid');
$query->orderBy('hits', 'DESC');
$query->orderBy('n.created', 'DESC');
$query->range(0, 4);
$vars['content']['similar'] = node_title_list($query->execute(), 'Похожие материалы:');
$vars['content']['similar']['#weight'] = 2;
}
}
[18:03:58] valeratal: вставил в темплейт пхп. И чего?
[18:04:10] valeratal: надо ж как то ноде сказать, в каком месте выводить?
Если я правильно понял, содержимое будет в переменной $content, возможно даже в $similar.
<?php
echo "<pre>";
print_r($content);
echo "</pre>";
?>
Если никто не отпишется - позже посмотрю и скажу как выводить.
если я правильно понял ,то оно будет полем с тайтлом "Похожие материалы:"
сменил "field_tags" на "taxonomy_vocabulary_1" (название поля с тэгами), но пока без изменений
Такой код у меня в теплейтпхп
$variables['submitted'] = t('published by !username on !datetime', array('!username' => $variables['name'], '!datetime' => $variables['date']));
if ($variables['view_mode'] == 'full' && node_is_page($variables['node'])) {
$variables['classes_array'][] = 'node-full';
}
if (!empty($vars['field_tags'])) {
if (!$vars['page'] || !$vars['node'] || !count($vars['taxonomy_vocabulary_1'])) {
return;
}
$tids = array();
foreach ($vars['taxonomy_vocabulary_1'] as $tag) {
$tids[] = $tag['tid'];
}
$query = db_select('node', 'n');
$query->fields('n', array('nid', 'title'));
$query->addExpression('COUNT(*)', 'hits');
$query->leftJoin('taxonomy_index', 'ti', 'n.nid = ti.nid');
$query->condition('n.type', $vars['type']);
$query->condition('n.status', NODE_PUBLISHED);
$query->condition('ti.tid', $tids, 'IN');
$query->condition('n.nid', $vars['nid'], '<>');
$query->groupBy('n.nid');
$query->orderBy('hits', 'DESC');
$query->orderBy('n.created', 'DESC');
$query->range(0, 4);
$vars['content']['similar'] = node_title_list($query->execute(), 'Похожие материалы:');
$vars['content']['similar']['#weight'] = 2;
}
}
В ноде обычно стоит render($content) - если он есть, то поле должно вывестись без какой либо правки.
Также можно вывести с помощью кода
<?php render($content['similar']); ?>
В коде для template.php замени все переменные с $variables на $vars.
да вроде все есть, добавил и рендер контент симулар
но пока без изменений
Должно работать.
1) В типе материала посмотри, есть ли дополнительное поле со ссылкой на термин (у меня оно называется field_SITE_CATEGORIES).
Вот мои настройки для него:
Название: Категории
Имя: field_SITE_CATEGORIES
Поле!!!: Ссылка на термин
Виджет: Флажки/переключатели
2) Далее копируешь ниженаписанный код и переименовываешь field_SITE_CATEGORIES на своё field_что-то_там
<?php
function sevportal_preprocess_node(&$vars) {
$vars['submitted'] = t('published by !username on !datetime', array('!username' => $vars['name'], '!datetime' => $vars['date']));
if ($vars['view_mode'] == 'full' && node_is_page($vars['node'])) {
$vars['classes_array'][] = 'node-full';
}
if (!empty(
$vars['field_SITE_CATEGORIES'])) {if (!$vars['page'] || !$vars['node'] || !count($vars['field_SITE_CATEGORIES'])) {
return;
}
$tids = array();
foreach ($vars['field_SITE_CATEGORIES'] as $tag) {
$tids[] = $tag['tid'];
}
$query = db_select('node', 'n');
$query->fields('n', array('nid', 'title'));
$query->addExpression('COUNT(*)', 'hits');
$query->leftJoin('taxonomy_index', 'ti', 'n.nid = ti.nid');
$query->condition('n.type', $vars['type']);
$query->condition('n.status', NODE_PUBLISHED);
$query->condition('ti.tid', $tids, 'IN');
$query->condition('n.nid', $vars['nid'], '<>');
$query->groupBy('n.nid');
$query->orderBy('hits', 'DESC');
$query->orderBy('n.created', 'DESC');
$query->range(0, 4);
$vars['content']['similar'] = node_title_list($query->execute(), 'Похожие материалы:');
$vars['content']['similar']['#weight'] = 2;
}
}
?>
Ага, спасибо, разобрался
Осталось 2 траблы
1. Заменить h3 на что нить другое
в блоге андеда вариант
$vars['content']['similar']['#prefix'] = '<i>Похожие материалы</i>';
Но если поменять, то перестает работать
2. Почему то, вставляется между выводами тегов двух словарей. Правильно ли я понимаю, что зависит от последней строчки, где weight?
Попробуй заменить 2 строки из шаблона выше, на эти 3.
<?php
$vars
['content']['similar'] = node_title_list($query->execute());$vars['content']['similar']['#weight'] = 2;
$vars['content']['similar']['#prefix'] = '<i>Похожие материалы</i>'; ?>
хм, уменьшив weight до 1. полезло вверх
странно, что "2" не работает как надо, в весах полей, поставил для терминов большее значение (3,4 и далее), однако все равно, вывод похожих влезает между ними
Вес смотри на соседней вкладке управление отображением полей.
Точно, ступил, отображение теперь ж в другом месте
осталось с h3 разобраться
у андеда предлагается (если я правильно понял)
$vars['content']['similar'] = node_title_list($query->execute(), 'Похожие материалы:');
поменять его на
$vars['content']['similar']['#prefix'] = '<i>Похожие материалы</i>';
однако, тогда список не подгружается. хотя заголовок в италлике становится
Код написан выше - используй его
по вьюхам, докладываю
Filter to items that share all terms
грузит только точное совпадение. Даже если условия соответствует только 1 нода
Filter to items that share any term
грузит все что ни попадя
Вот бы, грузило сначало точное совпадение, а потом уж с любым термином
да это уж работает, спасибо
я заголовок "Похожие материалы" хочу не в H3, а в более уместном стиле
Опубликовано K0r5hun в вс, 25/12/2011 - 20:56.
Замени 2 строки из template.php на 3 строки из того сообщения.
Это как раз, чтобы заголовок в уместном стиле отображался.
$vars['content']['similar']['#weight'] = 2;
$vars['content']['similar']['#prefix'] = '<i>Похожие материалы</i>';
Поменял, счастье есть, большое спасибо, все работает
Нужно получить значения нод "похожих материалов". Сейчас значения выводятся с помощью views.
Подскажите, как правильно приведенный код по ссылке переделать в сниппет.
если выводит вьюс, то зачем вам сниппет?
мне нужно получить значения, чтобы потом их использовать в Google chart