Comments: комментарии

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