JOOMLA MASTER

Изучаем CMS Joomla на примерах

### Новое:

- Бесплатный курс по jQuery
- Как создавать сплывающие надписи, ссылки и иконки на рисунках
- Компонент администратора JCE
- Как сделать заголовок статьи ссылкой?
- Как изменять количество отображаемых материалов на странице категории?

Урок 2. Создание простейшего компонента для Joomla 1.5 (Основы программирования для Joomla 1.5) |  |

В этом уроке мы создадим простой компонент, который строчку «Hello!» в браузере. Перед тем, как начать создавать компонент, у Вас на сервере должна быть установлена CMS Joomla 1.5. Если Вы еще не установили, то это можно сделать с помощью уроков в разделе «Установка Joomla».

В этом уроке сначала создадим папку компонента под названием com_hello, в которую нам нужно добавить пять файлов:
site/hello.php - точка входа в наш компонент;
site/controller.php - содержит наше основное управление компонентом (Контроллер);
site/views/hello/view.html.php - обрабатывает данные и передает их в шаблон для вывода;
site/views/hello/tmpl/default.php - шаблон для вывода данных;
hello.xml- XML служит для передачи инструкций для Joomla по установке компонента.

В следующих уроках мы будем добавлять еще файлы, и общая файловая структура нашего компонента будет выглядеть так, как показано на рис. 2.1. Скачать архив с исходными кодами можно здесь.

Рис. 2.1. Структура компонента.

CMS Joomla всегда обрабатывает ссылку в корневом файле index.php для страниц Front End (сайт) или administrator/index.php для страниц Back End (админ-панель). Функция обработки URL загрузит требуемый компонент, основанный на значении 'option' в URL (метод GET) или переданных данных методом POST.

Для нашего компонента, URL выглядит так:
index.php?option=com_hello&view=hello

Это означает, что если пользователь введет в браузере строчку http://имя сайта/index.php?option=com_hello&view=hello, то переменная «option» получит значение «com_hello&view=hello».

Эта ссылка запустит выполнение файла, являющего точкой входа в наш компонент:

http://имя сайта/components/com_hello/hello.php.

Код для этого файла довольно типичен для всех компонент:

view source
print?
`01.``<?php`
`02.``/**`
`03.``` `* @package Autor`
`04.``` `* @subpackage Components`
`05.``` `* components/com_hello/hello.php`
`06.``` `* @link http://autor.net/`
`07.``` `* @license GNU/GPL`
`08.``*/`
`09.`
`10.``// Защита от прямого обращения к скрипту`
`11.`
`12.``defined(` `'_JEXEC'` `)` `or` `die``(` `'Restricted access'` `);`
`13.`
`14.``// Подключение файла контроллера.`
`15.`
`16.``require_once``( JPATH_COMPONENT.DS.``'controller.php'` `);`
`17.`
`18.``// Проверка или требуется определенный контроллер`
`19.``if``(``$controller` `= JRequest::getVar(` `'controller'` `)) {`
`20.``` `require_once``( JPATH_COMPONENT.DS.``'controllers'``.DS.``$controller``.``'.php'` `);`
`21.``}`
`22.`
`23.``// Создание класса нашего компонента`
`24.``$classname` `=` `'HelloController'``.``$controller``;`
`25.``$controller` `=` `new` `$classname``( );`
`26.`
`27.``// Выполнить задачу запроса`
`28.``$controller``->execute( JRequest::getVar(` `'task'` `) );`
`29.`
`30.``// Переадресация`
`31.``$controller``->redirect();`
`32.`
`33.``?>`

#### Примечание к коду:

JPATH_COMPONENT – это абсолютный путь к текущему компоненту; в наше случае - components/com_hello.
Для Front End - JPATH_COMPONENT_SITE
Для Back End - JPATH_COMPONENT_ADMINISTRATOR
DS означает автоматический выбор слеша (разделителя директорий ) '\' или '/'.
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.

Такой стандарт упрощает схему многозадачного компонента (это будет использоваться в последующих уроках, в данном случае в нашем компоненте одна задача).

Теперь мы инструктируем контроллер исполнить задачу, которая определена в URL: index.php?option=com_hello&task=sometask. Если нет определения задачи, то по умолчанию будет задача 'display'. Когда используется задача 'display' , переменная 'display' укажет то, что выводить. Пример стандартных задач - save, edit, new...

На последней строке кода контроллер переадресовывает страницу. Обычно используется для таких задач как SAVE.

Главная точка входа (hello.php) пропускает управление на контроллер, который обрабатывает выполнение задачи, которая была определена в запросе.

### Создание Контроллера

Так как наш компонент имеет только одну задачу (вывод «Hello»), то он будет очень прост. Никакой манипуляции данными не требуется. Все что нужно сделать, это загрузить необходимый view. Поэтому, мы будем иметь только один метод в нашем контроллере: view (). Большинство требуемых функциональных возможностей уже встроено в JController класс. Потому мы должны только вызывать метод JController:: view ().

Код основного контроллера site/controller.php такой:

view source
print?
`01.``<?php`
`02.``/**`
`03.``` `* @package Autor`
`04.``` `* @subpackage Components`
`05.``` `* @link http://autor.net/`
`06.``` `* @license GNU/GPL`
`07.``` `*/`
`08.`
`09.``// Защита от прямого обращения к скрипту`
`10.`
`11.``defined(` `'_JEXEC'` `)` `or` `die``(` `'Restricted access'` `);`
`12.`
`13.``jimport(``'joomla.application.component.controller'``);`
`14.`
`15.``/**`
`16.``` `* Hello World Component Controller`
`17.``` `*`
`18.``` `* @package Joomla.Tutorials`
`19.``` `* @subpackage Components`
`20.``` `*/`
`21.``class` `HelloController` `extends` `JController`
`22.``{`
`23.``` `/**`
`24.``` `* Method to display the view`
`25.``` `*`
`26.``` `* @access public`
`27.``` `*/`
`28.``` `function` `display()`
`29.``` `{`
`30.``` `parent::display();`
`31.``` `}`
`32.`
`33.``}`
`34.``?>`

Конструктор JController будет всегда по умолчанию регистрировать задачу display() используя метод registerDefaultTask(), если не определена другая задача. В самом деле, метод display() не нужен после того, но в нашем случае он есть хорошей демонстрацией того, что делает контроллер.

Метод JController :: display() метод определит имя view и шаблон из запроса, потом загрузит view и установит шаблон. Когда Вы создаете пункт меню для вашего компонента, менеджер меню позволит администратору выбирать задачу с которой начинать выполнение компонента.

В нашем компоненте, view имеет единственное значение - hello и шаблон имеет единственное значение - default (по умолчанию).

### Создание вида (view)

Для создания вида нужно извлечь данные, которые будут отображаться, и передать их в шаблон. Данные передаются в шаблон с помощью метода JView::assignRef

К од Вида в файле site/views/hello/view.html.php следующий:

view source
print?
`01.``<?php`
`02.``/**`
`03.``` `* @package Autor`
`04.``` `* @subpackage Components`
`05.``` `* @link http://autor.net/`
`06.``` `* @license GNU/GPL`
`07.``*/`
`08.`
`09.``// no direct access`
`10.`
`11.``defined(` `'_JEXEC'` `)` `or` `die``(` `'Restricted access'` `);`
`12.`
`13.``jimport(` `'joomla.application.component.view'``);`
`14.`
`15.``/**`
`16.``` `* HTML View class for the HelloWorld Component`
`17.``` `*`
`18.``` `* @package HelloWorld`
`19.``` `*/`
`20.`
`21.``class` `HelloViewHello` `extends` `JView`
`22.``{`
`23.``` `function` `display(``$tpl` `= null)`
`24.``` `{`
`25.``` `$greeting` `=` `"Hello World!"``;`
`26.``` `$this``->assignRef(` `'greeting'``,` `$greeting` `);`
`27.`
`28.``` `parent::display(``$tpl``);`
`29.``` `}`
`30.``}`
`31.``?>`

### Создание шаблона

Joomla шаблоны являются файлами PHP, которые создают вид данных. Переменные, переданные с помощью метода JView::assignRef можно получить из шаблона с помощью $this->propertyname.
В нашем простом шаблоне site/views/hello/tmpl/default.php мы только выводим на экран приветствие.

view source
print?
`1.``<?php`
`2.``defined(``'_JEXEC'``)` `or` `die``(``'Restricted access'``); ?>`
`3.``<h1>greeting; ?></h1>`

### Создание hello.xml

Компонент можно установить вручну путем копирования файлов с помошью FTP-клиента на сервер, и модификации базы данных.

Но лучше создать xml файл, и тогда Установщик Joomla все сделает за вас. XML файл может содержать разнообразную информацию и инструкции по установке:

- Общую информацию о компоненте и авторе.
- Список файлов, которые нужно скопировать из архива, с указанием куда копировать;
- По-необходимости можно добавить скрипты сопровождающие установку и удаление компонента;
- По-необходимости можно добавить файлы с sql-запросами, которые будут выполняться при установке и удалении компонента.

Наш XML файл выглядит так:

view source
print?
`01.``<``install` `type``=``"component"` `version``=``"1.5.0"``>`
`02.``` `<``name``>Hello</``name``>`
`03.``` `<!-- The following elements are optional and free of formatting conttraints -->`
`04.``` `<``creationdate``>2007 02 22</``creationdate``>`
`05.``` `<``author``>Имя Автора</``author``>`
`06.``` `<``authoremail``>author собачка mail.net</``authoremail``>`
`07.``` `<``authorurl``>http://www.autor.net<;/``authorurl``>`
`08.``` `<``copyright``>Копирайт</``copyright``>`
`09.``` `<``license``>Лицензия</``license``>`
`10.``` `<!-- The version string is recorded in the components table -->`
`11.``` `<``version``>Component Version String</``version``>`
`12.``` `<!-- The description is optional and defaults to the name -->`
`13.``` `<``description``>Description of the component ...</``description``>`
`14.`
`15.``` `<!-- Site Main File Copy Section -->`
`16.``` `<!-- Note the folder attribute: This attribute describes the folder`
`17.``` `to copy FROM in the package to install therefore files copied`
`18.``` `in this section are copied from /site/ in the package -->`
`19.``` `<``files` `folder``=``"site"``>`
`20.``` `<``filename``>index.html</``filename``>`
`21.``` `<``filename``>hello.php</``filename``>`
`22.``` `<``filename``>controller.php</``filename``>`
`23.``` `<``filename``>views/index.html</``filename``>`
`24.``` `<``filename``>views/hello/index.html</``filename``>`
`25.``` `<``filename``>views/hello/view.html.php</``filename``>`
`26.``` `<``filename``>views/hello/tmpl/index.html</``filename``>`
`27.``` `<``filename``>views/hello/tmpl/default.php</``filename``>`
`28.``` `</``files``>`
`29.```
`30.``` `<``administration``>`
`31.``` `<!-- Administration Menu Section -->`
`32.``` `<``menu``>Hello World!</``menu``>`
`33.```
`34.``` `<!-- Administration Main File Copy Section -->`
`35.``` `<``files` `folder``=``"admin"``>`
`36.``` `<``filename``>index.html</``filename``>`
`37.``` `<``filename``>admin.hello.php</``filename``>`
`38.``` `</``files``>`
`39.``` `</``administration``>`
`40.``</``install``>`

Создайте также в каталоге admin файлы admin.hello.php и index.html. Оставьте их пока пустыми.
Как Вы заметили, каждая папка имеет файлы index.html (рис. 2.1). Файлы index.html помещают в каждый каталог, чтобы препятствовать пользователям получать листинг каталога.
Эти файлы содержат одну единственную строку:

view source
print?
`1.``<``html``><``body` `bgcolor``=``"#FFFFFF"``></``body``></``html``>`

С помощью этих файлов будет отображаться пустая страница.
У нас получился простейший компонент.

Архив исходных файлов для этого урока можно скачать по этой ссылке:
http://joomla-master.com/com_hello_2.zip

Предыдущие уроки по Основах программирования для Joomla 1.5:

Введение

Урок 1. Основы функционирования Joomla 1.5

﻿ JOOMLA MASTER; WEB Хостинг