Вы не зашли.
Логически плагин состоит из 2х частей:
1. Расчёт похожести новостей
2. Отображение списка "похожих" внутри целевой новостиПохожесть
Обновление происходит в момент редактирования/добавления новости.
Для неё (и всех "похожих" на неё) происходит пересчёт таблицы индексов (ng_similar_index).
Функции:// Reset linked news plugin_similar_resetLinked($newsID); // Reset news with the same tags [ AFTER actual edit - new tags ] plugin_similar_reset($newsID);
Сама похожесть определяется в plugin_similar_repopulate(), inc/similar.php, строка ~118:
$list = $mysql->select("select i.newsID, count(i.tagID) as cnt, n.title, n.editdate, n.postdate from ".prefix."_tags_index i left join ".prefix."_news n on n.id = i.newsID where (i.newsID <> ".db_squote($newsID).") and (i.tagID in ( select tagID from ".prefix."_tags_index where newsID = ".db_squote($newsID).") ) group by newsID order by cnt desc");
.. изменяя этот SQL запрос (или заменив его на более сложную логику) можно изменить логику определения степени похожести
Принцип выдачи описан в конфигураторе плагина:
ВНИМАНИЕ! Это - первый этап реализации плагина. Плагин оценивает похожесть новости только по данным, предоставляемым плагином tags (облако тегов). В будущих версиях появится возможность более сложного анализа.
При этом обрати внимание - есть поле dimension, которое позволяет использовать разные механизмы определения похожести.
dimension = 0 - текущий вариант (т.е. по тегам), остальные варианты не используются, при доработке плагина лучше воспользоваться этим полем - это позволит, к примеру, создать собственный принцип определения похожести и при этом сохранить структуру БД и обратную совместимость.Отображение списка
similar.php, начинается с:function showNews($newsID, $SQLnews, &$tvars, $mode = array()) {
дальше всё очевидно и просто.
Переделка
Первое что приходит в голову - начать учитывать не только теги, но и "расстояние во времени" (разницу между временем публикации основной новости и "похожих" на неё) и ввести некий коэффициен.
К примеру, уменьшать степень похожести ("...order by cnt desc") на 10% за каждые 10 дней между новостями, тогда при совпадении 5 тегов, но с разницей в 30 дней новость будет менее "похожей" чем при совпадении 4 тегов, но разницей в 1 день.Аналогично можно ввести какой-либо коэффициент за нахождение новости в той же категории....
В общем, дальше только полёт фантазии.
А после окончания фантазий нам остаётся только взять inc/similar.php, строка ~120:// Populate data for our news for ($i = 0; $i < min(count($list), $count); $i++) { $row = $list[$i]; $mysql->query("insert into ".prefix."_similar_index (newsID, refNewsID, refNewsQuantaty, refNewsTitle, refNewsDate) values (".db_squote($newsID).", ".db_squote($row['newsID']).", ".db_squote($row['cnt']).", ".db_squote($row['title']).", ".db_squote(($row['editdate']>$row['postdate'])?$row['editdate']:$row['postdate']).")"); } foreach ($list as $row) $affectedList [ $row['newsID'] ] = $row['newsID'];
и вписать сюда свой код (задав собственное значение dimension для полного счастья).
А как сделать похожесть по интервалу в дате если в столбце refnewsid записана только 1 новость,каким образом берутся следующие? Или я неправильно понимаю механизм вашего запроса.
Привет форумчане.
Нужен sql запрос такого типа:
По запросу из поиска будет выводиться на каждого автора список категорий,количество новостей которые он запостил в каждую категорию.
Ломаю голову уже 3 дня ничего толкового в голову не пришло.
Помогите пожалуйста.
После обновления сайта с версии 1126 до 1191 перестал работать suggest блок в тэгах при добавлении и редактировании новости.
Подскажите где искать ошибку и как ее исправить?
если я правильно понял там написано что ссылка генерируется через entities.А я делаю плагин без страничек шаблонов. Делаю по типу плагина userlist
Там ссылка на профиль пользователя генерируется таким способом
$alink = checkLinkAvailable('random_news', 'show')?
generateLink('uprofile', 'show', array('name' => $bos['name'], 'id' => $bos['id'])):
generateLink('core', 'plugin', array('plugin' => 'uprofile', 'handler' => 'show'), array('name' => $bos['name'], 'id' => $bos['id']));
$output .= "<td style='$class2' align='center'><a href='http://{$_SERVER['SERVER_NAME']}".$alink."'>$username</a></td>";
Как сделать по этому типу? Подскажите пожалуйста
Здравствуйте.Пишу плагин для вывода статистики пользователей,новостей и т.д.
Немогу разобраться как кидать ссылку на новость.Помогите пожалуйста,вот мой код:
$row2 = $mysql->query("select distinct id,title,views as v_n FROM 2z_news
where from_unixtime(postdate) > '$date1' and FROM_UNIXTIME(postdate) < '$date2'
order by views desc
limit 20");
$output .= "</br>
<tr>
<th colspan='4' style='$class3'>Топ20 новостей</th>
</tr>
<tr>
<th width='20%' style='$class1'>Название</th>
<th width='20%' style='$class1'>Просмотров</th>"
;
while($bos = mysql_fetch_array($row2)) {
$newsname = $bos['title'];
$newsviews = $bos['v_n'];
$output .= "<tr>";
$output .= <<<HTML
<td style='$class2'><div align="center">$newsname</div</td>
<td style='$class2'><div align="center">$newsviews</div</td>
</tr>
HTML;
}