Ча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[ ] (452) Загрузок

9 

Добавить комментарий


Защитный код
Обновить