Точно не знаю зачем оно мне надо, ни на одном из моих сайтов форум не является местом оживлённым.
Но тааак приспичило довести эту затею до конца, спортивный интерес.
Вроде удалось добиться оптимального результата оптимальным путём, на пути к нему я пересмотрел несколько вариантов реализации.
Суть фишки. Когда пользователь создаёт новую тему и вбивает её название, если в базе форума есть темы с очень похожими названиями, ему здесь же предлагается поискать возможно готовое решение ДО ТОГО как он создаст эту тему. А не после, как это делает плагин "похожие темы" присутствующий например на форуме этого сайта. Все ссылки на похожие темы открываются в новой вкладке и если окажется что там не совсем то что нужно пользователю, он может вернуться к созданию своей тему. Если подсказки дали ему верное направление, он может продолжить ранее начатую тему (если конечно она не закрыта) или просто получить там ответ.
Вот как это выглядит.
В принципе, живое демо доступно на форуме по ссылке remix-os.ru/forum можете попробовать смоделировать создание новой темы и вбить в поле названия темы например слово "Установка". Только прошу особо не мусорить.
Реализация.
В шаблон com_forum_add.tpl
в условии
перед
вставил ajax функцию которая перехватывает вбиваемый заголовок создаваемой темы и после того как курсор покидает поле ввода отправляет запрос для поиска похожих тем
В этом же файле вдобавил
получилось
В файле компонента components/forum/fronted.php
где нибудь после
вставил код который собственно принимает запрос осуществляет поиск похожих тем и отдаёт ответ.
Стили можно добавить в css файл
В принципе всё.
Побочных эффектов вроде не вижу.
Если заметили явные косяки, можете отписать.
Если есть идеи по улучшению решения также можете делиться.
Зачем это надо? Ну не знаю, каждый решает для себя, надо или не надо. Мне просто было интересно решить задачку. Ну и часто бывает, что ответ приходит ДО того как к нему находится вопрос) Возможно пригодится.
Но тааак приспичило довести эту затею до конца, спортивный интерес.
Вроде удалось добиться оптимального результата оптимальным путём, на пути к нему я пересмотрел несколько вариантов реализации.
Суть фишки. Когда пользователь создаёт новую тему и вбивает её название, если в базе форума есть темы с очень похожими названиями, ему здесь же предлагается поискать возможно готовое решение ДО ТОГО как он создаст эту тему. А не после, как это делает плагин "похожие темы" присутствующий например на форуме этого сайта. Все ссылки на похожие темы открываются в новой вкладке и если окажется что там не совсем то что нужно пользователю, он может вернуться к созданию своей тему. Если подсказки дали ему верное направление, он может продолжить ранее начатую тему (если конечно она не закрыта) или просто получить там ответ.
Вот как это выглядит.
В принципе, живое демо доступно на форуме по ссылке remix-os.ru/forum можете попробовать смоделировать создание новой темы и вбить в поле названия темы например слово "Установка". Только прошу особо не мусорить.
Реализация.
В шаблон com_forum_add.tpl
в условии
{if $do == 'newthread'} .... {/if}
перед
{if}
<script type="text/javascript"> function AjaxFormRequest(topictitle) { var title = $('input[name*="title"]').val(); $.ajax({ type: "POST", url: "", data: { title: title }, success: function(relposts){ var text=$(relposts).find("#rrpostn").html(); $('#relative').html(text); } }); } </script> <div id="relative"></div>
В этом же файле в
<input type="text" name="title" class="text-input" id="title" style="width: 350px" value="{$thread.title|escape:html}" />
onblur="AjaxFormRequest('topictitle')"
<input type="text" name="title" onblur="AjaxFormRequest('topictitle')" class="text-input" id="title" style="width: 350px" value="{$thread.title|escape:html}" />
В файле компонента components/forum/fronted.php
где нибудь после
$forum = $model->getForum($id); if(!$forum) { cmsCore::error404(); } if(!cmsCore::checkContentAccess($forum['access_list'])) { cmsPage::includeTemplateFile('special/accessdenied.php'); return; }
$relquery = cmsCore::request('title', 'str', ''); if($relquery&&$relquery !=''){ $inDB = cmsDatabase::getInstance(); $sql = "SELECT * FROM `cms_forum_threads` WHERE MATCH(title) AGAINST ('$relquery') LIMIT 5"; $rs = $inDB->query($sql); if($inDB->num_rows($rs)){ $rellist = '<div><div id="rrpostn"><div><h3>Возможно интересующий вас вопрос уже обсуждался в одной из этих тем:</h3></div>'; while ($relitem = $inDB->fetch_assoc($rs)){ $rellist .= '<div class="rellist"><a target="_blank" href="/forum/thread'.$relitem['id'].'.html"><i class="fa fa-hand-o-right" aria-hidden="true"></i> '.$relitem['title'].'</a></div>'; } $rellist .= '</div></div>'; echo $rellist; } }
Стили можно добавить в css файл
#relative h3{ font-weight:bold; font-size:16px; color:#191919; } .rellist{ padding:5px 0 5px 0; margin-top:5px; border-bottom:1px dotted silver; }
Побочных эффектов вроде не вижу.
Если заметили явные косяки, можете отписать.
Если есть идеи по улучшению решения также можете делиться.
Зачем это надо? Ну не знаю, каждый решает для себя, надо или не надо. Мне просто было интересно решить задачку. Ну и часто бывает, что ответ приходит ДО того как к нему находится вопрос) Возможно пригодится.
Реклама #
vikont 7 лет назад #
Естественно возникает вопрос: а если пользователь ошибся разделом? Ведь тема создается в уже выбранном пользователем разделе, а не вообще на форуме. Или поиск делается по всей базе? Если так то еще бы показывала разделы...
В любом случае респект!
Нил™ 7 лет назад #
Что бы поиск вёлся только по тому разделу в котором создаётся тема можно
Нужно вместо этого
Нил™ 7 лет назад #
Что бы выводить название форума в котором содержится похожая тема
нужно это
заменить на это
Dina 7 лет назад #
Dina 7 лет назад #
Melon 7 лет назад #
ivanpolyakov 6 лет назад #
Работает на 10.7
А как сделать модуль "похожие темы"?