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,
),

Где:

Список доступных настроек

  • 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 - ответ добавить нельзя, комментарии будут построены в виде списка с возможностью цитировать текст предыдущего автора.

Все версии

Обращаем ваше внимание, что установка и обновление компонентов штатным способом осуществляется из системы управления вашим сайтом ("Библиотека компонентов"). Данный раздел несет прежде всего информационную функцию. Однако, вы можете скачивать инсталляционные пакеты компонентов в целях ознакомления или в случае если функционирование библиотеки компонентов по какой-то причине затруднено.


Версия Дата
2.0.42 15.08.2016
2.0.41 21.04.2016
2.0.40 16.12.2015
2.0.39 08.09.2015
2.0.38 27.08.2015
2.0.37 22.05.2015
2.0.36 13.01.2015
2.0.35 26.11.2014
2.0.34 25.11.2014
2.0.33 22.10.2014
2.0.32 13.10.2014
2.0.31 02.10.2014
2.0.30 01.10.2014
2.0.29 09.09.2014
2.0.28 03.09.2014
2.0.27 17.07.2014
2.0.26 17.07.2014
2.0.25 14.07.2014
2.0.24 03.07.2014
2.0.23 18.06.2014
2.0.22 27.05.2014
2.0.21 27.05.2014
2.0.20 23.05.2014
2.0.19 23.05.2014
2.0.18 22.05.2014
2.0.17 21.05.2014
2.0.16 19.05.2014
2.0.15 16.05.2014
2.0.14 15.05.2014
2.0.13 14.05.2014
2.0.12 12.05.2014
2.0.11 08.05.2014
2.0.10 08.05.2014
2.0.9 28.04.2014
2.0.8 24.04.2014
2.0.7 16.04.2014
2.0.6 09.04.2014
2.0.5 08.04.2014
2.0.4 08.04.2014
2.0.3 07.04.2014
2.0.1 24.12.2013
2.0.0 26.11.2013