Создание Model-View-Controller компонента часть 1
Введение
Данное руководство посвящено разработке компонента в Joomla 1.5 с использованием технологии framework и схемы MVC. Вы пройдете через весь процесс его создания. В итоге будет разработан простой компонент Hello World! Он будет усложняться в следующих частях руководства, чтобы показать все мощь и гибкость схемы MVC.
Требования:
Joomla 1.5 или выше.
Введение в схему Model-View-Controller
Не смотря на то, что идея компонента может показаться слишком простой, код будет усложняться путем добавления новых свойств и разработкой пользовательского интерфейса. Схема MVC может быть использована для такой организации кода, при которой происходит отделение бизнес-логики от представления данных. Вся бизнес-логика размещена в одном месте, что позволяет легко изменять интерфейс или способ взаимодействия с пользователем без изменения самой бизнес-логики. MVC изначально был разработан для того чтобы производить ввод, обработку информации и получение результата в соответствии с логикой архитектуры GUI. Это являются основой схемы MVC в Joomla.
Модель
Модель представляет собой часть компонента, которая инкапсулирует данные приложения. Чаще всего она является подпрограммой для управления и манипулирования этими данными. В нашем случае модель будет содержать методы для добавления, удаления и обновления информации о списке встреч в базе данных, а также для получения этого списка. В общем, доступ к данным должен быть инкапсулирован в модели. Таким образом, если приложение должно быть перемещено из системы, которая использует неструктурированный файл для хранения информации в систему, использующую базу данных необходимо изменить только модель, а представление или контролер останутся неизменными.
Представление
Представление это часть компонента, которая используется для отображения данных в манере удобной пользователю. Для веб-приложений представление было бы HTML страницей с данными. Оно извлекает данные из модели и помещает их в шаблон, который показывается пользователю. Представление не может модифицировать данные, оно только отображает их.
Контроллер
Контроллер отвечает на действия пользователя. В нашем случае действие пользователя – это запрос страницы. Контроллер определит какой запрос выполнен пользователем и ответит вызовом модели для того чтобы подходящим образом манипулировать данными и отправить их в представление. Он не отображает данные, а только запускает методы в модели, которые модифицируют данные и затем помещает их в представление, которое отображает их.
Связь MVC
Рисунок справа иллюстрирует использование основных компонентов в Joomla. Кроме модели, представления и контролера на рисунке изображены точка входа в виде маленького кружечка и шаблон. Эти пять компонентов дадут вам возможность понять, как создаются MVC компоненты в Joomla.
Первая часть руководства сфокусирована на контроллере и представлении (с использованием шаблона). На рисунке они отмечены синим цветом. Вторая часть добавляет модель, а третья часть расширяет ее функциональность. Она отмечена зеленым цветом на рисунке. Имейте ввиду, что эта схема применяется только к пользовательской части сайта, хотя такая же схема применима и к административной части. Об административной части сайта речь пойдет, начиная с четвертой части этого руководства. Обе части описаны и сконфигурированы в инсталляционном xml файле.
Реализация MVC
В Joomla модель MVC реализована с помощью трех классов: JModel, JView, Jcontroller.
Создание компонента
В начале для нашего компонента понадобиться все лишь пять файлов:
1. site/hello.php – это точка входа компонента;
2. site/controller.php – содержит контролер;
3. site/views/hello/view.html.php – этот файл получает необходимые данные и помещает их в шаблон;
4. site/views/hello/tmpl/default.php – шаблон;
5. hello.xml – это xml файл, который показывает Joomla как устанавливать наш компонент.
Запомните, что имя файла точки входа должно быть такое же как и у компонента. Например, вы назвали компонент "Very Intricate Name Component", во время установки (смотри ниже в файле hello.xml) Joomla создаст папку с именем «com_veryintricatenamecomponent» и файл точки входа должен быть назван veryintricatenamecomponent.php, а иначе компонент работать не будет. Обратите внимание, что надо избегать использования в названии компонентов и файлов специальных символов.
Создание точки входа
Доступ к компонентам в Joomla всегда происходит только через одну точку входа: index.php для сайта или administrator/index.php для административной части. Затем приложение загрузит нужный компонент, значение которого определено в параметре ‛option‛ в URL или передано методом POST. Для нашего компонента URL будет:
index.php?option=com_hello&view=hello
Эта ссылка загрузит наш основной файл, который является точкой входа для нашего компонента: components/com_hello/hello.php. Код этого файла стандартный для многих компонентов.
site/hello.php:
<?php
/**
* @package Joomla.Tutorials
* @subpackage Components
* components/com_hello/hello.php
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
* @license GNU/GPL
*/
// No direct access
defined( "_JEXEC" ) or die( "Restricted access" );
// 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 = "HelloController".$controller;
$controller = new $classname( );
// Perform the Request task
$controller->execute( JRequest::getVar( "task" ) );
// Redirect if set by the controller
$controller->redirect();
Первая инструкция – это проверка безопасности.
JPATH_COMPONENT – это абсолютный путь к компоненту, в нашем случае components/com_hello. Можно также использовать JPATH_COMPONENT_isbliss.ru – путь к компоненту сайта, JPATH_COMPONENT_ADMINISTRATOR – путь к административной части.
DS является автоматическим выбором слеша:»» или «/». После загрузки основного контролера мы определяем, есть ли необходимость загружать какой-то дополнительный контролер. У нас будет только один контролер.
JRequest:getVar() находит в URL или в POST данных переменную, переданную ему в качестве параметра. Поскольку наш URL - index.php?option=com_hello&controller=controller_name, то наш контролер мы можем найти, используя echo JRequest::getVar("controller"). Теперь у нас есть наш основной контролер "HelloController" в файле com_hello/controller.php и если необходимо дополнительный "HelloControllerController1" в com_hello/controllers/controller1.php. Стандартная схема наименования контролера: Название компонентаControllerНазвание контролера
После того как контроллер создан, мы даем ему команду выполнить задачу, которая определена в URL: index.php?option=com_hello&task=sometask. Если задача не установлена, то по умолчанию будет ‛display‛. Когда используется задача ‛display‛ переменная ‛view‛ укажет, что должно быть отображено. Другими задачами являются save, edit, new и тд. Обычно, когда выполняется задача ‛save‛ контролер решает, что надо перенаправить страницу. Последняя инструкция осуществляет перенаправление.
Главная точка входа(hello.php) по существу передает контроль контролеру, который обрабатывает задачи, определенные в запросе.
Заметьте, что мы не используем закрывающий тег ?>. Мы делаем это для того чтобы у нас не было никакого нежелательного пустого пространства в коде. Такая практика по умолчанию используется, начиная с Joomla 1.5 для файлов, содержащих только php код.
Создание контроллера
Наш компонент выполняет только одну задачу – приветствует мир. Поэтому контроллер будет очень простой. Нам не требуется никакая манипуляция данными. Все что надо уже есть в загруженном представлении. Большая часть необходимых функциональных возможностей встроена в класс JController, таким образом, все что мы должны сделать это вызвать метод JController::display().
Код нашего контролера(site/controller.php)
<?php
/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
* @license GNU/GPL
*/
// No direct access
defined( "_JEXEC" ) or die( "Restricted access" );
jimport("joomla.application.component.controller");
/**
* Hello World Component Controller
*
* @package Joomla.Tutorials
* @subpackage Components
*/
class HelloController extends JController
/**
* Method to display the view
*
* @access public
*/
function display()
parent::display();
Конструктор Jcontroller всегда будет регистрировать задачу display() пока не будет определено что-нибудь другое. Эта задача будет устанавливаться по умолчанию. Когда вы создаете пункт меню для вашего компонента, менеджер меню позволит администратору выбрать представление, которое бы отображало либо конкретный данные, либо их схему. Обычно представление ссылается на определенный набор данных, например список машин, список событий, конкретная машина, конкретное событие. Схема это способ, с помощью которого организовано представление.
В нашем компоненте будет одно представление и одна схема (по умолчанию).
Создание представления
Задача представления очень простая: оно получает данные и помещает их в шаблон. Данные помещенные в шаблон используются методом JView::assignRef.
Наше представление находиться в файле: site/views/hello/view.html.php. Вот его код:
<?php
/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
* @license GNU/GPL
*/
// no direct access
defined( "_JEXEC" ) or die( "Restricted access" );
jimport( "joomla.application.component.view");
/**
* HTML View class for the HelloWorld Component
*
* @package HelloWorld
*/
class HelloViewHello extends JView
function display($tpl = null)
$greeting = "Hello World!";
$this->assignRef( "greeting", $greeting );
parent::display($tpl);
Создание шаблона
Шаблоны Joomla это PHP файлы, которые используются, чтобы разместить данные полученные от представления в определенной манере. Переменные, определенные методом JView::assignRef могут быть доступны в шаблоне при использовании конструкции $this->имя свойства (смотри код шаблона в примере).
Наш шаблон очень прост: он всего лишь отображает приветствие, которое он получил от представления. Файл шаблона: site/views/hello/tmpl/default.php
<?php
// No direct access
defined("_JEXEC") or die("Restricted access"); ?>
<h1><?php echo $this->greeting; ?></h1>
Создание файла hello.xml
Есть возможность установить компонент в ручную, копируя файлы через FTP и создавая таблицы базы данных. Однако же легче создать пакетный файл, который позволит Joomla сделать все за нас. Этот пакетный файл содержит различную информацию:
1. описание деталей компонента (например, наименование), необязательно – описание, информация о правах и лицензии;
2. список файлов, которые необходимо скопировать;
3. необязательно, PHP файл, который выполняет дополнительные операции по инсталляции и деинсталляции компонента;
4. необязательно, SQL файл, содержащий запросы, которые должны быть выполнены при инсталляции/деинсталляции.
Формат файла hello.xml:
<?xml version="1.0" encoding="utf-8"?><install type="component" version="1.5.0">
<name>Hello</name>
<!-- The following elements are optional and free of formatting constraints -->
<creationDate>2007-02-22</creationDate>
<author>John Doe</author>
<authorEmail>[email protected]</authorEmail>
<authorUrl>http://www.example.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- The version string is recorded in the components table -->
<version>1.01</version>
<!-- The description is optional and defaults to the name -->
<description>Description of the component ...</description>
<!-- Site Main File Copy Section -->
<!-- Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /site/ in the package -->
<files folder="site">
<filename>controller.php</filename>
<filename>hello.php</filename>
<filename>index.html</filename>
<filename>views/index.html</filename>
<filename>views/hello/index.html</filename>
<filename>views/hello/view.html.php</filename>
<filename>views/hello/tmpl/default.php</filename>
<filename>views/hello/tmpl/index.html</filename>
</files>
<administration>
<!-- Administration Menu Section -->
<menu>Hello World!</menu>
<!-- Administration Main File Copy Section -->
<files folder="admin">
<filename>hello.php</filename>
<filename>index.html</filename>
</files>
</administration>
</install>
Если вы изучили xml код внимательно, то должны были заметить, что в нем содержаться описания файлов, которые мы еще не обсуждали. Это файл index.html. Его надо поместить в каждую папку, чтобы любопытные пользователи не могли получить список файлов в директории. Если этого не сделать, то некоторые веб-сервера выдадут такой список. Не хотелось бы что бы это произошло. Этот файл содержит всего одну строку:
<html><body bgcolor="#FFFFFF"></body></html>
Он просто показывает пустую страницу.
Другой файл это hello.php в секции ‛admin‛. Это точка входа для административной части нашего компонента. Поскольку наш компонент не имеет такой части этот файл будет точно такой же как и index.php
Статья здесь Часть 2