Создание модуля для Joomla

Бизнес-логика, вывод данных и языковые файлы

Joomla

Бизнес-логика (хелпер)

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

В нашем случае нам понадобится всего один метод для получения данных о последних зарегистрированных пользователях. Ниже представлен код хелпера:


<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_latest_users
 *
 * @copyright   Информация о копирайте
 * @license     Информация о лицензии
 */

defined('_JEXEC') or die;

/**
 * Хелпер для mod_latest_users
 *
 * @package     Joomla.Site
 * @subpackage  mod_latest_users
 *
 * @since       1.0
 */
abstract class ModLatestusersHelper
{
	/**
	 * Метод получает список последних зарегистрированных пользователей
	 *
	 * @param   JRegistry  &$params  Параметры модуля
	 *
	 * @return  mixed  Список пользователей или null
	 */
	public static function getUsers(&$params)
	{
		// Получаем объект базы данных
		$db = JFactory::getDbo();

		// Получаем объект конструктора запросов
		$query = $db->getQuery(true);

		// Устанавливаем поля для выборки
		$fields = array('name', 'username');

		// Конструируем запрос
		$query->select($db->quoteName($fields))
			->from($db->quoteName('#__users'))
			->where($db->quoteName('block') . ' = 0')
			->order($db->quoteName('registerDate') . ' DESC');

		// Устанавливаем запрос
		$db->setQuery($query, 0, $params->get('count', 5));

		// Выполняем запрос и получаем результат
		$result = $db->loadObjectList();

		return $result;
	}
}

В принципе, не существует каких-то особых правил или соглашений по именованию класса хелпера. Но для более удобной идентификации класса, его название складывается из нескольких частей:

слово Mod + название модуля без специальных символов + слово Helper

Таким образом, название класса хелпера нашего модуля - ModLatestusersHelper.
Но, если Вы планируете использовать встроенный в Joomla 3 com_ajax, то такой формат именования обязателен.

Обратите внимание, что в методе getUsers() мы используем параметры модуля для ограничения количества отображаемых пользователей при выполнении запроса. Результатом выполнения этого запроса будет список объектов в виде массива.

Бизнес-логика нашего модуля довольно простая и отражает несложный функционал нашего модуля. Именно поэтому класс хелпера тоже простой.

Вывод данных

Вывод данных в модуле осуществляется с помощью макетов вывода (шаблонов). Макеты располагаются в папке /tmpl. В этой папке можно расположить несколько различных макетов для разных вариантов вывода данных.

Подключение макета происходит в точке входа модуля:


require JModuleHelper::getLayoutPath('mod_latest_users', $params->get('layout', 'default'));

А выбор макета задается в параметрах установочного файла в специальном типе поля modulelayout:

 

<field name="layout" type="modulelayout" label="JFIELD_ALT_LAYOUT_LABEL" description="JFIELD_ALT_MODULE_LAYOUT_DESC" />

Вот как выглядит наш макет default.php:


 
<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_latest_users
 *
 * @copyright   Информация о копирайте
 * @license     Информация о лицензии
 */

defined('_JEXEC') or die;

$displayMode = $params->get('display_mode', 0);
?>
<div>
	<?php if ($users) : ?>
		<ul id="latest_users_list">
			<?php foreach ($users as $user) : ?>
				<li>
					<?php if ($displayMode == 0) : ?>
						<?php echo $user->username; ?>
					<?php elseif ($displayMode == 1) : ?>
						<?php echo $user->name; ?>
					<?php elseif ($displayMode == 2) : ?>
						<?php echo $user->username; ?> (<?php echo $user->name; ?>)
					<?php endif; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	<?php else : ?>
		<span><?php echo JText::_('MOD_LATEST_USERS_NO_USERS'); ?></span>
	<?php endif; ?>
</div>

Обратите внимание, что здесь нам тоже доступны параметры модуля в переменной $params. Но в отличие от хелпера, макеты имеют общую с точкой входа область видимости, поэтому передавать их специально не приходится. Благодаря параметрам мы меняем логику вывода данных и отображаем только логин, только имя или логин и имя вместе.

Кроме файла макета default.php у нас есть ещё макет table.php. Если отличие только в том, что в нем применяется табличная верстка:


 
<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_latest_users
 *
 * @copyright   Информация о копирайте
 * @license     Информация о лицензии
 */

defined('_JEXEC') or die;

$displayMode = $params->get('display_mode', 0);
?>
<table>
	<?php if ($users) : ?>
		<?php foreach ($users as $user) : ?>
			<tr><td>
				<?php if ($displayMode == 0) : ?>
					<?php echo $user->username; ?>
				<?php elseif ($displayMode == 1) : ?>
					<?php echo $user->name; ?>
				<?php elseif ($displayMode == 2) : ?>
					<?php echo $user->username; ?> (<?php echo $user->name; ?>)
				<?php endif; ?>
			</td></tr>
		<?php endforeach; ?>
	<?php else : ?>
		<tr><td><?php echo JText::_('MOD_LATEST_USERS_NO_USERS'); ?></td></tr>
	<?php endif; ?>
</table>

В имени файлов макетов не допускается символ нижнего подчеркивания.

Языковые файлы

Языковые файлы модуля как правило располагают в папке /language. Каждый из языков в свою очередь располагается в папке с именем тэга языка. В принципе такой подход расположения языковых файлов относится не только к модулям, но и ко всем расширениям в Joomla.

После установки модуля вся папка целиком будет скопирована в корневую папку установки модуля. Таким образом, мы изолируем и защищаем языковые файлы. Например, если администратор удалит какой-то язык из системы, то наши языковые файлы не будут удалены. Подробнее о расположении языковых файлов вы можете прочитать в материале "Создание компонента для Joomla 2.5 – языковые файлы".

Ниже приведено содержимое языковых файлов нашего модуля:

/language/en-GB/en-GB.mod_latest_users.ini

; mod_latest_users
; Информация о копирайте
; Информация о лицензии

MOD_LATEST_USERS="Latest users"
MOD_LATEST_USERS_DESCRIPTION="Module displays latest registered users"
MOD_LATEST_USERS_NO_USERS="No users"
MOD_LATEST_USERS_DISPLAY_MODE_LABEL="Display mode"
MOD_LATEST_USERS_DISPLAY_MODE_DESC="Choose a display mode of the list"
MOD_LATEST_USERS_MODE_0="Login"
MOD_LATEST_USERS_MODE_1="Name"
MOD_LATEST_USERS_MODE_2="Login (Name)"
MOD_LATEST_USERS_COUNT_LABEL="Count"
MOD_LATEST_USERS_COUNT_DESC="The number of users to display"
MOD_LATEST_USERS_INCLUDE_CSS_LABEL="Include CSS"
MOD_LATEST_USERS_INCLUDE_CSS_DESC="If yes module's own CSS file will be used"

/language/en-GB/en-GB.mod_latest_users.sys.ini

MOD_LATEST_USERS="Latest users"
MOD_LATEST_USERS_DESCRIPTION="Module displays latest registered users"

/language/ru-RU/ru-RU.mod_latest_users.ini

; mod_latest_users
; Информация о копирайте
; Информация о лицензии

MOD_LATEST_USERS="Последние пользователи"
MOD_LATEST_USERS_DESCRIPTION="Модуль выводит последних зарегистрированных пользователей"
MOD_LATEST_USERS_NO_USERS="Нет пользователей"
MOD_LATEST_USERS_DISPLAY_MODE_LABEL="Режим отображения"
MOD_LATEST_USERS_DISPLAY_MODE_DESC="Выберите режим отображения списка"
MOD_LATEST_USERS_MODE_0="Логин"
MOD_LATEST_USERS_MODE_1="Имя"
MOD_LATEST_USERS_MODE_2="Логин (Имя)"
MOD_LATEST_USERS_COUNT_LABEL="Количество"
MOD_LATEST_USERS_COUNT_DESC="Количество отображаемых пользователей"
MOD_LATEST_USERS_INCLUDE_CSS_LABEL="Подключать CSS"
MOD_LATEST_USERS_INCLUDE_CSS_DESC="Если выбрано Да, будет использован собственный CSS файл модуля"

/language/ru-RU/ru-RU.mod_latest_users.sys.ini

MOD_LATEST_USERS="Последние пользователи"
MOD_LATEST_USERS_DESCRIPTION="Модуль выводит последних зарегистрированных пользователей"

Итог

На этом разработка модуля завершена. Можно собирать его в архив и устанавливать. Согласитесь, что разработка модуля - это совсем несложно. Если вы хотите, чтобы я разобрал еще какой-то вопрос, связанный с разработкой модуля, то пишите в комментариях.

Код модуля

Исходный код модуля доступен на GitHub: для Joomla 2.5 и для Joomla 3.
Также вы можете скачать архив: для Joomla 2.5 и для Joomla 3.

Dmitry Rekun
Работаю в банковской сфере, а с веб-разработкой (непосредственно с Joomla) столкнулся в 2007 году. Теперь это моё хобби и время от времени вторая работа. Какое-то время вёл свой блог, но решил попробовать работать в команде. И вот c 2012 года я здесь :)