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

03/03/2009 Создание компонента Joomla 1.5

Введение

Структура программного обеспечения - основа, которая может использоваться разработчиком. 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.

Вложения:
com_hello1_01.zip[ ] (2398) Загрузок

42 

Комментарии   

 
+3 StarByStar
18.10.2010 22:20
Понравилась статья, очень информативно и подробно!
 
 
+5 Славик
01.12.2010 14:10
Спасибо большое, как раз то, что искал.
 
 
+4 hexfox
05.01.2011 16:43
Благодарю! Очень хороший материал!
 
 
+2 Extalionez
07.04.2011 15:54
Лучшая статья на 07.04.2011
 
 
0 DmitryWP
19.05.2011 00:35
Вопрос. Джумла по дефолту принимает папку View???

А если у меня будет несколько отображений для разного типа данных, то что тогда?
 
 
0 Alexsey Beluaev
24.05.2011 00:33
А как создать файл контоллера из /administrator/component/.....
 
 
-3 Алексей Беляев
26.05.2011 00:12
Давайте ответим всем миром на вопрос о том как сделать 1)компонент для АДМИН ПАНЕЛИ, 2 )и стащить оттуда часть кода на главную с правами итд ....................

Для меня самое нужно пункт 2 админ станцуй а
 
 
-2 sanstorm.ru
03.06.2011 12:31
что то я не догоняю =(
 
 
-1 Dmitry Grey
18.06.2011 19:16
Это лучшая статья лишь потому, что это единственная статья на весь рунет походу )))
Статья не дотягивает даже до средненькой на самом деле, полезного тут мало. Самое основное это то что узнаешь что точка входа в компонент файл хеллопхп, отсюда мы сами видимо можем творить что угодно. Весь MVC joomla описан плохо я так и не понял что делает метод display ибо и на сайте джумлы по нему нет описания, лишь написано что он стандартен для MVC.
 
 
+2 SmokerMan
05.07.2011 14:40
Dmitry Grey
Вы математику видимо тоже начинали с вышки изучать, не зная при этом основ?
Что бы описать полностью API Joomla здесь не то что одной, а 100 статей не хватит.
Читайте следующие материалы, может чего-то понятней станет.
 
 
0 Alexsey Beluaev
07.07.2011 22:22
Дак то и дело что написано мало .
Я задал вопросы на которые не получил ответы. Сайт только этой тематики, а модераторы молчат. Админ здох.
Вообщем если сайты такой тематики еще есть пишите их сюда прямо, пускай шевелятся. А что касается хороших документов по созданию компонентов, то самое время установить модуль и залють их сюда что бы народ скачивал и читал и ДЕЛАЛ......
Да я вам денег дам если вы мне компонент из админ панели интегрируете.. с другим

пишите прямо на мыло beluaev @ qip.ru
 
 
+2 SmokerMan
08.07.2011 09:01
Цитирую Alexsey Beluaev:
Дак то и
Я задал вопросы на которые не получил ответы. Сайт только этой тематики, а модераторы молчат. Админ здох.

Alexsey Beluaev
почитав ваши вопросы на этой и следующей странице, я если честно, мало чего из них понял. Поэтому, видимо, ответов на них и не будет. Разъяснять лично каждому человеку все подробно, но это уж извольте :) Вы не один и я не резиновый, так же как и ценю свое время.
По поводу каких модераторов и админов идет речь, хз. Я здесь один представляю и тех и других :)
По поводу сайтов общей тематики, так вы лучше задайте этот вопрос поисковому механизму гугл, он с этим лучше справиться, здесь я вам тоже не помощник :)
 
 
0 Alexsey Beluaev
04.08.2011 23:18
Цитирую SmokerMan:
Цитирую Alexsey Beluaev:
Дак то и
Я задал вопросы на которые не получил ответы. Сайт только этой тематики, а модераторы молчат. Админ здох.

Alexsey Beluaev
почитав ваши вопросы на этой и следующей странице, я если честно, мало чего из них понял. Поэтому, видимо, ответов на них и не будет. Разъяснять лично каждому человеку все подробно, но это уж извольте :) Вы не один и я не резиновый, так же как и ценю свое время.
По поводу каких модераторов и админов идет речь, хз. Я здесь один представляю и тех и других :)
По поводу сайтов общей тематики, так вы лучше задайте этот вопрос поисковому механизму гугл, он с этим лучше справиться, здесь я вам тоже не помощник :)

СМОКЕР МАН -- Если выше время стоит денег, я готов заплатить вам за исходный код, который необходимо написать !.
Слушаю вас в скайпе alexsei_rabota
Бываю после 22.00 частенько РАНДОМ посещения. Так что в сети, будем говорить о цене.
 
 
-9 Денис
06.08.2011 20:06
Далеко не то что нужно, статья уовня 2009 года. Не информативно, слишком приметивно и мало инфы чтобы применит чтото стоющее в реале.
 
 
0 korolariya
15.08.2011 21:49
Проясните 1 момент, меняю везде слово help на exam например, но в views всёравно воспринимает только help, XML всю поправил - где я ошибаюсь?
 
 
0 DanielSan
17.08.2011 22:25
Автору большой и жирный минус за то что не написал что это перевод статьи а не его личная статья, и не указал источник оригинала.

А так большое спасибо за перевод, с русским языком лучше дружится :)
 
 
0 Sinbad
29.09.2011 09:55
Цитирую Денис:
Далеко не то что нужно, статья уовня 2009 года. Не информативно, слишком приметивно и мало инфы чтобы применит чтото стоющее в реале.

Ага, и следует учитывать что тогда-то она и была написана. Следует быть внимательней!
 
 
0 Дмитрий
30.01.2012 13:51
Сменил названия переменныъ и компонента - 500 - Layout "default" not found
Кто знает в чем дело???
 
 
0 Вотч
27.02.2012 18:07
Спасибо большое!
 
 
0 Вотчо
13.04.2012 01:23
Вот чо!