Чаcть 2 - Модель и Вид (Представление)

22/06/2010 Создание компонента Joomla 2.5

Здесь я буду использовать компонент с прошлой части. Немного добавим в него функциональности, за счет подключения Вида, Модели и Контроллера. Все манипуляции будут касаться только сайта, административная панель Joomla практически не будет затрагивать, ну за исключением того, что можно будет создать в ней пункт меню ссылающийся на компонент.

Начинаем с точки входа

site/hello.php

<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// Подключаем библеотеку контроллера Joomla
jimport('joomla.application.component.controller');
// Получаем экземпляр класса контроллера с префиксом Hello
$controller = JController::getInstance('Hello');
// Обрабатываем запрос (task)
$controller->execute(JRequest::getCmd('task'));
// Переадресуем, если установлено контроллером
$controller->redirect();

Как видно здесь подключается контроллер, нужно его создать.

site/controller.php

<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// Подключаем библеотеку контроллера Joomla
jimport('joomla.application.component.controller');
// Создаем класс контроллера
class HelloController extends JController
{
}

Контроллер пока будет пустой. Если никакой задачи (task) не будет в переменной запроса, то по умолчанию будет отображаться вид (представление) с именем Hello. Будет использоваться метод display основного класса JController.

Создание Вида

site/views/hello/view.html.php

<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// Подключаем библиотеку представления Joomla
jimport('joomla.application.component.view');
// Создаем свой класс, расширяя JView
class HelloViewHello extends JView {
protected $msg=null;
// Перезаписуем метод display класса JView
function display($tpl = null) {
// Добавляем данные в Представление
$this->msg = $this->get('Msg');
// Отображаем представление
parent::display($tpl);
}
}

Вид в свою очередь будет брать данные из модели ($this->get('Msg')) и передавать их в шаблон (размету). По умолчанию в Joomla разметка или шаблон (дальше я буду называть шаблон)  будет отображать, используя файл tmpl/default.php. Модель я опишу чуть позже.

Шаблон

site/views/helloworld/tmpl/default.php

<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
?>
<h1><?php echo $this->msg; ?></h1>

В этой же папке создадим файл XML, который будет описанием к данному шаблону. Так же этот файл нужен для того что бы в Менеджере Меню (Menu Manager) в соответствующем меню можно было создать пункт, ссылающийся на компонент.

site/views/hello/tmpl/default.xml

<?xml version="1.0" encoding="utf-8" ?> 
<metadata>
<layout title="Вывод компонента Hello">
<message>Это всплывающая подсказка</message>
</layout>
<fields name="request">
<fieldset name="request">
<field
id="id"
name="id"
type="list"
label="Выберите значение"
description="Здесь можно поместить описание"
default="1"
>
<option value="1">Привет!</option>
<option value="2">Пока!</option>
</field>
</fieldset>
</fields>
</metadata>

При создании пункта меню в нем можно будет выбирать два значения "Привет" или "Пока", эти значения будут обрабатываться в модели и дальше передавать в Вид соответствующее сообщение (msg)

Модель

site/models/hello.php

<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// подключаем библеотеку modelitem Joomla
jimport('joomla.application.component.modelitem');
// Создаем класс модели
class HelloModelHello extends JModelItem
{
/**
* @var string msg
*/

protected $msg;
/**
* Get the message
* @return string The message to be displayed to the user
*/

public function getMsg()
{
if (!isset($this->msg))
{
$id = JRequest::getInt('id');
switch ($id)
{
case 2:
$this->msg = 'Вы выбрали "Пока"!';
break;
default:
case 1:
$this->msg = 'Вы выбрали "Привет"';
break;
}
}
return $this->msg;
}
}

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

Осталось немного подкорректировать установочный XML файл.

hello.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Обратите внимание что method изменился на upgrade (обновление) -->
<extension type="component" version="1.6.0" method="upgrade">
<name>Hello!</name>
<creationDate>May 2010</creationDate>
<author>SmokerMan</author>
<authorEmail>kolyamba831@inbox.ru</authorEmail>
<authorUrl>http://www.joomla-code.ru</authorUrl>
<copyright>Информация о копирайте</copyright>
<license>Информация о лицензии</license>
<version>0.0.2</version>
<description>Описание компонента "Привет!" ...</description>
 
<files folder="site">
<filename>index.html</filename>
<filename>hello.php</filename>
<!-- Добавляем контроллер -->
<filename>controller.php</filename>
<!-- Добавляем папку Вида -->
<folder>views</folder>
<!-- Добавляем модель -->
<folder>models</folder>
</files>
 
<administration>
<menu>Hello!</menu>
<files folder="admin">
<filename>index.html</filename>
<filename>hello.php</filename>
</files>
</administration>
</extension>

Структура файлов получилась следующая:

  • hello.xml
  • site/index.html
  • site/hello.php
  • site/controller.php
  • site/views/index.html
  • site/views/hello/index.html
  • site/views/hello/view.html.php
  • site/views/hello/tmpl/index.html
  • site/views/hello/tmpl/default.xml
  • site/views/hello/tmpl/default.php
  • site/models/index.html
  • site/models/hello.php
  • admin/index.html
  • admin/hello.php

Теперь можно выбирая в пункте меню разное значение параметра менять соответсвенно сообщение на сайте.

<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// Подключаем библиотеку представления Joomla
jimport('joomla.application.component.view');
// Создаем свой класс, расширяя JView
class HelloViewHello extends JView {
protected $msg=null;
// Перезаписуем метод display класса JView
function display($tpl = null) {
// Добавляем данные в Представление
$this->msg = $this->get('Msg');
// Отображаем представление
parent::display($tpl);
}
}
Вложения:
com_hello-2.zip[ ] (1936) Загрузок

12 

Комментарии   

 
+5 dumb
10.02.2011 05:53
Спасибо, статья помогла.
 
 
+5 sever
11.02.2011 01:40
Спасибо! Хорошая статья!
 
 
-7 Роман
16.02.2011 18:56
При включенных ЧПУ не корректно формируется ссылка меню.
 
 
+3 Алуер
08.04.2011 21:26
Цитирую Роман:
При включенных ЧПУ не корректно формируется ссылка меню.

у меня с чпу норм. joomla 1.6
 
 
+5 klubnichka
29.04.2011 21:06
По сути не сильно отличается создание на 1.5 Только мне вот не понятно почему нельзя установить компонент от 1.5 на 1.6 что нужно поменять в компоненте что бы он подошёл на 1.6 файл xml или дело в default.xml просто структура моего компонента большая, и хочется конкретно узнать что именно менять. модель вид или контроллер.
 
 
+4 Mike
01.05.2011 18:28
Спасибо, просто и понятно. Идеальный мануал для начала освоения.
 
 
+4 Orlazor
23.04.2012 20:00
Отличные примеры, но недостаточно, хорошо бы было сделать ещё несколько на тему, например, работы с базой данных.
 
 
+3 mrakobes
30.12.2012 00:33
Автор, не стыковочка получается, как я понимаю.

Шаблон
site/views/helloworld/tmpl/default.php
...
...
В этой же папке создадим файл XML, который будет описанием к данному шаблону...
site/views/hello/tmpl/default.xml
 
 
+1 Павел
22.04.2013 01:50
Да-да... Опечаточка! =)
Не : site/views/helloworld/tmpl/default.php
а : site/views/hello/tmpl/default.php
 
 
+1 Павел
22.04.2013 01:52
А вообще, спасибо за такую статью! =) Очень много труда было вложено (перевод, комментарии в коде). Респект! =)
 
 
+1 Юрий
27.02.2013 14:54
Просто спасибо.
 
 
+3 Andrey
13.08.2013 07:53
не great, create.. Это я про ваш url
 
 
+1 Роман
18.12.2014 08:37
Ссылка битая, архив не скачивается!