Блог

Категории:  

Программирование → Создание MVC компонента для Joomla 1.5
09.06.2010

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

Попробую объяснить более наглядно. Во-первых, структура папок и фалов следующая:

folders

Итак, файл компонента, в котором подключается контроллер, довольно прост. В нем всего пара строк, и после его создания вы вряд ли еще когда-либо откроете этот файл. В нем — следующий код:

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;
}
}

 

Все довольно просто. Создается класс нашей модели, а затем в нем размещаются наши функции по обработке данных, например — обновление записей, выборка из таблицы данных, удаление данных, отправка почты и т.д. Функции в модели вы можете называть как угодно, просто в контроллере или модели вызываете эти функции и получаете из них результат, или выполняете какую-нибудь манипуляцию с данными.


Автор: Денеж Александр
Теги: