Точка входа в Joomla! компонент подобна у большинства компонентов. Для этого примера мы будем использовать один из компонентов ядра Joomla – Web Links (Ссылки на сайты). Первый файл, который будет выполнен во front-end: …/components/com_weblinks/weblinks.php.
Сначала мы видим проверку безопасности, предназначенную для уверенности, что никто не сможет вызвать эту страницу непосредственно. Это стандарт, который должен использоваться во всех ваших php-файлах (хотя есть несколько исключений):
// no direct access defined('_JEXEC') or die('Restricted access'); |
Затем мы подгружаем файл controller.php, который находится в той же директории:
// Require the base controller require_once (JPATH_COMPONENT.DS.'controller.php'); |
Мы проверяем строку запроса, чтобы посмотреть, было ли отправлено определенное название контроллера. Если так, мы удостоверяемся, что можем загрузить необходимый файл в каталоге контроллеров:
// Require specific controller if requested if($controller = JRequest::getWord('controller')) { $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php'; if (file_exists($path)) { require_once $path; } else { $controller = ''; } } |
Теперь мы создаем экземпляр класса нашего контроллера, используя имя, которое определили выше:
// Create the controller $classname = 'WeblinksController'.ucfirst($controller); $controller = new $classname( ); |
И выполняем задачу, которую запросили в параметре строки запроса:
// Perform the Request task $controller->execute(JRequest::getCmd('task')); |
Как только задача выполнена, производим редирект, если он требуется:
// Redirect if set by the controller $controller->redirect(); |
Далее открываем класс контроллера.
Класс контроллера (Controller Class)
Общий (характерный) контроллер для компонента ссылок находится здесь: …/components/com_weblinks/controller.php.
Весь этот класс определяет метод display, который является используемым по умолчанию, если пользователь не определяет другую задачу (task).
controller.php
В этом методе мы устанавливаем вид (представление) по умолчанию: показ категорий, если другой вид не был передан как параметр строки запроса. Если требуемый вид — weblink, мы увеличиваем значение счетчика просмотра ссылки. Затем мы устанавливаем значение переменной вида и вызываем метод diplay нашего родительского класса JController.
Стоит обратить отдельное внимание на вызов метода getModel. Он загружает необходимую модель для компонента. В рассматриваемом примере, этот метод загрузит модель weblink, находущуюся здесь: …/components/com_weblinks/models/weblink.php.
Здесь условимся, что мы не запрашивали определенное представление, и поэтому наш вид будет установлен в categories.
Затем, мы открываем класс представления.
Класс представления (вида) (View Class)
Так как мы предполагаем, что хотим представление категорий, это — следующий файл, который будет выполнен: …/components/com_weblinks/views/categories/view.html.php
view.html.php
И снова, это — очень простой класс с одним методом display. БОльшая часть логики здесь является специфической для компонента ссылок, но если присмотреться можно найти функциональность используемую в большинстве классов представлений компонентов. В конце метода display этот класс вызывает родительский (JView) метод display, передавая название шаблона для отображения. Если название шаблона отображения не передается, используется шаблон «default».
И в последних, мы открываем класс шаблона.
Класс шаблона (Template Class)
Условимся что определенное имя шаблона не было передано, таким образом будет использован шаблон по умпочанию «default». В этом случае, следующий файл, который будет рассмотрен: …/components/com_weblinks/views/categories/tmpl/default.php
default.php
Большая часть логики здесь специфична для выполняемого компонента. Также по коду видно, что в этом файле весь HTML, смешан с PHP – таковы его особенность о предназначение.
Другие файлы, использующиеся в компонентах
Несколько из других типов файла Вы могли бы найти в компонентах:
- Helpers — в компонентах зачастую используется файл helper.php или каталог helpers со многими файлами. Эти файлы обычно содержат только общие функциональные возможности для компонента.
- Assets — это, кажется, всеобъемлющая папка для других файлов, включаемых в компонент.
- router.php — этот файл используется, при включенной настройке SEF URL, для трансляции URL в обоих направлениях (в человеко-понятный с псевдонимами и в системный вид Joomla с параметрами).
- xml-файлы — они обычно определяют параметры и другую информацию о компоненте, и его обозрение. Они используются, например, при создании пунктов меню компонента.
- index.html — хорошая практика иметь пустой index.html файл во всех ваших каталогах. Это такая пассивная мера безопасности.
- css/images/js — папки, которые содержат различные файлы для внедрения дизайна и функциональности на стороне клиента (в браузере).
Спасибо, то что надо получилось сделать.
а как в роуте еще бы task добавить ?
Что-то я вопрос не понял, можешь уточнить?
сам разобрался я
function componentnameBuildRoute(&$query) {
$segments = array();
if( isset($query['controller']) ) { $segments[] = $query['controller']; unset($query['controller']); }
if( isset($query['view']) ) { $segments[] = $query['view']; unset($query['view']); }
if( isset($query['id']) ) { $segments[] = $query['id']; unset($query['id']); }
if( isset($query['task']) ) { $segments[] = $query['task']; unset($query['task']); }
return $segments;
}
function componentnameParseRoute($segments) {
$vars = array();
$vars['controller'] = $segments[0];
$vars['view'] = $segments[1];
$vars['id'] = $segments[2];
$vars['task'] = $segments[3];
return $vars ;
}
вот что имел ввиду
спасибо
Ответное спасибо за дельную добавку к заметке
Добрый день, Скажите пожалуйста , а не кто не пробовал к ссылке добавлять что то типа &username= «логин пользователя вошедшего в joomla».
Реально челу который разобрался (автору) и рассказал — респект и уважуха, сам не осилил дорыть до конца. Вот она, MVC в исполнении Joomla. Стало все на свои места. Страница в закладки, буду перечитывать еще . Точка входа это отжиг, знал, верней догадывался, подозревал, смотрел и не понимал. Конкретно нигде не видел доков об этом (или было лень переводить).