В связанной заметке (о выводе даты на русском в блоге категории 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» вероятно будет дан в следующей заметке.