Путь:    Главная arrow Вебмастеру Joomla 1.5 arrow Урок № 1

Создание компонент - Урок № 1

Создание Компонента - Hello

рис.1

Для нашего простейшего компонента на первом шаге обучения, потребуется создать всего пять файлов:

  • hello.php - точка входа в наш компонент
  • controller.php - содержит наше основное управление компонентом
  • views/hello/view.html.php - обрабатывает данные и передает их в шаблон для вывода
  • views/hello/tmpl/default.php - шаблон для вывода данных
  • hello.xml- XML служит для передачи инструкций для Jomla по установке компонента

Урок № 1

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

index.php?option=com_hello&view=hello

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

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

<?php
/**
 * @package    Autor
 * @subpackage Components
 * components/com_hello/hello.php
 * @link http://autor.net/
 * @license    GNU/GPL
*/

// Защита от прямого обращения к скрипту

defined( '_JEXEC' ) or die( 'Restricted access' );

// Подключение файла контроллера.

require_once( JPATH_COMPONENT.DS.'controller.php' );

// Проверка или требуется определенный контроллер
if($controller = JRequest::getVar( 'controller' )) {
    require_once( JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php' );
}

// Создание класса нашего компонента
$classname    = 'HelloController'.$controller;
$controller   = new $classname( );

// Выполнить задачу запроса
$controller->execute( JRequest::getVar( 'task' ) );

// Переадресация
$controller->redirect();

?>

Примечание:

JPATH_COMPONENT абсолютный путь к текущему компоненту, в наше случае components/com_hello.
Для Front End
JPATH_COMPONENT_SITE
Для Back End
JPATH_COMPONENT_ADMINISTRATOR

DS является автоматическим выбором слеша ( разделителя директорий ) '\' или '/'.

После загрузки основного контроллера проверяется или необходим определенный контроллер.
В данном случае у нас только основной контроллер, Эта часть кода будет использоваться в дальнейшем.

<classname>JRequest</classname>: getVar() загружает значение переменной из URL или методом POST. Так как наш URL index.php?option=com_hello&controller=controller_name, мы можем определить название нашего контролера:
echo JRequest::getVar('controller');

Мы имеем основной контроллер
'<classname>HelloController</classname>' в com_hello/controller.php,
так же загружаются дополнительные названия контроллера
к примеру:
HelloControllerController1 в com_hello/controllers/controller1.php
Такой стандарт упрощает схему многозадачного компонента (это будет использоваться в последующих уроках, в данном случае в нашем компоненте одна задача )
'{Componentname}{Controller}{Controllername}'

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

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

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

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

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

Код основного контроллера:

<?php
/**
 * @package    Autor
 * @subpackage Components
 * @link http://autor.net/
 * @license    GNU/GPL
 */

// no direct access

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport('joomla.application.component.controller');

/**
 * Hello World Component Controller
 *
 * @package    Joomla.Tutorials
 * @subpackage Components
 */
class HelloController extends JController
{
    /**
     * Method to display the view
     *
     * @access    public
     */
    function display()
    {
        parent::display();
    }

}
?>

<classname> JController </classname> конструктор будет всегда регистрировать display () задачу так как у нас она одна и не определена (используется registerDefaultTask () метод), устанавливается default task метод ( задача по умолчанию ).

display () - это первый по приоритету метод,
Он вызывают родительский конструктор.
Это хороший визуальный ключ, чтобы указать на то, что выполнять контроллеру.

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

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

Creating the View

The task of the view is very simple: It retrieves the data to be displayed and pushes it into the template. Data is pushed into the template using the<classname>JView</classname>::assignRef method.

The code for the view is:

<?php
/**
 * @package    Autor
 * @subpackage Components
 * @link http://autor.net/
 * @license    GNU/GPL
*/

// no direct access

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.application.component.view');

/**
 * HTML View class for the HelloWorld Component
 *
 * @package    HelloWorld
 */

class HelloViewHello extends JView
{
    function display($tpl = null)
    {
        $greeting = "Hello World!";
        $this->assignRef( 'greeting',	$greeting );

        parent::display($tpl);
    }
}
?>

создание Template ( шаблона )

Наш шаблон очень прост, мы только отображаем приветствие, которое передавали в view:

<?php // no direct access
defined('_JEXEC') or die('Restricted access'); ?>
<h1><?php echo $this->greeting; ?></h1>

Создание файла hello.xml

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

  • Детали о компоненте и о авторе компонента.
  • список файлов, которые должны быть скопированы.
  • внешний PHP файл, который исполняет дополнительную установку и деинсталлирует операции.
  • внешние SQL файлы, которые содержит запросы базы данных, отдельно для устанавливки и деинсталляции

Формат XML файла следующий:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-install.dtd">
<install type="component" version="1.5.0">
 <name>Hello</name>
 <!-- The following elements are optional and free of formatting conttraints -->
 <creationDate>2007 02 22</creationDate>
 <author>Имя Автора</author>
 <authorEmail>
 Этот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script
 </authorEmail>
 <authorUrl>http://www.autor.net</authorUrl> 
 <copyright>Копирайт</copyright>
 <license>Лицензия</license>
 <!--  The version string is recorded in the components table -->
 <version>Component Version String</version>
 <!-- The description is optional and defaults to the name -->
 <description>Description of the component ...</description>

 <!-- 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>hello.php</filename>
  <filename>controller.php</filename>
  <filename>views/index.html</filename>
  <filename>views/hello/index.html</filename>
  <filename>views/hello/view.html.php</filename>
  <filename>views/hello/tmpl/index.html</filename>
  <filename>views/hello/tmpl/default.php</filename>
 </files>
 
 <administration>
  <!-- Administration Menu Section -->
  <menu>Hello World!</menu>
  
  <!-- Administration Main File Copy Section -->
  <files folder="admin">
   <filename>index.html</filename>
   <filename>admin.hello.php</filename>
  </files>  
 </administration>
</install>

Также есть файлы, которые будут скопированы, это - index.html.
index.html помещен в каждый каталог, чтобы препятствовать пользователям получать листинг каталога.
Эти файлы содержат одну единственную строку:

<html><body bgcolor="#FFFFFF"></body></html>

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

Расположение файлов должно сответствовать схеме на рис.1

скачать компонент Hello Урока № 1 можно здесь