Добавляем капчу в комментарии для движка InstantCMS 2.6.1

+9
2.53K
Доброй ночи всем. Сегодня получил сообщение в лс с просьбой объяснить чем же отличается хак на добавление капчи для гостей в комментарии для версии 2.5.1 от хака для версии 2.6.х, так как в этой версии мною ранее описаный метод не работает. В связи с этим решил посмотреть что у меня на сайте творится. Оказывается что мой хак после обновы движка вообще слетел, так что азарат был не только в том чтобы понять чем отличается, но и в том чтобы вернуть на свой сайт хак.

И так приступим!

1. Открываем файл по пути "/system/languages/ru/controllers/comments/comments.php". В конце файла добавляем две строки:
  1. define('LANG_COMMENTS_CAPCHA_FOR_GUESTS', 'Показывать капчу гостям');
  2. define('LANG_COMMENTS_CAPCHA_FOR_GUESTS_HINT', 'Отображать капчу при добавлении комментариея гостем чтобы избежать спама в комментариях');
Дальше открываем файл по пути "/system/languages/en/controllers/comments/comments.php" и в конце файла добавляем
  1. define('LANG_COMMENTS_CAPCHA_FOR_GUESTS', 'Show CAPTCHA for guests');
  2. define('LANG_COMMENTS_CAPCHA_FOR_GUESTS_HINT', 'Show the captcha by adding a guest commentary to avoid comment spam');
2. Дальше открываем файл по пути: "/system/controllers/comments/backend/forms/form_options.php". После 24 строки(после блока
  1. new fieldCheckbox('is_guests', array(
  2. 'title' => LANG_COMMENTS_OPT_IS_GUESTS,
  3. 'hint' => LANG_COMMENTS_OPT_IS_GUESTS_HINT,
  4. )),
вставляем
  1. new fieldCheckbox('capcha_for_guests', array(
  2. 'title' => LANG_COMMENTS_CAPCHA_FOR_GUESTS,
  3. 'hint' => LANG_COMMENTS_CAPCHA_FOR_GUESTS_HINT,
  4. )),
Этим мы добавляем новую опцию в админке комментариев.

3. Теперь идём в файл "/templates/имя_используемого_шаблона(исходный шаблон — default)/controllers/comments/list.tpl.php". После блока:
  1. <?php // Шаблон списка комментариев и формы добавления //
  2.  
  3. $this->addJS('templates/default/js/jquery-scroll.js');
  4. $this->addJS('templates/default/js/comments.js');
  5. $is_guests_allowed = !empty($this->controller->options['is_guests']);
  6. $is_karma_allowed = $user->is_logged && !cmsUser::isPermittedLimitHigher('comments', 'karma', $user->karma);
  7.  
  8. ?>
вставляем

  1. <?php $captcha_for_guests = cmsEventsManager::hook('captcha_html'); ?>
  2. <?php $enable_capcha = !empty($this->controller->options['capcha_for_guests']); ?>
и в этом же файле после 94-ой строки вроде:

  1. <?php echo $user->is_logged ? html_editor('content') : html_textarea('content'); ?>
вставляем:
  1. <?php if (!$user->is_logged && $enable_capcha)
  2. {
  3. echo $captcha_for_guests;
  4. } ?>
4. Теперь открываем файл "/system/controllers/comments/actions/submit.php". После строк:

  1. $csrf_token = $this->request->get('csrf_token', '');
  2. $target_controller = $this->request->get('tc', '');
  3. $target_subject = $this->request->get('ts', '');
  4. $target_id = $this->request->get('ti', '');
  5. $target_user_id = $this->request->get('tud', '');
  6. $parent_id = $this->request->get('parent_id', 0);
  7. $comment_id = $this->request->get('id', 0);
  8. $content = $this->request->get('content', '');
вставляем:

  1. $enable_capcha = !empty($this->controller->options['capcha_for_guests']);
после 138 строки:
  1. if ($is_guest){
  2. $comment['author_name'] = $author_name;
  3. $comment['author_email'] = $author_email;
  4. }
вставляем:
  1. if ($is_guest && $enable_capcha)
  2. {
  3. $is_captcha_for_comments_valid = cmsEventsManager::hook('captcha_validate', $this->request);
  4. if (!$is_captcha_for_comments_valid)
  5. {
  6. $result_capcha_invalid = array(
  7. 'error' => 'capcha_invalid',
  8. 'message' => LANG_CAPTCHA_ERROR
  9. );
  10. return $this->cms_template->renderJSON($result_capcha_invalid);
  11. }
  12. }
Здесь мы смотрим включена ли капча и если включена, то проверяем правильно ли она разгадана, если да, то добавляем комментарий, если нет то выбрасываем сообщение об ошибке.

Демо

Отличие оказалось основное в четвёртом шаге, кто читал мой пост о прошлой версии сразу его увидит. Файлы обновлённые залью попозже.

Всем спасибо за внимание, если помог — плюсик в карму или к записи.
+2
Sergon Sergon 7 лет назад #
Благодарю! необходимая вещь!

Еще от автора

InstantCMS Client Lite
Доброго времени суток.
Новая версия Crotate 2.0.0
Компонент «CRotate» предназначен для ротации баннеров по геолокации.
CRotate — Ротатор баннеров по странам
Компонент «CRotate» предназначен для ротации баннеров по странам.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.