Новый фрэймворк 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 будет выглдить так:
Этот запрос будет загружать точку входа components/com_hello/hello.php.
Код этого файла обычно одинаков для большинства компонентов.
<?php // проверяем доступ defined( '_JEXEC' ) or die( 'Restricted access' ); // подключаем базовый контроллер require_once( JPATH_COMPONENT.DS.'controller.php' ); // По необходимости подключаем дополнительный контроллер. if($controller = JRequest::getWord('controller')) { $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php'; if (file_exists($path)) { require_once $path; } else { $controller = ''; } } // Создаем контроллер $classname = 'HelloController'.$controller; $controller = new $classname( ); // Выполняем задачу $controller->execute( JRequest::getVar( 'task' ) ); // Пересылаем на контроллер $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><?php echo $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> <!—- Копирование файлов во фронтенд --> <files folder="site"> <filename>index.html</filename> <filename>hello.php</filename> <filename>controller.php</filename> <filename>views/index.html</filename> <filename>views/hello/index.html</filename> <filename>views/hello/view.html.php</filename> <filename>views/hello/tmpl/index.html</filename> <filename>views/hello/tmpl/default.php</filename> </files> <administration> <!—- меню в админке --> <menu>Hello World!</menu> <!-- копирование файлов в админку --> <files folder="admin"> <filename>index.html</filename> <filename>admin.hello.php</filename> </files> </administration> </install>Создайте также в каталоге admin файлы admin.hello.php, controller.php и index.html. Оставьте их пока пустыми.
У нас получился простейший компонент.





