Разработка плагина для JComments

  • 06.08.2014

Периодически на форуме возникают предложения о добавлении того или иного функционала в JComments, но в большинстве своем они все очень индивидуальны, чтобы включать их в компонент. Однако это не значит, что решения нет и в этой небольшой статье я хочу привести пример простейшего плагина для JComments.

Предлагаю рассмотреть задачу разработки плагина для JComments, который будет запрещать публиковать комментарий, содержащий определенное слово (назовем его стоп-словом).

Для решения этой задачи нам необходимо сначала выбрать событие JComments, которое позволит нам перехватить момент сохранения комментария. Информация о поддерживаемых событиях доступна на официальном сайте Список поддерживаемых событий для плагинов JComments. В данном случае проще всего использовать событие onJCommentsCommentBeforeAdd, так как это событие как раз и позволит нам проверить содержимое комментария и заблокировать сохранение, если комментарий содержит заданное стоп-слово.

Приступим к созданию плагина. Для начала создадим файл XML-манифеста для плагина и назовем его stopword.xml

<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" group="jcomments" version="2.5" method="upgrade">
	<name>JComments - StopWord</name>
	<creationDate>06/08/2014</creationDate>
	<author>smart</author>
	<copyright>Copyright 2014 JoomlaTune.ru All rights reserved!</copyright>
	<authorEmail>smart@joomlatune.ru</authorEmail>
	<authorUrl>http://www.joomlatune.ru</authorUrl>
	<license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license>
	<version>1.0</version>
	<description>PLG_JCOMMENTS_STOPWORD_XML_DESCRIPTION</description>
	<files>
		<filename plugin="stopword">stopword.php</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.plg_jcomments_stopword.ini</language>
		<language tag="en-GB">en-GB/en-GB.plg_jcomments_stopword.sys.ini</language>
	</languages>
	<config>
	  <fields name="params">
  	 <fieldset name="basic">
    	<field
      	name="stopword"
	      type="text"
  	    label="PLG_JCOMMENTS_STOPWORD_FIELD_STOPWORD_LABEL"
    	  description="PLG_JCOMMENTS_STOPWORD_FIELD_STOPWORD_DESC"/>
	   </fieldset>
  	</fields>
	</config>
</extension>

Как видно из примера это простой типовой XML-манифест для плагина, в качестве группы плагинов указан jcomments, плагин поддерживает один параметр — stopword, в котором мы будем указывать стоп-слово. Кроме того мы включили поддержку локализации языковые файлы для английского языка. Кстати, давайте их добавим. Создаем папку languages, в ней подпапку en-GB и помещаем в нее 2 файла en-GB.plg_jcomments_stopword.ini:

PLG_JCOMMENTS_STOPWORD="JComments - StopWord"
PLG_JCOMMENTS_STOPWORD_FIELD_STOPWORD_LABEL="Stop-word"
PLG_JCOMMENTS_STOPWORD_FIELD_STOPWORD_DESC="If comment contains specified word it will be not published."
PLG_JCOMMENTS_STOPWORD_MESSAGE_ERROR="You are not allowed to use word `%s`"
PLG_JCOMMENTS_STOPWORD_XML_DESCRIPTION="Plugin does not allow to save comment which contains given word."
и en-GB.plg_jcomments_stopword.sys.ini
PLG_JCOMMENTS_STOPWORD="JComments - StopWord"
PLG_JCOMMENTS_STOPWORD_XML_DESCRIPTION="Plugin does not allow to save comment which contains given word."

Далее создаем непосредственно файл плагина stopword.php

<?php
defined('_JEXEC') or die;

class plgJCommentsStopword extends JPlugin
{
	function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);
		// загружаем языковой файл для корректного отображения сообщений
		JPlugin::loadLanguage('plg_jcomments_stopword', JPATH_ADMINISTRATOR);
	}

	/**
	 * Вызывается перед сохранением комментария в БД. 
	 * Если обработчик события возвращает значение false, операция сохранения будет прервана.
	 *
	 * @param array $comment Объект комментария
	 *
	 * @return bool Если сохранение разрешено возвращает true, в противном случае - false
	 */
	public function onJCommentsCommentBeforeAdd(&$comment)
	{
		// получаем значение параметра stopword
		$stopword = $this->params->get('stopword', '');
		if (!empty($stopword))
		{
			if (JString::strpos(JString::strtolower($comment->comment), JString::strtolower($stopword)) !== false)
			{
				// если комментарий содержит стоп-слово - выводим сообщение с ошибкой
				JCommentsAJAX::showErrorMessage(JText::sprintf('PLG_JCOMMENTS_STOPWORD_MESSAGE_ERROR', $stopword));
				// и возвращаем false для отмены сохранения
				return false;
			}
		}
		return true;
	}
}

Теперь мы можем все запаковать в архив, установить плагин в Менеджере расширений административной панели Joomla, опубликовать, указать в параметрах любое стоп-слово и попробовать добавить комментарий с данным стоп-словом.

Это интересно:

Комментарии

Дмитрий Рекун
+1 # Дмитрий Рекун 06.08.2014 20:43
Все просто :)
Сообщить модератору
smart
0 # smart 07.08.2014 10:22
Ага, особенно если знать как ;)
Сообщить модератору

Comments are now closed for this entry

Joomla!® CMS — пожалуй, лучшая система управления контентом с открытым исходным кодом

Joomla! — это больше, чем просто программное обеспечение, это люди, включающие разработчиков, дизайнеров, системных администраторов, переводчиков, копирайтеров, и, что самое главное — простых пользователей.

Мы рады пригласить вас в ряды нашего сообщества!

Скачать Joomla! 3 Документация Joomla! CMS Свернуть

Расширения Joomla

Новости портала

Новое в блогах

Видео