Новый фрэймворк 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.
Код этого файла обычно одинаков для большинства компонентов.
// проверяем доступ
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, тогда мы можем получить имя нужного нам контроллера, используя:
Сейчас мы используем наш базовый контроллер-класс 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() .
Код простейшего контроллера:
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
Код Вида следующий:
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.
В нашем простом шаблоне мы только выводим на экран приветствие.
Создание hello.xml
Можно установить компонент, путем копирования файлов с помошью FTP-клиента на сервер, и модификации базы данных.
Но лучше создать xml файл, и тогда Установщик Joomla все сделает за вас. XML файл может содержать разнообразную информацию и инструкции по установке:
- Общую информацию о компоненте и авторе..
- Список файлов, которые нужно скопировать из архива, с указанием куда копировать.
- По-необходимости можно добавить скрипты сопровождающие установку и удаление компонента.
- По-необходимости можно добавить файлы с sql-запросами, которые будут выполняться при установке и удалении компонента.
Наш XML файл выглядит так:
<!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. Оставьте их пока пустыми.
У нас получился простейший компонент.
Если у Вас возникли вопросы, то для скорейшего получения ответа рекомендуем воспользоваться нашим форумом
Подробнее...