Создаём компонент в Joomla 2.5. Часть 2. Добавление представления в компонент для frontend'a.
В Joomla 2.5 треть разработчиков компонентов разделяют компонент согласно шаблону проектирования MVC:
- Модель (Мodel). Представляет данные и методы работы с этими данными, реагирует на запросы, изменяя своё состояние.
- Контроллер (Controller). Обеспечивает связь между пользователем и системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.
- Представление (view). Отвечает за отображение информации (визуализация).
Создаем контроллер.
Joomla API включает в себя класс JController, который должен быть использован для расширения вашего контроллера. Добавьте в файл site/helloworld.php следующий строки кода:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import joomla controller library
jimport('joomla.application.component.controller');
// Get an instance of the controller prefixed by HelloWorld
$controller = JController::getInstance('HelloWorld');
// Perform the Request task
$controller->execute(JRequest::getCmd('task'));
// Redirect if set by the controller
$controller->redirect();
getInstance – является статичным методом класса JController, который создает экземпляр класса контроллера. В приведенном выше коде экземпляром объекта класса контроллера является класс с именем HelloWorldController. Joomla будет искать объявление этого класса в файле controller.php.
Далее мы создаем файл site/controller.php, в котором должен быть объявлен и определен класс HellowWorldController:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla controller library
jimport('joomla.application.component.controller');
/**
* Hello World Component Controller
*/
class HelloWorldController extends JController
{
}
Когда не ставится ни одно действие(action) в переменных url-запроcа, действием по умолчанию будет выполнено действие display, которое наследует класс HelloWorldController от класса JController. В нашем примере будет выведено представление с именем HelloWorld.
Создаем представление.
Когда контроллеру необходимо вывести представление, он будет искать конкретные файлы представления в каталоге component/com_[component_name]/views/[name of view]/ .
Название каталога представления по умолчанию является название самого компонента. В нашем случае это путь component/com_helloworld/views/helloworld/.
Файл, который будет содержать исходный код представления, будет вызываться view.[view_mode].php. Представление компонента по умолчанию использует html режим(view_mode). Таким образом, имя файла представления у нас получается таким — view.html.php.
Создайте представление site/views/helloworld/view.html.php:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla view library
jimport('joomla.application.component.view');
/**
* HTML View class for the HelloWorld Component
*/
class HelloWorldViewHelloWorld extends JView
{
// Overwriting JView display method
function display($tpl = null)
{
// Assign data to the view
$this->msg = 'Hello World';
// Display the view
parent::display($tpl);
}
}
Метод display() класса JView вызывает метод display() класса JController. В нашем случае, этот метод будет выводить данные на экран, используя файл tmpl/default.php. Создайте файл site/views/helloworld/tmpl/default.php, который будет является шаблоном представления, содержащим:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
<h1><?php echo $this->msg; ?></h1>
Этот файл шаблон будет включен в JView класс. Таким образом, здесь $tihs относится к классу HelloWorldViewHelloWorld.
Собираем компонент.
Пакет включает в себя файлы и директории:
- helloworld.xml
- site/index.html
- site/helloworld.php
- site/controller.php
- site/views/index.html
- site/views/helloworld/index.html
- site/views/helloworld/view.html.php
- site/views/helloworld/tmpl/index.html
- site/views/helloworld/tmpl/default.php
- admin/index.html
- admin/helloworld.php
- admin/sql/index.html
- admin/sql/updates/index.html
- admin/sql/updates/mysql/index.html
- admin/sql/updates/mysql/0.0.1.sql
Сожмите в zip-файл ваш каталог компонента или и установите его используя менеджер расширений. Протестируйте установленный компонент вставив index.php?option=com_helloworld в адресную строку браузера.
Листинг файла helloworld.xml:
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="1.7.0" method="upgrade">
<name>Hello World!</name>
<!-- The following elements are optional and free of formatting constraints -->
<creationDate>November 2009</creationDate>
<author>John Doe</author>
<authorEmail>Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.</authorEmail>
<authorUrl>http://www.example.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- The version string is recorded in the components table -->
<version>0.0.2</version>
<!-- The description is optional and defaults to the name -->
<description>Description of the Hello World component ...</description>
<update> <!-- Runs on update; New in 1.7 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Site Main File Copy Section -->
<!-- Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /site/ in the package -->
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
</files>
<administration>
<!-- Administration Menu Section -->
<menu>Hello World!</menu>
<!-- Administration Main File Copy Section -->
<!-- Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /admin/ in the package -->
<files folder="admin">
<!-- Admin Main File Copy Section -->
<filename>index.html</filename>
<filename>helloworld.php</filename>
<!-- SQL files section -->
<folder>sql</folder>
</files>
</administration>
</extension>
