Новый фрэймворк Joomla1.5 дает огромные возможности разработчикам. Код joomla был полностью переписан заново, и имеет колосальные изменения.
Для начала создадим простой компонент Hello World. Далее компонент будет усложняться, чтобы показать возможности MVC проекта.
Хотя код и кажется по идее простым - простой вывод надписи Hello Wold, он будет усложняться по мере обрастания функционалом.
Вкратце напомню что такое MVC. MVC - это структупа проекта, которая может использоваться, чтобы организовать код таким образом, чтобы логика и представление данных были отдельными. Итак, рассмотрим три составляющие MVC (Model-View-Controller) компонента.
Модель Модель- это часть компонента, которая оперирует данными приложения. В нашем случае модель будет содержать методы добавления, удаления, и обновления информации. Таким образом если программа сохраняла данные в файлы, а нам нужно сохранять их в БД, то для этого нужно будет изменить только модель, не трогая остальной код. Вид Вид - это часть компонента, которая рендерит данные модели. Для веб-приложений, Вид генерирует html страницу, с входными данными. Т.е. вид берет данные из модели, и вносит их в шаблон, который в конечном итоге и видит пользователь. Запомните! Вид не изменяет данные, он только отображает их! Поэтому вид может быть изменен в любое время. Контроллер Контроллер - это обработчик действий пользователя. В нашем случае, действие пользователя - это запрос страницы. Контроллер в зависимости от запроса, будет вызывать модель, для управления данными, и управлять переходом Модели на Вид. Таким образом контроллер не отображает данные, а лишь вызывает модель, которая изменяет данные, а затем передает модель в вид, который отображается на экране. В Joomla, MVC осуществляется с использованием трех классов: JModel, JView, JController. Страртуем! Создайте каталог com_hello, и в нем два каталога: admin и site. В одном будет храниться часть админки, в другом то, что видит пользователь. Простейший компонент включает в себя только 5 файлов:
site/hello.php – это входная точка в компонент, похожая на index.php для сайтов.
site/controller.php – этот файл содержит базовый контроллер
site/views/hello/view.html.php – этот файл Вида. Он получает необходимые данные и передает их в шаблон.
site/views/hello/tmpl/default.php – сам шаблон.
hello.xml - это XML файл, который дает указания joomla как установить компонент. Этот файл должен находится в папке com_hello.
Создайте все эти файлы и папки, и в каждый каталог поместите пустые файлы index.html Создаем входную точку. Joomla всегда получает доступ, через единственную точку входа - файл index.php для фронт-енда, или administrator/index.php для бэк-енда. Далее Joomla будет загружать необходимый компонент, исходя из значения переменно option, переданной в url, или в POST-данных. Для нашего компонента, URL будет выглядить так:
index.php?option=com_hello&view=hello
Этот запрос будет загружать точку входа components/com_hello/hello.php. Код этого файла обычно одинаков для большинства компонентов.
<?php // проверяем доступ defined('_JEXEC') or die('Restricted access');
// Пересылаем на контроллер $controller->redirect(); ?>
Рассмотрим описанное чуть подробнее:
JPATH_COMPONENT – это абсолютный путь к компоненту, в нашем случае это components/com_hello. Если вам нужно точно указать путь, то для административной части используйте JPATH_COMPONENT_ADMINISTRATOR, а для фронтенда JPATH_COMPONENT_SITE.
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. Обрати внимание! Используйте стандартную схему наименований, чтобы вам было легче в дальнейшем: {Componentname}{Controller}{Controllername}
После того как контроллер создан, мы задаем ему выполнить (execute) задачу, определенную в URL: index.php?option=com_hello&task=sometask. Если задача не задана, то по умолчанию выполняется задача display. Другие распространенные задачи: добавить, сохранить, удалить.
Контроллер может принять решение о переадресации страницы, обычно это бывает после задачи “сохранить”. Главная точка входа (hello.php) в основном передает управление контроллеру, который уже выполняет задачу, переданную в запросе.
Создание контроллера
Наш компонент имеет только одну задачу – вывести надпись “привет мир”. Таким образом, контроллер будет очень простой. Манипуляций с данными не требуется. Все, что нужно сделать - это загрузить Вид. В нашем контроллере будет только один метод display(). Большая часть необходимых функций уже встроена в класс JController, так что все, что нам нужно сделать, это сослаться на метод JController::display() .
Код простейшего контроллера:
<?php defined('_JEXEC') or die('Restricted access');
jimport('joomla.application.component.controller');
class HelloController extends JController { /**
* метод вывода на экран
*
* @access public
*/
function display() {
parent::display(); }} ?>
Конструктор класса JController будет всегда создавать задачу по-умолчанию display() (можно задать другую, с помошью метода registerDefaultTask() )
Метод display() можно было не объявлять, и тут он показан только для примера. Метод JController::display() будет определять название Вида, и шаблон, который нужно загрузить. Когда вы создаете пункт меню, ссылающийся на ваш компонент, менеджер меню позволит администратору выбрать Вид. А Вид, как правило, относится к определенным наборам данных (например, список автомобилей, список событий, один автомобиль, разовое событие). В нашем компоненте только один вид hello, и один шаблон (default).
Создание вида
Задача очень проста: Извлекаем данные, которые будут отображаться, и передаем их в шаблон. Данные передаются в шаблон, с помошью метода JView::assignRef
Код Вида следующий:
<?php defined('_JEXEC') or die('Restricted access');
jimport('joomla.application.component.view');
class HelloViewHello extends JView {
function display($tpl=null) { $greeting="Hello World!"; $this->assignRef('greeting',$greeting);
parent::display($tpl); } } ?>
Создание шаблона
Joomla шаблоны являются файлами PHP, которые создают вид данных. Переменные, переданные с помощью метода JView::assignRef можно получить из шаблона с помощью $this->propertyname. В нашем простом шаблоне мы только выводим на экран приветствие.
<?php defined('_JEXEC') or die('Restricted access');?>
<h1><?phpecho$this->greeting;?></h1>
Создание hello.xml
Можно установить компонент, путем копирования файлов с помошью FTP-клиента на сервер, и модификации базы данных.
Но лучше создать xml файл, и тогда Установщик Joomla все сделает за вас. XML файл может содержать разнообразную информацию и инструкции по установке:
Общую информацию о компоненте и авторе..
Список файлов, которые нужно скопировать из архива, с указанием куда копировать.
По-необходимости можно добавить скрипты сопровождающие установку и удаление компонента.
По-необходимости можно добавить файлы с sql-запросами, которые будут выполняться при установке и удалении компонента.
Наш XML файл выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-install.dtd">
<install type="component" version="1.5.0">
<name>Hello</name>
<!—- Далее идут необязательные элементы-->
<creationDate>23.02.2008</creationDate>
<author>Kotofeich</author>
<authorEmail></authorEmail>
<authorUrl>http://www.example.org</authorUrl>
<copyright>GNU/GPL</copyright>
<license>Информация о лицензии</license>
<!-- Номер версии сохраняется как строковое значение в таблице компонентов -->
<version>Версия компонента</version>
<!—- Описание необязательно, и по-умолчанию равно имени компонента -->
<description>Описание компонента ...</description>