Выполнение компонента Joomla 2.5 (часть 3) |
В начале и конце кода из листинга в первой и второй части данной статьи, имеются четыре строки с операторами $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 после диспетчеризации.
Теперь результат выполнения компонента находится в документе, и все готово, чтобы разместить его в других местах страницы.
Понравился материал? Пригодилась информация? Плюсани в социалки!
Теги:
|
Похожие новости | |
|