Похожие по заголовку материалы

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

Аватар пользователя misterBald misterBald 7 июля 2013 в 17:49

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

1) Думал сделать через Views, но не получается настроить контекстный фильтр. Погуглил по этому поводу - ничего толкового не обнаружил.

2) Знаю как сделать вывод похожих по тегам материалов (через Views). Но материалов очень много и они довольно разнородны - вариант с тегами не подходит. Точнее не подходит вручную прописывать теги. Может как-то можно автоматически прописывать теги на основании слов заголовка? Т.е. если заголовок "Очень интересная статья", то у материала будут теги: очень, интересная, статья.

Комментарии

Аватар пользователя voviko voviko 7 июля 2013 в 18:52
<?php
hook_node_insert
($node) {
$title preg_split ('/\s+/' $node->title) ;
$title implode(',',$title); 

$node node_load($node->nid);
$node->field_tag[LANGUAGE_NONE][0]['value']  = $title;
node_save($node);
}
?>

регулярку доделать, или использовать что то другое.

Аватар пользователя misterBald misterBald 7 июля 2013 в 22:54

Ок, попробую.
Еще вопрос правильно ли понял код:

<?php

hook_node_insert

($node) {
$title preg_split ('/\s+/' $node->title) ;         # достаем заголовок ноды и делим его на слова
$title implode(',',$title);                          # преобразуем набор слов в строчку вида: "слово1,слово2,слово3"

$node node_load($node->nid);                         # загружаем массив данных ноды, основываясь на ее nid
$node->field_tag[LANGUAGE_NONE][0]['value']  = $title# элементу массива field_tag присваиваем значение "слово1,слово2,слово3"
node_save($node);                                      # сохраняем обновленный массив
}

?>

Таким образом при создании ноды теги вводить не надо, они сгенерируются из заголовка при первом же обращении к ноде. Все верно?

Аватар пользователя voviko voviko 7 июля 2013 в 23:05

примерно, я код не тестил.
алгоритм такой:
1. сохранили ноду, и вызвали хук.
2. загрузили сохраненную ноду.
3. преобразовали заголовок в текст через запъятую (как в форме тегов)
4. добавили в загруженную ноду значение созданного поля.
5. сохранили ноду.

потом хаки submit или update, при обновления заголовка.
те хаки вызывают функцию.

Аватар пользователя voviko voviko 7 июля 2013 в 23:09

"voviko" wrote:
<?php

hook_node_insert($node) {
$title = preg_split ('/\s+/' , $node->title) ; # достаем заголовок ноды и делим его на слова
$title = implode(',',$title); # преобразуем набор слов в строчку вида: "слово1,слово2,слово3"

$node = node_load($node->nid); # загружаем массив данных ноды, основываясь на ее nid #Это лишнее
$node->field_tag[LANGUAGE_NONE][0]['value'] = $title; # элементу массива field_tag присваиваем значение "слово1,слово2,слово3"
node_save($node); # сохраняем обновленный массив
}

?>

Аватар пользователя misterBald misterBald 8 июля 2013 в 0:42

Хук не работает. Догадываюсь почему. $node->field_tag - это массив. Т.е. слова, на которые мы поделили заголовок, надо добавлять как элементы массива, а не в формате "слово1,слово2,слово3". Это формат для ручного ввода.
+ Когда мы пишем теги вручную, они автоматически добавляются в словарь тегов. Тоже самое надо делать при генерации тегов на основании заголовка.

Есть мысль, что проще написать js, который при создании нового материала будет брать значение, введенное в поле Заголовок, делить это значение на слова, преобразовывать в формат "слово1,слово2,слово3" и вставлять все это в поле Теги на странице редактирования.