Модель-Вид-Контроллер часть 1 - введение

HTML / CSS

Введение

Структура программного обеспечения - основа, которая может использоваться разработчиком. Framework (структура) Joomla1.5 дает огромные возможности разработчикам.
В этой части мы создадим простой компонент который будет выводить Hello Wold. В следующих частях эта простая структура будет усложняться, что бы показать полные возможности MVC (Model-View-Controller) в Joomla!

Коротко распишем части компонента MVC:

Модель

Модель- это часть компонента, которая оперирует данными приложения. В нашем случае модель будет содержать методы добавления, удаления, и обновления информации. Таким образом если программа сохраняла данные в файлы, а нам нужно сохранять их в БД, то для этого нужно будет изменить только модель, не трогая остальной код.

Вид

Вид - это часть компонента, которая берет данные из модели и выводит их нам в пользовательский интерфейс. Для простых веб-приложений, Вид генерирует html страницу, с входными данными. Т.е. вид берет данные из модели, и вносит их в шаблон, который в конечном итоге и видит пользователь. Вид не изменяет данные, он только отображает их из модели!

Контроллер

Контроллер отвечает за действия пользователя. В нашем случае, действие пользователя - это запрос страницы. Контроллер в зависимости от запроса, будет вызывать модель, для управления данными, и управлять переходом Модели на Вид. Таким образом контроллер не отображает данные, а лишь вызывает модель, которая изменяет данные, а затем передает модель в вид, который отображается на экране.

Создание компонента

В зависимости от сложности компонентов есть дополнительные директории с файлами для Модели, Представления, и Контроллера.

Каждый компонет находится в своей директории. Joomla обрабатывает компонент в следующей последовательности:

  1. Joomla! интерпретирует выполненные значения в URL:/index.php?option=com_hello.
  2. Ищет составляющую таблицу com_hello компонент.
  3. Затем ищет директорию com_hello.
  4. В этой директории ищет входящий файл hello.php.
  5. И исполняет этот файл.

Для нашего основного компонента нам потребуется только пять файлов:

  • hello.php – это входная точка в компонент, похожая на index.php для сайтов.
  • controller.php – этот файл содержит базовый контроллер
  • views/hello/view.html.php – этот файл Вида. Он получает необходимые данные и передает их в шаблон.
  • views/hello/tmpl/default.php – сам шаблон.
  • hello.xml -это XML файл, который дает указания Joomla как, куда и что  устанавливать.

Создание точки входа (hello.php)

Joomla! всегда обрабатывает ссылку в корневом файле index.php для страниц Front End (сайт) или administrator/index.php для страниц Back End (админ). Функция обработки URL загрузит требуемый компонент, основанный на значении 'option' в URL (метод GET) или переданных данных методом POST.

Для нашего компонента, URL выглядит так:

index.php? option=com_hello&view=hello

Эта ссылка запустит выполнение файла, являющего точкой входа в наш компонент: components/com_hello/hello.php.

Код для этого файла довольно типичен для всех компонентов (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();
 

Рассмотрим код более подробно:

defined('_JEXEC') or die('Restricted access');

Первая строка - проверка безопасности, проверяется относится ли файл к Joomla! или ее директориям.

require_once (JPATH_COMPONENT.DS.'controller.php');

JPATH_COMPONENT - абсолютный путь к текущему компоненту, в наше случае components/com_hello.
Для Front End используется JPATH_COMPONENT_SITE
Для Back End используется JPATH_COMPONENT_ADMINISTRATOR

DS - автоматический выбором слеша (разделителя директорий) '\' или '/', в зависимости от ОС. Таким образом разработчик не должен волноваться о том на какой системе установлена Joomla.
После загрузки основного контроллера проверяется необходимость загрузки дополнительного контроллера. В данном случае у нас только основной контроллер, но мы оставим эту часть для будущего использования.

 

$classname = 'HelloController';
$controller = new $classname( );

Метод 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=newHelloController();
$controller->execute( JRequest::getVar('task'));

После того, как контроллер создан, мы инструктируем контроллер выполнить задачу, как определено в URL: index.php? option=com_hello& task=Задача. Если нет определение задачи, то по умолчанию будет задача ''display''. Когда используется задача 'display'' , переменная ''display'' укажет то что выводить. Пример стандартных задач - сохранить (save), редактировать (edit), создать (new) и т.л.

 

$controller->redirect();

Контроллер может принять решение о переадресации страницы, обычно это бывает после задачи “сохранить”.

Основная точка входа (hello.php) по существу передает контроль на контроллер, который обрабатывает задачу, которая была определена в запросе.

Примечание: Как Вы можете видеть в коде нет закрывабщего php тега: ?>. Причина в том, что бы не было никакого нежелательного свободного места в коде вывода. Эта практика началась с Joomla 1.5 и используется во всех файлах содержащих только чистый php.

Создание Контроллера (controller.php)

Наш компонент имеет только одну задачу – вывести надпись “ Hello”. Таким образом, контроллер будет очень простой. Манипуляций с данными не требуется. Все, что нужно сделать - это загрузить Вид. В нашем контроллере будет только один метод display(). Большая часть необходимых функций уже встроена в класс JController, так что все, что нам нужно сделать, это вызвать метод JController::display() .
Код простейшего основного контроллера (controller.php):

<?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() метод), устанавливается default task метод (задача по умолчанию).
display () - это первый по приоритету метод, он вызывает родительский конструктор.
JController :: display () метод определит название layout и layout запроса и загрузки, которые определяют и устанавливают выбор ветки в дереве задач. Когда Вы создаете пункт меню для вашего компонента, менеджер меню позволит администратору выбирать задачу с которой начинать выполнение компонента. К примеру, выбор при создании пункта меню таких задач: вывод списка автомобилей, вывод списка событий, вывод данных по одному автомобилю, вывод отдельного случая. Layout - путь, которым задается вывод определенной задачи.
Например - Вы создаете вид вывода категории списком или блогом.

Создание Представления (Вида) (/views/hello/view.html.php)

Задача очень проста: Извлекаем данные, которые будут отображаться, и передаем их в шаблон. Данные передаеются в шаблон, с помошью метода JView::assignRef() класса JView.
Код вида будет (view.html.php):

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

Создание шаблона(/views/hello/tmpl/default.php)

Наш шаблон очень прост, мы только отображаем приветствие, которое передавали в view (default.php):

<?php  
defined('_JEXEC') or die('Restricted access'); ?>
<h1><?php echo $this->greeting; ?></h1>

Создание установочного файла (hello.xml)

Можно установить компонент вручную, копирую файлы по FTP протоколу создавая необходимые папки и таблицы в базе данных, но лучшим вариантом является использования установочного файла для пакетной загрузки файлов и установки компонента.
Установочный XML файл может содержать разнообразную информацию и инструкции по установке:

  • Детали о компоненте и о авторе компонента;
  • Список файлов, которые должны быть скопированы;
  • Внешний PHP файл, который исполняет дополнительную установку и деинсталлирует операции;
  • Внешние 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>20.02.2009</creationDate>
<author>Имя автора</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>

Как видно из этого кода у нас должно быть две директории: site и admin. В директорию site копируем все созданные файлы, кроме hello.xml. В директории admin создаем пустой файл admin.hello.php

Также есть файлы, которые будут скопированы, это - index.html.

index.html помещен в каждый каталог, чтобы препятствовать пользователям получать листинг каталога.
Эти файлы содержат одну единственную строку:

<html><body bgcolor="#FFFFFF"></body></html>

С помощью этих файлов будет отображаться пустая страница.

В итоге весь листинг компонента будет таким:

listing

Как посмотреть на свое творение?

Можно в браузере набрать http://ДОМЕН/index.php?option=com_hello. Так же можно создать пункт меню на компонент, для этого зайти в главное меню, дальше создайте в нем новый пункт Hello Word! (разметка будет default, т.к. она одна), на сайте перейдя на этот пункт откроется компонент com_hello.


0