Comments: комментарии
Если еще не установлен компонент "Users: зарегистрированные пользователи", то стоит это сделать, иначе вы лишите систему главной функции - возможности управлять комментариями (модерирование). Не считая всех тех преимуществ, которые компонент предоставляет: отмечать комментарии собеседников, просматривать профили, настраивать аватар, редактировать сообщения и др.
У нас есть блок новостей, реализованный с использованием компонента Nodus. Организуем вывод комментариев для них. Воспользуемся компонентом Comments.
Форма добавления комментариев
Откроем файл шаблона отображения одной новости - app/components/Nodus/app/Datatype/News/full.phtml, и перед ссылкой на весь список новостей добавим следующий код:
// app/components/Nodus/app/Datatype/News/full.phtml print $this->comments->draw('news'.$item->id, array( 'type' => 'embedded', ));
где
- news.$item->id - идентификатор комментируемой новости, который представляет собой {material_code}.$item->id.
- {material_code} - код материала, какое-либо мнемоничеcкое имя, обычно совпадающее с видом размещаемого материала.
- $item->id - числовой идентификатор комментируемой сущности в Nodus.
- embedded - режим отображения комментариев (вывод всех сообщений на странице).
Если для вывода комментариев не нужны дополнительные параметры, то второй аргумент может иметь вид строки:
// app/components/Nodus/app/Datatype/News/full.phtml print $this->comments->draw('news'.$item->id, 'embedded');
Попробуем добавить несколько комментариев под новостями. Отметим, что существует возможность вложенного списка комментариев, т.е. можно ответить на предыдущий комментарий.
Изменение режима отображения комментариев
На данный момент их реализовано три:
- embedded. Отображение всех комментариев на странице в виде списка.
- link . На странице выводится только ссылка «Обсуждение» с указанием количества комментариев в скобках. При переходе по ссылке комментарии выводятся на отдельной странице.
- embedded-ajax . На странице отображается ссылка, при нажатии на которую подгружается весь список комментариев на этой же странице.
В принципе, готовых режимов достаточно для решения большинства стандартных задач. Но если потребность в новом режиме так и не отпала, то можно реализовать свой.
Создаем файл /app/components/Comments/app/view/type-<имя пользовательского режима>.phtml. В нем будут доступны все параметры и настройки, которые используются в стандартных режимах, как переменные. Описание настроек и параметров подробнее рассмотрим ниже.
Далее в методе draw() вторым аргументом будем указывать название пользовательского режима.
Постраничный вывод комментариев
Иногда встречается настолько интересный материал, что количество комментариев сильно возрастает. И страница приобретает вид бесконечной ленты записей, что негативно сказывается на визуальном восприятии. Чтобы исправить ситуацию достаточно ограничить количество выводимых записей на странице и включить постраничную навигацию.
Для этого надо передать в метод draw() вторым аргументом массив со следующими параметрами:
- perpage - число комментариев, которые будут отображаться на странице;
- page - адрес текущей страницы
- page_navigator_url - строка с адресом или функция-callback, которая будут формировать адрес следующей страницы.
1. Для режима embedded-ajax постраничная навигация подключается после того, как количество записей станет больше 20. Достаточно передать в массив параметр 'perpage', чтобы ограничить число записей на странице.
// app/components/Nodus/app/Datatype/News/full.phtml print $this->comments->draw('news'.$item->id, array( 'type' =>'embedded-ajax', 'perpage' => 10, ));
2. При использовании режима embedded новости выводятся полным списком на той же странице. Для постраничной навигации необходимо формировать адрес следующей страницы самостоятельно.
// app/components/Nodus/app/Datatype/News/full.phtml print $this->comments->draw('news'.$item->id, array( 'type' => 'embedded', 'perpage' => 10, 'page' => $_GET['comment-page'], 'page_navigator_url' => $item->url . "?comment-page=%", ));
Здесь
- 'page' - получим номер текущей страницы из массива переменной GET.
- 'page_navigator_url' - сформируем адрес на основе адреса новости $item->url и номера страницы, полученного из массива переменной GET.
Для формирования новой страницы комментариев в параметр 'page_navigator_url' можно передать callback-функцию.
// app/components/Nodus/app/Datatype/News/full.phtml print $this->comments->draw('news'.$item->id, array( 'type' => 'embedded', 'perpage' => 10, 'page' => $_GET['page'], 'page_navigator_url' => function($page_number) { //вернуть строку с адресом следующей страницы } ));
3. Режим link по сути ссылка с количеством комментариев в скобках. Полный список выводится на отдельной странице с формой добавления комментариев. Для того чтобы изменить количество комментариев на странице, необходимо в файле конфигурации app/config/modules.php задать значение параметру 'perpage'.
// app/config/modules.php 'Component.Comments' => array( 'perpage' => 10, ),
В примере мы установили количество выводимых записей на странице 10.
Список всех параметров, которые можно передавать в массиве:
- templates - параметр, позволяющий подключать пользовательские шаблоны. Ниже мы рассмотрим подробнее как это сделать.
- perpage - число комментариев, которые будут отображаться на странице.
- page - необходимо передать адрес текущей страницы. Необходим для постраничной навигации.
- page_navigator_url - передать строку или callback-функцию, которая формирует адрес следующей страницы. Используется для постраничной навигации.
- order_by - режим сортировки по заданному критерию. По умолчанию записи сортируются по дате создания комментария. Все новые записи оказываются в конце списка.
Рассмотрим использование всех этих параметров на следующем примере:
// app/components/Nodus/app/Datatype/News/full.phtml print $this->comments->draw('news'.$item->id, array( 'type' => 'embedded', 'perpage' => 10, 'page' => $_GET['comment-page'], 'page_navigator_url' => $item->url . "?comment-page=%", 'order_by' => 'time_create desc', ));
Ограничили вывод комментариев до 10 на странице, подключили постраничную навигацию, в начале списка вывели последние записи.
Настройка конфигурации формы отправки комментариев
Сейчас, если посмотреть на форму добавления комментариев, она представляет пустое поле с кнопкой. Добавим теги bbcode, подключим смайлики, а также возможность загружать файлы.
Настраивается в файле /app/config/modules.php, куда добавим следующую запись:
// app/config/modules.php 'Component.Comments' => array( 'editor' => array( 'bbcode' => true, 'smiles' => true ), 'attaches_enable' => true, ),
Где:
- bbcode - позволяет включить теги редактирования, повторяющие язык разметки bbcode.
- smiles - подключает смайлики. Существует способ добавления своего смайла или целого набора в дополнение к стандартному набору.
- attache_enable - разрешает загружать файлы на страницу.
Список доступных настроек
- enable_rating - дает возможность зарегистрированным пользователям отмечать понравившиеся комментарии возможность отмечать комментарии пользователей. Доступна только при установленном компоненте Users;
- self_edit_time - ограничение редактирования своего комментария по времени. Указывается количество секунд в течении которых можно редактировать (по умолчанию 0 - не ограничено). Доступна только при установленном компоненте Users;
- type - тип вывода (по умолчанию используется 'link');
- editor - дополнительная настройка редактора. Имеет 2 параметра bbcode и smiles.
- attaches_enable - разрешает загружать файлы на страницу;
- perpage - можно менять количество комментариев на странице, если не передано число страниц через метод вывода draw();
- max_reply_level - максимальная глубина ответов (по умолчанию установлено числовое значение - 5). Если лимит превышен, то в последнем комментарии вместо ссылки «ответить» появится ссылка «цитировать» и сообщение будет опубликовано в конце всего списка с цитатой сообщения, на которое отвечали. Настройка доступна только при установленном компоненте Users;
- allow_anonymous - разрешает добавление комментариев без регистрации (по умолчанию булево значение, установлено в true). Если нужна регистрация для добавления комментариев, то необходимо установить компонент Users, а значение allow_anonymous поменять на false.
Шаблоны комментариев
Шаблоны доступны в папке /app/components/Comments/views. Изменять их в этой папке не рекомендуется. Для этого необходимо завести свою папку /app/components/Comments/app/views, скопировать в нее нужный шаблон, и уже там изменять его содержимое.
- messages-rows-item.phtml - выводит один комментарий.
- messages-top.phtml - позволяет добавлять произвольный текст в верхней части блока комментариев перед списком записей.
- messages-rows.phtml - вывод списка всех комментариев.
- messages-bottom.phtml - вывод произвольного текста в нижней части блока комментариев после списка записей.
Если необходимо загрузить сторонний шаблон с другого адреса, то при выводе шаблона в массиве параметров укажем путь к шаблону.
// app/components/Nodus/app/Datatype/News/full.phtml print $this->comments->draw('news'.$item->id, array( 'type' => 'embedded', 'templates' => array( 'messages-top' => '../app/views/notice-messages-top.phtml'), ));
В данном случае будет выведено сообщение в верхней части блока комментариев перед списком записей.
События
В компоненте предусмотрена возможность подписаться на ряд событий.
События можно вызвать для материала определенного вида, например только для новостей. Тогда к имени события нужно добавить {material_code} - код материала.
component.comments.before.add
component.comments.before.add.{material_code}
Вызывается перед добавлением комментария. Если вернуть false, то добавление комментария будет остановлено.
- режим: before
- параметры: (object Component.Comments.Base.DB.Item) комментарий
Например:
Events::add_listener('component.comments.after.add.news', function($comment) { //... будут выполняться предопределенные действия сразу после добавления только для новостей });
component.comments.after.add
component.comments.after.add.{material_code}
Вызывается после добавлением комментария
- pежим: after
- параметры: (object Component.Comments.Base.DB.Item) комментарий
component.comments.before.delete
component.comments.before.delete.{material_code}
Вызывается перед удалением комментария. Если вернуть false, то удаление комментария будет остановлено.
- pежим: before
- параметры: (object Component.Comments.Base.DB.Item) комментарий
component.comments.after.delete
component.comments.after.delete.{material_code}
Вызывается после удаления комментария.
- pежим: after
- параметры: (object Component.Comments.Base.DB.Item) комментарий
component.comments.check.access.add.{material_code}
Вызывается в процессе проверки прав пользователя на добавление комментария
- параметры: (int) $id - id материала
- возвращаемое значение: (bool) true/false
component.comments.check.access.edit.{material_code}
Вызывается в процессе проверки прав пользователя на редактирование комментария.
- параметры:
- (int) $id - id материала,
- (object Component.Comments.Base.DB.Item)$comment - комментарий,
- (bool) $can_self_edit - true - комментарий является последним, пользователь является его автором, и от создания комментария прошло меньше времени чем указано в $self_edit_time
- возвращаемое значение: (bool) true/false
component.comments.check.access.delete.{material_code}
Вызывается в процессе проверки прав пользователя на удаление комментария.
- параметры:
- (int) $id - id материала,
- (object Component.Comments.Base.DB.Item) $comment - комментарий,
- (bool) $can_self_edit - true - комментарий является последним, пользователь является его автором, и от создания комментария прошло меньше времени чем указано в $self_edit_time
- возвращаемое значение: (bool) true/false
component.comments.check.access.reply.{material_code}
Вызывается в процессе проверки прав пользователя, чтобы ответить на комментарий.
- параметры:
- (int) $id - id материала,
- (object Component.Comments.Base.DB.Item) $comment - комментарий
- возвращаемое значение: (bool) true/false
component.comments.form_fields.{material_code}
Вызывается в процессе формирования полей формы добавления. Применяется для добавления каких-либо полей в форме.
- параметры:
- (int) $id - id материала,
- (array) &$fields - массив полей формы, принимается по ссылке для возможности редактирования
component.comments.check.allow.post.{material_code}
Вызывается в процессе проверки наличия в материале комментариев (есть ли необходимость выводить форму добавления).
- возвращаемое значение: (bool) true/false
component.comments.check.allow.reply.{material_code}
Вызывается в процессе проверки наличия иерархических комментариев в материале.
- возвращаемое значение: (bool) true/false. Если значение true - есть возможность добавить ответ, записи будут строиться в виде иерархического дерева. Если значение false - ответ добавить нельзя, комментарии будут построены в виде списка с возможностью цитировать текст предыдущего автора.