Запрет комментариев
Популярные запросы: тема Omnis, плагин Pagelist, Cotonti 0.9.25, ЧПУ, Font Face
- 254 просмотра
- 8 июля, 2024
- Обновлено: 18 марта, 2025
- 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));
У такого варианта есть два главных преимущества:
- PHP-код все же выполняется быстрее, чем конструкции шаблонизатора.
- Не требуется никаких манипуляций с шаблонами страниц, которых может быть не один и не два. Все работает в пределах TPL-тега
{PAGE_COMMENTS_DISPLAY}.
Заключение
Пока что механизм управления выводом комментариев не позволяет организовать идеальный вывод уже опубликованных комментариев и закрыть публикацию новых с выводом соответствующего [правильного] сообщения. Хотя предложенное решение отлично работает, необходимость в манипуляциях с lang-переменной слегка напрягает. Надеюсь в ближайшее время этот вопрос будет решен, и мы получим более гибкий механизм, обеспечивающий запрет комментариев в любой локации сайта и понятное оповещение пользователей.
В предыдущей публикации мы разбирали способы борьбы со спамом в комментариях.
Новый комментарий
Ошибка
Выполнено