Модель-Вид-Контроллер часть 1 - введение
Введение
Структура программного обеспечения - основа, которая может использоваться разработчиком. Framework (структура) Joomla1.5 дает огромные возможности разработчикам.Коротко распишем части компонента MVC:
Модель
Модель- это часть компонента, которая оперирует данными приложения. В нашем случае модель будет содержать методы добавления, удаления, и обновления информации. Таким образом если программа сохраняла данные в файлы, а нам нужно сохранять их в БД, то для этого нужно будет изменить только модель, не трогая остальной код.
Вид
Вид - это часть компонента, которая берет данные из модели и выводит их нам в пользовательский интерфейс. Для простых веб-приложений, Вид генерирует html страницу, с входными данными. Т.е. вид берет данные из модели, и вносит их в шаблон, который в конечном итоге и видит пользователь. Вид не изменяет данные, он только отображает их из модели!
Контроллер
Контроллер отвечает за действия пользователя. В нашем случае, действие пользователя - это запрос страницы. Контроллер в зависимости от запроса, будет вызывать модель, для управления данными, и управлять переходом Модели на Вид. Таким образом контроллер не отображает данные, а лишь вызывает модель, которая изменяет данные, а затем передает модель в вид, который отображается на экране.
Создание компонента
В зависимости от сложности компонентов есть дополнительные директории с файлами для Модели, Представления, и Контроллера.
Каждый компонет находится в своей директории. Joomla обрабатывает компонент в следующей последовательности:
- Joomla! интерпретирует выполненные значения в URL:/index.php?option=com_hello.
- Ищет составляющую таблицу com_hello компонент.
- Затем ищет директорию com_hello.
- В этой директории ищет входящий файл hello.php.
- И исполняет этот файл.
Для нашего основного компонента нам потребуется только пять файлов:
- 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();
Рассмотрим код более подробно:
Первая строка - проверка безопасности, проверяется относится ли файл к 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):
Конструктор JController будет всегда регистрировать display() задачу так как у нас она одна и не определена (используется registerDefaultTask() метод), устанавливается default task метод (задача по умолчанию).
display () - это первый по приоритету метод, он вызывает родительский конструктор.
JController :: display () метод определит название layout и layout запроса и загрузки, которые определяют и устанавливают выбор ветки в дереве задач. Когда Вы создаете пункт меню для вашего компонента, менеджер меню позволит администратору выбирать задачу с которой начинать выполнение компонента. К примеру, выбор при создании пункта меню таких задач: вывод списка автомобилей, вывод списка событий, вывод данных по одному автомобилю, вывод отдельного случая. Layout - путь, которым задается вывод определенной задачи.
Например - Вы создаете вид вывода категории списком или блогом.
Создание Представления (Вида) (/views/hello/view.html.php)
Задача очень проста: Извлекаем данные, которые будут отображаться, и передаем их в шаблон. Данные передаеются в шаблон, с помошью метода JView::assignRef() класса JView.
Код вида будет (view.html.php):
Создание шаблона(/views/hello/tmpl/default.php)
Наш шаблон очень прост, мы только отображаем приветствие, которое передавали в view (default.php):
Создание установочного файла (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 помещен в каждый каталог, чтобы препятствовать пользователям получать листинг каталога.
Эти файлы содержат одну единственную строку:
С помощью этих файлов будет отображаться пустая страница.
В итоге весь листинг компонента будет таким:
Как посмотреть на свое творение?
Можно в браузере набрать http://ДОМЕН/index.php?option=com_hello. Так же можно создать пункт меню на компонент, для этого зайти в главное меню, дальше создайте в нем новый пункт Hello Word! (разметка будет default, т.к. она одна), на сайте перейдя на этот пункт откроется компонент com_hello.
42
Комментарии
18.10.2010 22:20
01.12.2010 14:10
05.01.2011 16:43
07.04.2011 15:54
19.05.2011 00:35
А если у меня будет несколько отображений для разного типа данных, то что тогда?
24.05.2011 00:33
26.05.2011 00:12
Для меня самое нужно пункт 2 админ станцуй а
03.06.2011 12:31
18.06.2011 19:16
Статья не дотягивает даже до средненькой на самом деле, полезного тут мало. Самое основное это то что узнаешь что точка входа в компонент файл хеллопхп, отсюда мы сами видимо можем творить что угодно. Весь MVC joomla описан плохо я так и не понял что делает метод display ибо и на сайте джумлы по нему нет описания, лишь написано что он стандартен для MVC.
05.07.2011 14:40
Вы математику видимо тоже начинали с вышки изучать, не зная при этом основ?
Что бы описать полностью API Joomla здесь не то что одной, а 100 статей не хватит.
Читайте следующие материалы, может чего-то понятней станет.
07.07.2011 22:22
Я задал вопросы на которые не получил ответы. Сайт только этой тематики, а модераторы молчат. Админ здох.
Вообщем если сайты такой тематики еще есть пишите их сюда прямо, пускай шевелятся. А что касается хороших документов по созданию компонентов, то самое время установить модуль и залють их сюда что бы народ скачивал и читал и ДЕЛАЛ......
Да я вам денег дам если вы мне компонент из админ панели интегрируете.. с другим
пишите прямо на мыло beluaev @ qip.ru
08.07.2011 09:01
Alexsey Beluaev
почитав ваши вопросы на этой и следующей странице, я если честно, мало чего из них понял. Поэтому, видимо, ответов на них и не будет. Разъяснять лично каждому человеку все подробно, но это уж извольте :) Вы не один и я не резиновый, так же как и ценю свое время.
По поводу каких модераторов и админов идет речь, хз. Я здесь один представляю и тех и других :)
По поводу сайтов общей тематики, так вы лучше задайте этот вопрос поисковому механизму гугл, он с этим лучше справиться, здесь я вам тоже не помощник :)
04.08.2011 23:18
СМОКЕР МАН -- Если выше время стоит денег, я готов заплатить вам за исходный код, который необходимо написать !.
Слушаю вас в скайпе alexsei_rabota
Бываю после 22.00 частенько РАНДОМ посещения. Так что в сети, будем говорить о цене.
06.08.2011 20:06
15.08.2011 21:49
17.08.2011 22:25
А так большое спасибо за перевод, с русским языком лучше дружится :)
29.09.2011 09:55
Ага, и следует учитывать что тогда-то она и была написана. Следует быть внимательней!
30.01.2012 13:51
Кто знает в чем дело???
27.02.2012 18:07
13.04.2012 01:23
RSS лента комментариев этой записи