Комментарии

Выполнение компонента Joomla 2.5 (часть 3)
( 0 Голосов )
В начале и конце кода из листинга в первой и второй части данной статьи, имеются четыре строки с операторами $lang-> load, объединенными вместе логической операцией ИЛИ (||). Эта логическая операция часто используется вместо условного оператора if, когда требуется проверить истинность нескольких условий. Но логическая операция ИЛИ обладает еще одной интересной особенностью: она останавливает обработку, как только доходит до выражения, логическое значение которого вычисляется как "истина" (true).
 
Метод load () из класса JLanguage возвращает логическое значение true, если загрузка произведена успешно, а иначе — логическое значение false. Следовательно, используя логическую операции ИЛИ, можно быстро (хотя и, на первый взгляд, сложно) выполнить следующие действия: попытаться загрузить файл языковой поддержки, начиная с места, определяемого сначала константой jpath_base, затем константой jpath_themes и т.д., а между тем — остановить процесс загрузки, как только один из файлов будет загружен успешно.
 
В следующем фрагменте кода, приведенном в листинге ниже, фактически загружается файл заданного нами компонента.
 
Метод renderComponent () из класса JComponentHelper.
// наметить область предварительного просмотра шаблона $contents = null;
// выполнить компонент
$contents = self::executeComponent($path);
В этом фрагменте кода сначала очищается все, что может находиться в переменной $contents, а затем вызывается метод executeComponent (). Обратите внимание на применение ключевого слова self в вызове данного метода. Дело в том, что метод executeComponent () является статическим методом из текущего класса. Более подробно ключевое слово self рассматривается в приложении А. 
 
Ниже приведен код метода executeComponent ():
protected static function executeComponent($path)
{
ob_start();
require_once $path;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
Сначала функция ob_start () языка PHP предписывает активизировать буферизацию вывода. В итоге все, что выводится из компонента, будет сохраняться в оперативной памяти. Затем по команде require_once $path загружается файл компонента. В рассматриваемом здесь примере загружается файл components/content.php.
 
Важно понять, что для выполнения компонента в Joomla требуется лишь одно: загрузить упомянутый выше файл, путь к которому указан в переменной $path, а все остальное зависит от самого компонента.
 
Это, в частности, означает, что компонент совсем не обязательно должен соответствовать шаблону MVC или даже использовать классы и объекты. Компонент может представлять собой отдельный сценарий, если он придерживается принятых условных обозначений имен. Впрочем, для создания компонентов по шаблону MVC имеется немало веских оснований, о чем будет сказано в соответствующем месте при построении компонентов.
 
Для того чтобы ощутить на практике, каким образом действует компонент, попробуйте создать собственный компонент com_test, следуя инструкциям в документации Joomla по адресу http://docs.joomla.Org/Testing_Checklists#Testing_Code_Snippets. Как только вы введете ссылку ?option=com_test в URL, ваш пробный компонент будет выполнен из файла test.php, находящегося в папке components/com_test,
 
После того как завершится выполнение компонента, содержимое буфера сохраняется обратно в переменной $clean с помощью метода obget contents (). И наконец, буфер очищается с помощью метода ob_end_clean ().
 
Итак, компонент выполнен, а выводимый из него результат сохранен в переменной $contents. Осталось лишь рассмотреть последнюю часть метода renderComponent () из класса JComponentHelper. Соответствующий код приведен в листинге ниже.
 
Метод renderComponent () из класса JComponentHelper.
// Построить панель инструментов компонента
$path = JApplicationHelper::getPath('toolbar');
if ($path && $app->isAdmin())
{
JLog::add('Files in the format toolbar.COMPONENTNAME.php are considered deprecated and will not be loaded in Joomla 3.0.', JLog::WARNING, 'deprecated');
// Получить задачу снова на тот случай, если она изменилась
$task = JRequest::getString('task');
 
// Построить панель инструментов
include_once $path;
}
 
// Вернуться к прежней области действия
$app->scope = $scope;
 
return $contents;
}
В этой, последней части метода renderComponent () сначала проверяется, следует ли отображать панель инструментов, и если это нужно, то она отображается. Затем устанавливается прежнее значение переменной $app->scope. И в конце данного метода возвращается переменная $ content s. Она передается вызывающему методу, которым в данном случае оказывается метод dispatch () из класса JSite.
 
В следующей строке кода из упомянутого выше метода dispatch () переменная $contents загружается в компонентную часть документа:
 
$document->setBuffer($contents, 'component');
 
И наконец, мы инициируем событие onAfterDispatch для системных подключаемых модулей. А если мы отлаживаем код, то помечаем момент наступления события onAfterDispatch после диспетчеризации. 
 
Теперь результат выполнения компонента находится в документе, и все готово, чтобы разместить его в других местах страницы.
 

Понравился материал? Пригодилась информация? Плюсани в социалки!


Теги:
 
Похожие новости