В интернете можно найти множество примеров и материалов по созданию MVC компонентов в Joomla 1.5, но большинство из них оставляют больше вопросов, чем дают ответов и навыков. Это отпугивает большинство разработчиков, которые пытаются писать компоненты по MVC стандарту.
Попробую объяснить более наглядно. Во-первых,
структура папок и фалов следующая:

Итак, файл компонента, в котором подключается контроллер, довольно прост. В нем всего пара строк, и после его создания вы вряд ли еще когда-либо откроете этот файл. В нем — следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
//проверка доступа defined( '_JEXEC' ) or die( 'Restricted access' ); //подключаем файл контроллера //JPATH_COMPONENT - путь к пользовательской части сайта //DS - разделитель в зависимости от операционной системы require_once( JPATH_COMPONENT.DS.'controller.php' ); //инициализируем объект контроллера //Обратите внимание что контроллер называется как имя_компонентаController $controller = new blogController(); //Выполняем задачу (если она есть) $controller->execute( JRequest::getVar( 'task' ) ); //редирект на контроллер $controller->redirect();
|
После этого мы можем приступать к созданию контроллера. Открываем файл controller.php, и пишем в нем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
//проверка доступа defined( '_JEXEC' ) or die( 'Restricted access' ); //подключаем базовый класс контроллера jimport('joomla.application.component.controller'); //создаем свой класс blogController который наследуется от класса JController class blogController extends JController{ //функция по умолчанию для отображения текущего вида function display(){ //отобразить вид parent::display(); } //произвольная функция отправки каких то данных function sendData(){ //получение объекта модели item $model = $this->getModel("item"); //выполнение какойто функции по отправки данных $model->sendData("test"); //переход на вид item $this->setRedirect("index.php?option=com_blog&view=item"); } }
|
А теперь немного подробнее. Функция по умолчанию должна быть всегда, так как она запускает текущий вид на отображение. Написав произвольную функцию, мы можем ее вызвать следующим способом: index.php?option=com_blog&task=sendData. Контроллер запустит нашу функцию на выполнение, и модель выполнит отправку каких-то данных. Стоит заметить, что контроллер может вызывать любую модель, а вид может вызывать только модель, принадлежащую этому виду. Чтобы вызвать другой вид из существующих в нашем компоненте, достаточно к строке запроса добавить view=имя_вида.
Например:
- index.php?option=com_blog&view=blog — вызовет вид по умолчанию;
- index.php?option=com_blog&view=item — вызовет вид item;
- index.php?option=com_blog&view=item&task=sendData — вызовет вид item и выполнит задачу sendData.
Создание вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
//проверка доступа defined( '_JEXEC' ) or die( 'Restricted access' ); //подключаем базовый класс вида jimport( 'joomla.application.component.view'); //создаем свой класс вида blogViewitem который наследуется от класса JView //для правильно работы имя класса должно быть следующим имя_КомпонентаViewИмя_Вида class BlogViewItem extends JView{ //функция отображения вида function display($tpl = null){ //получаем текущую модель (как видите уже не указывается имя модели //она берется исходя из имени вида, в нашем случае это Item) $model = $this->getModel(); //получаем какие то данные из модели $data = $model->getData(); //вставляем наши данные в шаблон $this->assignRef("data", $data); //отображаем шаблон parent::display($tpl); } }
|
В этом примере мы подключаем какую-то модель и получаем с нее какие-то данные, будь то запрос из базы данных, или какой-либо математический расчет. После выполнения функции parent::display($tpl); у нас отобразится шаблон, который расположен в папке tmpl с именем default.php.
Есть также способ изменить вывод текущего шаблона. Допустим, у нас есть один вид, и нужно вывести, в зависимости от задачи, шаблон для редактирования записи либо шаблон для просмотра записей. Для этого нужно установить переменную layout. Ее можно установить двумя способами — передав через POST или GET данные, либо установив специальной функцией, которая есть в библиотеке Joomla 1.5. Пример такого компонента:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
/* КОНТРОЛЛЕР */ //проверка доступа defined( '_JEXEC' ) or die( 'Restricted access' ); //подключаем базовый класс контроллера jimport('joomla.application.component.controller'); //создаем свой класс blogController который наследуется от класса JController class blogController extends JController{ //функция по умолчанию для отображения текущего вида function display(){ //отобразить вид parent::display(); } //произвольная функция отправки каких то данных function ChangeTmpl(){ JRequest::setVar("layout","edit"); //отобразить вид parent::display(); } } /* ВИД */ //проверка доступа defined( '_JEXEC' ) or die( 'Restricted access' ); //подключаем базовый класс вида jimport( 'joomla.application.component.view'); //создаем свой класс вида blogViewitem который наследуется от класса JView //для правильно работы имя класса должно быть следующим имя_КомпонентаViewИмя_Вида class BlogViewItem extends JView{ //функция отображения вида function display($tpl = null){ //получаем текущую модель (как видите уже не указывается имя модели //она берется сходя их имени вида, в нашем случае это Item) $model = $this->getModel(); if($this->getLayout() === "edit"){ //получаем какие то данные из модели для редактирования $data = $model->getDataEdit(); //вставляем наши данные в шаблон $this->assignRef("data", $data); } else{ //получаем какие то данные из модели для отображения списка $data = $model->getDataListItem(); //вставляем наши данные в шаблон $this->assignRef("data", $data); } //отображаем шаблон parent::display($tpl); } }
|
Как вы видите, слой мы установили в контроллере через установку переменной layout: JRequest::setVar("layout","edit");. Чтобы отобразился наш вид, в папке tmpl текущего вида нужно создать файл edit.php — в него и будет выводиться наш слой. Чтобы отобразился этот вид, достаточно в строке браузера написать: index.php?option=com_blog&view=item&task=ChangeTmpl. Можно и напрямую установить слой: index.php?option=com_blog&view=item&layout=edit.
Теперь перейдем к файлу шаблона. Файл шаблона, это, по сути — наш код, который будет вставляться в шаблон вместо <jdoc:include type="component" />. В нем все данные, вставленные в модель через функцию assignRef, доступны по $this->имя_переменной. Кроме того, есть возможность подключать вспомогательные шаблоны (кроме шаблонов других слоев), у которых в таком случае будет приставка default_имяДополнительногоШаблона.php.
default_item.php и вспомогательные шаблоны можно вызывать только из текущего шаблона — например:
1 2 3 4 5 6
|
//проверка доступа defined( '_JEXEC' ) or die( 'Restricted access' ); //выведем все что у нас в переменной data print_r($this->data); //вывести шаблон: default_item.php echo $this->loadTemplate('item');
|
Тут вы можете смело размещать любые теги и выводить уже обработанную информацию.
И, наконец, осталось узнать, как же делать модели. В этом тоже нет ничего сверхъестественного — вот пример простой модели:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
//проверка доступа defined( '_JEXEC' ) or die( 'Restricted access' ); //подключаем базовый класс модели jimport( 'joomla.application.component.model' ); //создаем свой класс модели blogModelitem который наследуется от класса JView //для правильно работы имя класса должно быть следующим имя_КомпонентаModelИмя_Вида class BlogModelItem extends JModel{ //произвольная функция по работе с данными function getData(){ $array = array( 7, 10, 1, 12, 3, 6, 5 ); sort($array); return $array; } }
|
Все довольно просто. Создается класс нашей модели, а затем в нем размещаются наши функции по обработке данных, например — обновление записей, выборка из таблицы данных, удаление данных, отправка почты и т.д. Функции в модели вы можете называть как угодно, просто в контроллере или модели вызываете эти функции и получаете из них результат, или выполняете какую-нибудь манипуляцию с данными.
Автор: Денеж Александр