Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#1 Re: Страницы плагинов » similar :: Похожие новости » 2014-01-21 19:32:49

vitaly пишет:

Логически плагин состоит из 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 новость,каким образом берутся следующие? Или я неправильно понимаю механизм вашего запроса.

#2 "А как сделать..." » Нужен sql запросик в базу. » 2014-01-21 18:34:55

Lagun
Ответов: 0

Привет форумчане.
Нужен sql запрос такого типа:
По запросу из поиска будет выводиться на каждого автора список категорий,количество новостей которые он запостил в каждую категорию.
Ломаю голову уже 3 дня ничего толкового в голову не пришло.
Помогите пожалуйста.

#3 "У меня не работает..." » Плагин тэгов » 2013-12-26 16:10:10

Lagun
Ответов: 0

После обновления сайта с версии 1126 до 1191 перестал работать suggest блок в тэгах при добавлении и редактировании новости.
Подскажите где искать ошибку и как ее исправить?

#4 Re: "А как сделать..." » Ссылка на новость в плагине » 2013-12-20 17:14:36

если я правильно понял там написано что ссылка генерируется через 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>";
Как сделать по этому типу? Подскажите пожалуйста

#5 "А как сделать..." » Ссылка на новость в плагине » 2013-12-20 10:31:07

Lagun
Ответов: 2

Здравствуйте.Пишу плагин для вывода статистики пользователей,новостей и т.д.
Немогу разобраться как кидать ссылку на новость.Помогите пожалуйста,вот мой код:
                                                   
        $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;
}

Подвал раздела

Работает на FluxBB