Joomla всегда обрабатывает ссылку в корневом файле index.php для страниц лицевой части сайта или administrator/index.php для страниц административного интерфейса системы. Функция обработки URL загружает требуемый компонент, основанный на значении 'option' в URL (используется метод передачи данных GET) или переданных данных методом POST.
Для разрабатываемого компонента, URL будет выглядеть следующим образом:
index.php? option=com_hello&view=hello
Эта ссылка запускает выполнение файла, являющего точкой входа в компонент: components/com_hello/hello.php.
Ниже приведен листинг файла hello.php:
<?php
// Защита от прямого обращения к скрипту
defined('_JEXEC') or die('Restricted access');
// Подключение файла контроллера.
require_once(JPATH_COMPONENT.DS.'controller.php');
// Проверка на дополнительные контроллеры
if($controller = JRequest::getVar('controller')) {
require_once(JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php');
}
// Создание класса контроллера компонента
$classname = 'HelloController'.$controller;
$controller = new $classname();
// Выполнить задачу запроса
$controller->execute(JRequest::getVar('task'));
// Переадресация
$controller->redirect();
Рассмотрим код более подробно:
|
|
1) defined('_JEXEC') or die('Restricted access');
Первая строка предотвращает прямой доступ к исполнительному файлу в целях общей безопасности сайта:
2) require_once(JPATH_COMPONENT.DS.'controller.php');
Следующая строка подключает основной контроллер компонента.
JPATH_COMPONENT - абсолютный путь к текущему компоненту, в данном случае - это components/com_hello.
DS - автоматический выбор слеша (разделителя директорий) '\' или '/', в зависимости от ОС. Таким образом, разработчик не должен волноваться о том, на какой системе установлена Joomla.
3) if($controller = JRequest::getVar('controller'))
Проверка на наличие вспомогательных контроллеров для компонента. Если таковые присутствуют, то подключаются из директории /controllers компонента. В рассматриваемом случае контроллер всего один.
4) $classname = 'HelloController'.$controller;
$controller = new $classname();
Создание класса основного контроллера компонента.
5) $controller->execute(JRequest::getVar('task'));
Получение контроллером текущей задачи из полученного URL вида: index.php?option=com_hello&task=Задача. Если значение task в переданном URL пустое, по умолчанию используется задача «display», предназначенная для вывода данных. При использовании задачи сохранения или удаления страницы контроллер компонента вызывает перенаправление на другую страницу с помощью строки $controller->redirect();
Фактически, точка входа компонента передает управлению контроллеру компонента для выполнения задачи, которая была определена в полученном запросе.
Создание контроллера компонента (файл controller.php)
Поскольку разрабатываемый компонент предназначен лишь для представления основ реализации компонентов под Joomla, контроллер этого компонента – очень простой. В некоторых больших компонентах число строк контроллера достигает до нескольких тысяч. В контроллере компонента «Hello» используется только один метод - display(). Большая часть необходимых функций уже встроена в класс JController, так что все, что требуется, это вызвать метод JController::display().
|
|
Ниже представлен листинг файла controller.php:
<?php
defined('_JEXEC') or die('Restricted access');
jimport('joomla.application.component.controller');
class HelloController extends JController
{
// метод вывода данных компонента
function display()
{
parent::display();
}
}
display () - это первый по приоритету метод, он вызывает родительский конструктор. JController:: display () метод определяет название шаблонов вывода запроса и загрузки, которые определяют и устанавливают выбор ветки в дереве задач.