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

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

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

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

Иллюстрация


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

Реализация.

В шаблон com_forum_add.tpl

в условии

  1. {if $do == 'newthread'}
  2. ....
  3. {/if}

перед

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

  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>

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

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

  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

где нибудь после
  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. }
вставил код который собственно принимает запрос осуществляет поиск похожих тем и отдаёт ответ.

  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 файл


  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.  
В принципе всё.

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

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

Зачем это надо? Ну не знаю, каждый решает для себя, надо или не надо. Мне просто было интересно решить задачку. Ну и часто бывает, что ответ приходит ДО того как к нему находится вопрос) Возможно пригодится.
0
vikont vikont 6 лет назад #
Отлично! И срочно на этот форум!
Зачем это надо? Ну не знаю, каждый решает для себя, надо или не надо. Мне просто было интересно решить задачку. Ну и часто бывает, что ответ приходит ДО того как к нему находится вопрос) Возможно пригодится.
Шутите? Это же решение быстрого поиска нужной информации и одновременно "Администратор" оптимизирующий работу форума!

Естественно возникает вопрос: а если пользователь ошибся разделом? Ведь тема создается в уже выбранном пользователем разделе, а не вообще на форуме. Или поиск делается по всей базе? Если так то еще бы показывала разделы...
В любом случае респект!
0
Нил™ Нил™ 6 лет назад #
В том виде как сейчас - поиск ведётся по всем разделам.
Что бы поиск вёлся только по тому разделу в котором создаётся тема можно
Код PHP:
  1. $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>';
Получается так

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

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

Работает на 10.7

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

Еще от автора

Капча на сайт или разделы сайта
Если нужно, закрыть весь сайт или некоторые его разделы каптчей.
Пинг поисковых систем для первой ветки
Небольшая интеграция инструментов для пингования, чтобы сделать его чуть удобнее
Генератор карты сайта в формате txt на лету без крона
Вообще то где то тут уже есть вполне рабочие генераторы карты для первой ветки, но этот вариант тоже имеет право быть.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.