Как работает метод-лоадер классов на примере JHTML::_

Логотип Joomla DocsВ связанной заметке (о выводе даты на русском в блоге категории Joomla) встал интересный вопрос о использовании классов Joomla для вывода какой-либо информации на страницы.

В том конкретном случае это была дата создания материала. Рассмотрим параметры метода вывода даты, в данном случае, служебного метода «_» класса JHTML.

Рассмотрим шаблон вывода статьи (стандартный или тот, что в шаблоне), точнее блок вывода даты:

//..
<div class="article-tools">
	<div class="article-meta">
	<?php if ($this->params->get('show_create_date')) : ?>
		<span class="createdate">
			<?php echo JHTML::_('date', $this->article->created, JText::_('%d %B %Y')) ?>
		</span>
	<?php endif; ?>
//..

Нас интересует строчка с вызовом класса JHTML.
Посмотрим как это работает (обратимся к официальной документации по API Joomla: http://api.joomla.org/Joomla-Framework/HTML/JHTML.html#_).
1. Мы вызываем метод «_» класса JHTML, и передаем ему три параметра ('date', $this->article->created, JText::_('%d %B %Y')).
То есть в упрощенном виде этот вызов выглядит так: JHTML::_('date', $date, $format).
2. Что происходит в методе «_»?
Идем в файл \libraries\joomla\html\html.php и смотрим описание и код метода (с переводом на русский):

//...
class JHTML
{
	/**
	 * Метод загрузки класса
	 *
	 * Дополнительные параметры могут поддерживаться и передаваться подклассу.
	 * Дополнительные папки с подключаемыми скриптами также доступны для использования.
	 *
	 * @param	string	Имя метода-хэлпера для загрузки, (prefix).(class).function
	 *                  prefix и class параметры опциональны и могут быть использованы для загрузки
	 *                  произвольного html-хэлпера.
	 */
	function _( $type )
	{
		// Инициализируем переменные
		$prefix = 'JHTML';
		$file   = '';
		$func   = $type;
 
		// Смотрим нужно ли загружать файл с хэлпер-методом
		$parts = explode('.', $type); // в нашем случае не нужно, точки в 'date' нет
 
		switch(count($parts)) // соответственно этот блок пропускаем
		{
			case 3 :
			{
				$prefix		= preg_replace( '#[^A-Z0-9_]#i', '', $parts[0] );
				$file		= preg_replace( '#[^A-Z0-9_]#i', '', $parts[1] );
				$func		= preg_replace( '#[^A-Z0-9_]#i', '', $parts[2] );
			} break;
 
			case 2 :
			{
				$file		= preg_replace( '#[^A-Z0-9_]#i', '', $parts[0] );
				$func		= preg_replace( '#[^A-Z0-9_]#i', '', $parts[1] );
			} break;
		}
 
		$className	= $prefix.ucfirst($file); // тут у нас есть только JHTML
 
		if (!class_exists( $className )) // классНейм у нас есть, пропускаем блок
		{
			jimport('joomla.filesystem.path');
			if ($path = JPath::find(JHTML::addIncludePath(), strtolower($file).'.php'))
			{
				require_once $path;
 
				if (!class_exists( $className ))
				{
					JError::raiseWarning( 0, $className.'::' .$func. ' not found in file.' );
					return false;
				}
			}
			else
			{
				JError::raiseWarning( 0, $prefix.$file . ' not supported. File not found.' );
				return false;
			}
		}
 
		if (is_callable( array( $className, $func ) )) // используя функцию проверки запускаемости метода класса
		{
			$args = func_get_args(); // забираем аргументы метода "_"
			array_shift( $args ); // не берем первый 'date' указывающий на подметод
			return call_user_func_array( array( $className, $func ), $args ); // запускаем метод JHTML::date с собранными параметрами
		}
		else
		{
			JError::raiseWarning( 0, $className.'::'.$func.' not supported.' );
			return false;
		}
	}
//...

Вопрос: в чем преимучества использования метода-лоадера по сравнению с явным запуском метода JHTML::date с нужными параметрами?
Ответ на вопрос что представляет из себя параметр «$this->article->created» вероятно будет дан в следующей заметке.


Добавление комментария:

 css.php