Создаём компонент в 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-файл ваш каталог компонента или
Листинг файла 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>