Подсказки помогающие избежать создания одинаковых тем на форуме 1.X

1278
Точно не знаю зачем оно мне надо, ни на одном из моих сайтов форум не является местом оживлённым.
Но тааак приспичило довести эту затею до конца, спортивный интерес.
Вроде удалось добиться оптимального результата оптимальным путём, на пути к нему я пересмотрел несколько вариантов реализации.

Суть фишки. Когда пользователь создаёт новую тему и вбивает её название, если в базе форума есть темы с очень похожими названиями, ему здесь же предлагается поискать возможно готовое решение ДО ТОГО как он создаст эту тему. А не после, как это делает плагин "похожие темы" присутствующий например на форуме этого сайта. Все ссылки на похожие темы открываются в новой вкладке и если окажется что там не совсем то что нужно пользователю, он может вернуться к созданию своей тему. Если подсказки дали ему верное направление, он может продолжить ранее начатую тему (если конечно она не закрыта) или просто получить там ответ.

Вот как это выглядит.

Подсказки помогающие избежать создания одинаковых тем на форуме


В принципе, живое демо доступно на форуме по ссылке http://remix-os.ru/forum можете попробовать смоделировать создание новой темы и вбить в поле названия темы например слово "Установка". Только прошу особо не мусорить.

Реализация.

В шаблон com_forum_add.tpl

в условии

Код PHP:
  1. {if $do == 'newthread'}
  2. ....
  3. {/if}

перед

Код PHP:
  1. {if}
вставил ajax функцию которая перехватывает вбиваемый заголовок создаваемой темы и после того как курсор покидает поле ввода отправляет запрос для поиска похожих тем

Код PHP:
  1. <script type="text/javascript">
  2. function AjaxFormRequest(topictitle) {
  3. var title = $('input[name*="title"]').val();
  4. $.ajax({
  5. type: "POST",
  6. url: "",
  7. data: { title: title },
  8. success: function(relposts){
  9. var text=$(relposts).find("#rrpostn").html();
  10. $('#relative').html(text);
  11. }
  12. });
  13.  
  14. }
  15. </script>
  16. <div id="relative"></div>

В этом же файле в
Код PHP:
  1. <input type="text" name="title" class="text-input" id="title" style="width: 350px" value="{$thread.title|escape:html}" />
добавил

Код PHP:
  1. onblur="AjaxFormRequest('topictitle')"
получилось

Код PHP:
  1.  
  2. <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

где нибудь после
Код PHP:
  1.  
  2. $forum = $model->getForum($id);
  3.  
  4. if(!$forum) { cmsCore::error404(); }
  5.  
  6. if(!cmsCore::checkContentAccess($forum['access_list'])) {
  7.  
  8. cmsPage::includeTemplateFile('special/accessdenied.php');
  9.  
  10. return;
  11.  
  12. }
вставил код который собственно принимает запрос осуществляет поиск похожих тем и отдаёт ответ.

Код PHP:
  1. $relquery = cmsCore::request('title', 'str', '');
  2.  
  3. if($relquery&&$relquery !=''){
  4. $inDB = cmsDatabase::getInstance();
  5. $sql = "SELECT * FROM `cms_forum_threads` WHERE MATCH(title) AGAINST ('$relquery') LIMIT 5";
  6. $rs = $inDB->query($sql);
  7.  
  8. if($inDB->num_rows($rs)){
  9.  
  10. $rellist = '<div><div id="rrpostn"><div><h3>Возможно интересующий вас вопрос уже обсуждался в одной из этих тем:</h3></div>';
  11.  
  12. while ($relitem = $inDB->fetch_assoc($rs)){
  13. $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>';
  14. }
  15. $rellist .= '</div></div>';
  16. echo $rellist;
  17. }
  18. }

Стили можно добавить в css файл


Код PHP:
  1. #relative h3{
  2. font-weight:bold; font-size:16px; color:#191919;
  3. }
  4.  
  5. .rellist{
  6. padding:5px 0 5px 0;
  7. margin-top:5px;
  8. border-bottom:1px dotted silver;
  9. }
  10.  
В принципе всё.

Побочных эффектов вроде не вижу.

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

Зачем это надо? Ну не знаю, каждый решает для себя, надо или не надо. Мне просто было интересно решить задачку. Ну и часто бывает, что ответ приходит ДО того как к нему находится вопрос) Возможно пригодится.
Сообщение об ошибке 404 в основном дизайне сайта и релевантные подсказки | Аватары пользователей в ленте активности
Комментарии (7)
vikont 25 сентября 2017 в 02:08 0
Отлично! И срочно на этот форум!
Зачем это надо? Ну не знаю, каждый решает для себя, надо или не надо. Мне просто было интересно решить задачку. Ну и часто бывает, что ответ приходит ДО того как к нему находится вопрос) Возможно пригодится.
Шутите? Это же решение быстрого поиска нужной информации и одновременно "Администратор" оптимизирующий работу форума!

Естественно возникает вопрос: а если пользователь ошибся разделом? Ведь тема создается в уже выбранном пользователем разделе, а не вообще на форуме. Или поиск делается по всей базе? Если так то еще бы показывала разделы...
В любом случае респект!
Нил™ 25 сентября 2017 в 13:04 0
В том виде как сейчас - поиск ведётся по всем разделам.
Что бы поиск вёлся только по тому разделу в котором создаётся тема можно
Код PHP:
  1.  
  2. $sql = "SELECT * FROM `cms_forum_threads` WHERE MATCH(title) AGAINST ('$relquery') LIMIT 5";
заменить на это

Код PHP:
  1. $sql = "SELECT * FROM `cms_forum_threads` WHERE forum_id = '{$forum['id']}' AND MATCH(title) AGAINST ('$relquery') LIMIT 5";
Указать название форума не сложно.
Нужно вместо этого

Код PHP:
  1. $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>';
Указать так

Код PHP:
  1. $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>
  2. <div style="font-size:11px; color:gray;">'.$forum['title'].'</div></div>';
Получается так

Нил™ 25 сентября 2017 в 13:17 0
Протупил. В предыдущем комментарии есть ошибка. Насчет показа названия форума. Выводится название того форума в котором создаётся тема.

Что бы выводить название форума в котором содержится похожая тема
нужно это
Код PHP:
  1. $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>';
  2.  

заменить на это

Код PHP:
  1.  
  2. $relforumtitle = $inDB->get_field('cms_forums', "id = '{$relitem['forum_id']}'", 'title');
  3. $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>
  4. <div style="font-size:11px; color:gray;">'.$relforumtitle.'</div></div>';
Теперь правильно))
Спойлер
Dina 25 сентября 2017 в 17:10 +2
Спасибо за то что поддерживате 1 ветку. Хорошая доработка, воспользуюсь)
Dina 25 сентября 2017 в 17:12 0
Сделал бы еще кто нибудь уведомления для юзеров. Например, ответил кто то в группе юзера - ему пришло уведомление (мол ответили) и так далее. И все эти уведомления вывести на значек например, нажал и посмотрел.
Melon 25 сентября 2017 в 20:13 0
Очень полезное решение!
@ivanpolyakov 10 декабря 2017 в 10:37 0
Спасибо. Полезное дополнение!

Работает на 10.7

А как сделать модуль "похожие темы"?