Помогите переделать снипет для вывода похожих нод (по терминам) для 7-ки

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

Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 14:25

Есть хороший снип. В отличии от вьюсовских фильтров, ищет совпадения всех терминов у ноды, а не хотя бы одного

Вот снип

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

в 7-ке, Call to undefined function taxonomy_node_get_terms() выдает. Подскажите, что поменять надо, чтоб заработало

Комментарии

Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 17:38

Так, ща буду разбираться

сниппет андида, вызывает
Cannot redeclare sevportal_preprocess_node() (previously declared in templete.php

"drupby" wrote:
Filter to items that share all terms

Тогда получится, что если не найдет со всеми терминами, не выведет вообще ничего? хорош б что б ранжировалось по релевантности. Нету ноды с тремя терминами, вывел с двумя и тд

Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 18:04

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: надо ж как то ноде сказать, в каком месте выводить?

Аватар пользователя K0r5hun K0r5hun 25 декабря 2011 в 18:16

Если я правильно понял, содержимое будет в переменной $content, возможно даже в $similar.

<?php
echo "<pre>";
print_r($content);
echo 
"</pre>";
?>

Если никто не отпишется - позже посмотрю и скажу как выводить.

Аватар пользователя drupby drupby 25 декабря 2011 в 18:15

"K0r5hun" wrote:
Если я правильно понял, в ноде содержимое будет в переменной $content, возможно даже в $similar.

если я правильно понял ,то оно будет полем с тайтлом "Похожие материалы:"

Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 18:34

Такой код у меня в теплейтпхп

function sevportal_preprocess_node(&$variables) {
  $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;
 
        }
   
}
Аватар пользователя K0r5hun K0r5hun 25 декабря 2011 в 19:30

В ноде обычно стоит render($content) - если он есть, то поле должно вывестись без какой либо правки.
Также можно вывести с помощью кода
<?php render($content['similar']); ?>

В коде для template.php замени все переменные с $variables на $vars.

Аватар пользователя K0r5hun K0r5hun 25 декабря 2011 в 21:32

Должно работать.
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(04);
 
    
$vars['content']['similar'] = node_title_list($query->execute(), 'Похожие материалы:');
    
$vars['content']['similar']['#weight'] = 2;
 
  }
}
?>
Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 21:32

Ага, спасибо, разобрался

Осталось 2 траблы

1. Заменить h3 на что нить другое

в блоге андеда вариант

$vars['content']['similar']['#prefix'] = '<i>Похожие материалы</i>';

Но если поменять, то перестает работать

2. Почему то, вставляется между выводами тегов двух словарей. Правильно ли я понимаю, что зависит от последней строчки, где weight?

Аватар пользователя K0r5hun K0r5hun 25 декабря 2011 в 21:56

Попробуй заменить 2 строки из шаблона выше, на эти 3.

<?php

  $vars

['content']['similar'] = node_title_list($query->execute());
  
$vars['content']['similar']['#weight'] = 2;
  
$vars['content']['similar']['#prefix'] = '<i>Похожие материалы</i>';

?>
Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 21:36

хм, уменьшив weight до 1. полезло вверх

странно, что "2" не работает как надо, в весах полей, поставил для терминов большее значение (3,4 и далее), однако все равно, вывод похожих влезает между ними

Аватар пользователя K0r5hun K0r5hun 25 декабря 2011 в 22:00

Valeratal wrote:
хм, уменьшив weight до 1. полезло вверх

странно, что "2" не работает как надо, в весах полей, поставил для терминов большее значение (3,4 и далее), однако все равно, вывод похожих влезает между ними

Вес смотри на соседней вкладке управление отображением полей.

Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 22:07

Точно, ступил, отображение теперь ж в другом месте

осталось с h3 разобраться

у андеда предлагается (если я правильно понял)

 $vars['content']['similar'] = node_title_list($query->execute(), 'Похожие материалы:');

поменять его на

$vars['content']['similar']['#prefix'] = '<i>Похожие материалы</i>';

однако, тогда список не подгружается. хотя заголовок в италлике становится Smile

Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 22:12

по вьюхам, докладываю

Filter to items that share all terms
грузит только точное совпадение. Даже если условия соответствует только 1 нода

Filter to items that share any term
грузит все что ни попадя

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

Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 22:14

"K0r5hun" wrote:
Код написал выше - используй его :)

да это уж работает, спасибо

я заголовок "Похожие материалы" хочу не в H3, а в более уместном стиле

Аватар пользователя K0r5hun K0r5hun 25 декабря 2011 в 22:17

Valeratal wrote:
"K0r5hun" wrote:
Код написал выше - используй его :)

я заголовок "Похожие материалы" хочу не в H3, а в более уместном стиле

Опубликовано K0r5hun в вс, 25/12/2011 - 20:56.
Замени 2 строки из template.php на 3 строки из того сообщения.
Это как раз, чтобы заголовок в уместном стиле отображался.

Аватар пользователя Valeratal Valeratal 25 декабря 2011 в 22:22
$vars['content']['similar'] = node_title_list($query->execute());
  $vars['content']['similar']['#weight'] = 2;
  $vars['content']['similar']['#prefix'] = '<i>Похожие материалы</i>';

Поменял, счастье есть, большое спасибо, все работает Smile

Аватар пользователя владимирович владимирович 13 декабря 2012 в 19:08

"q2_faith" wrote:
http://xandeadx.ru/blog/drupal/234
может поможет)

Нужно получить значения нод "похожих материалов". Сейчас значения выводятся с помощью views.
Подскажите, как правильно приведенный код по ссылке переделать в сниппет.

Аватар пользователя q2_faith q2_faith 13 декабря 2012 в 19:19

"владимирович" wrote:
Подскажите, как правильно приведенный код по ссылке переделать в сниппет.

если выводит вьюс, то зачем вам сниппет?