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