Последовательность работы (выполнения) компонентов Joomla

Точка входа в 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 - папки, которые содержат различные файлы для внедрения дизайна и функциональности на стороне клиента (в браузере).

Комментариев: 4

  • 08.14.10 Вася:

    Спасибо, то что надо получилось сделать.
    а как в роуте еще бы task добавить ?

  • 08.14.10 Кирилл:

    Что-то я вопрос не понял, можешь уточнить?

  • 08.14.10 Вася:

    сам разобрался я
    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 ;
    }
    вот что имел ввиду
    спасибо

  • 08.14.10 Кирилл:

    Ответное спасибо за дельную добавку к заметке :)


Добавление комментария:

Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">