Добро пожаловать на сайт SEDBY

Запрет комментариев

  • 129 просмотров
  • 8 июля, 2024
  • Обновлено: 18 июля, 2024
  • admin
  • Время чтения: 3 минуты
  • 1 (Подробно)

Блокировка комментариев – это проблема, к решению которой приходит любой владелец набирающего популярность сайта с интерактивным функционалом. Чем проще возможность прокомментировать ваш контент, тем более вовлеченными становятся посетители вашего сайта. Соответственно, увеличивается время пребывания на сайте, а поисковые системы повышают вашему проекту карму по такому важному показателю, как пользовательский фактор.

Обо всем этом в теории мы уже рассказали. Настало время обсудить некоторые способы реализации блокировки комментариев на сайте под управлением CMS Cotonti Siena.

Блокируем комментарии в шаблоне

Тот, кто работает с Cotonti на уровне шаблонизатора coTemplate, может решить вопрос вывода комментариев простым способом:

<!-- IF {PAGE_ID} == 13 -->
{PAGE_COMMENTS_DISPLAY}
<!-- ELSE -->
<div class="alert alert-danger">
Комментарии для данной страницы заблокированы
</div>
<!-- ENDIF -->

Но это только при единичном условии. А что делать если блокировать комментарии необходимо для нескольких страниц. Конечно, можно конструировать множественные условия вида:

<!-- IF {PAGE_ID} == 13 OR {PAGE_ID} == 113 -->
{PAGE_COMMENTS_DISPLAY}
<!-- ELSE -->
<div class="alert alert-danger">
Комментарии для данной страницы заблокированы
</div>
<!-- ENDIF -->

Но проще будет создать массив с id страниц, для которых необходимо установить запрет комментариев. Для этого укажем его в PHP-файле темы:

<?php
/* ====================
[BEGIN_COT_THEME]
Name=Ottawa
Version=2.38
Schemes=default:Default
[END_COT_THEME]
==================== */

defined('COT_CODE') or die('Wrong URL');

$banned_ids = [13, 113];

Теперь конструкция в шаблоне будем выглядеть компактнее:

<!-- IF {PHP.banned_ids} HAS {PAGE_ID} -->
<div class="alert alert-danger">
Комментарии для данной страницы заблокированы
</div>
<!-- ELSE -->
{PAGE_COMMENTS_DISPLAY}
<!-- ENDIF -->

Если вам такого решения достаточно, не благодарите. Мы же пойдем дальше.

Программный запрет комментариев

Если задача стоит более серьезная, и вы хотите программно запретить комментарии для конкретных страниц, необходимо использовать для этого переменную $enabled из функции cot_comments_display() "коробочного" плагина Comments.

Для такого варианта нам необходимо создать составной элемент “проектного” плагина с хуком comments.main:

<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=comments.main
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL');

Проблема состоит в том, что из данной локации мы не сможем получить простой доступ к данным страницы: комментарии в Котонти универсальные и могут применяться к любому объекту. Поэтому первым делом определим id и alias нашей страницы с помощью функции cot_import(). Больше нам и не надо:

$al = Cot::$db->prep(cot_import('al', 'G', 'TXT'));
$id = Cot::$db->prep(cot_import('id', 'G', 'INT'));

Теперь сформируем массив с id’s и aliases страниц, где комментарии необходимо запретить и выполним проверку:

<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=comments.main
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL');

$al = Cot::$db->prep(cot_import('al', 'G', 'TXT'));
$id = Cot::$db->prep(cot_import('id', 'G', 'INT'));

$banned_aliases = [
  'somealias',
];

$banned_ids = [
  13,
];

$enabled = (!in_array($al, $banned_aliases) && !in_array($id, $banned_ids));

Если id или alias страницы не входит в массивы, переменная $enabled примет значение true, и будут опубликованы уже имеющиеся комментарии, а также форма добавления нового. В противном случае будет выведено только сообщение о том, что для данного элемента нельзя добавлять комментарии.

Если вместо переменной $enabled использовать $auth_write, то будут выведены уже опубликованные комментарии, но в сообщении будет указано, что добавление доступно только зарегистрированным пользователям. Правда по факту добавить комментарий не сможет даже администратор.

Чтобы исправить это досадное и временное недоразумение без лишних подключений, создадим временную языковую переменную в lang-файле нашей темы:

$L['theme_com_regonly'] = 'Добавление новых комментариев запрещено';

и сошлемся на нее в нашем миниплагине, который теперь будет выглядеть так:

<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=comments.main
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL');

$L['com_regonly'] = $L['theme_com_regonly'];

$al = Cot::$db->prep(cot_import('al', 'G', 'TXT'));
$id = Cot::$db->prep(cot_import('id', 'G', 'INT'));

$banned_aliases = [
  'somealias',
];

$banned_ids = [
  13,
  113,
];

$auth_write = (!in_array($al, $banned_aliases) && !in_array($id, $banned_ids));

У такого варианта есть два главных преимущества:

  1. PHP-код все же выполняется быстрее, чем конструкции шаблонизатора.
  2. Не требуется никаких манипуляций с шаблонами страниц, которых может быть не один и не два. Все работает в пределах TPL-тега {PAGE_COMMENTS_DISPLAY}.

Заключение

Пока что механизм управления выводом комментариев не позволяет организовать идеальный вывод уже опубликованных комментариев и закрыть публикацию новых с выводом соответствующего [правильного] сообщения. Хотя предложенное решение отлично работает, необходимость в манипуляциях с lang-переменной слегка напрягает. Надеюсь в ближайшее время этот вопрос будет решен, и мы получим более гибкий механизм, обеспечивающий запрет комментариев в любой локации сайта и понятное оповещение пользователей.

В предыдущей публикации мы разбирали способы борьбы со спамом в комментариях.

Новый комментарий

Имя:
Для редактирования комментария осталось 10 минут
Блок пользователя
Регистрация на нашем сайте позволит вам общаться на форумах и получить доступ к другому полезному функционалу
Вы вошли как Гость