RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

Создание MVC компонента Joomla 1.5 - Шаг 1, Основы

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

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

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

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.

JPATH_COMPONENT_SITE - Для Front End

JPATH_COMPONENT_ADMINISTRATOR - Для Back End

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

После загрузки основного контроллера проверяется наличие определенного контроллера с последующей загрузкой. В данном случае у нас только основной контроллер. JRequest::getVar() загружает значение переменной из URL или переданной методом POST. Допустим мы имеем адрес следующего вида:

index.php?option=com_hello&controller=controller_name

Тогда можно определить название нашего контроллера следующим образом:

echo JRequest::getVar('controller', 'default');

Мы имеем основной контроллер НelloController в com_hello/controller.php, так же загружаются дополнительные названия контроллера, к примеру: для HelloControllerController1 класс будет объявлен в файле com_hello/controllers/controller1.php 

{Componentname}{Controller}{Controllername} - Такой стандарт упрощает схему многозадачного компонента.

После того, как контроллер создан, мы инструктируем его выполнить задачу, которая определяется переданными параметрами в URL (либо через POST):

index.php?option=com_hello&task=sometask.

Если переменная "task" явно не задана, то по умолчанию выполниться display(), задача которого просто вывести шаблон по умолчанию. Пример стандартных задач - save, edit, new и т. д.

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

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

создание контроллера

Наш компонент имеет только одну задачу - Hello. Поэтому, контроллер будет очень простой. Никакая манипуляция данных не требуется. Все что необходимо - это загрузить соответствующий вид(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();
    }

}
?>

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

Когда вы создаете пункт меню для вашего компонента, менеджер меню позволит администратору выбирать задачу с которой начинать выполнение компонента. К примеру, для стандартного компонента "Пользователь" (com_user), выбор задач при создании пункта меню будет следующим:

  • Разметка входа по умолчанию
  • Разметка по умолчанию для регистрации
  • Напоминание по умолчанию
  • Разметка по умолчанию для сброса
  • Разметка по умолчанию для пользователя
  • Разметка пользовательской формы

создание вида

Извлекаем необходимые данные и передаем их в шаблон. В этом нам поможет расширенный класс JView и его метод assignRef, с помощью которого мы передаем переменные в шаблон.

<>Пример кода вида:


<?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);
    }
}
?>

создание шаблона

Наш шаблон очень прост, мы только отображаем приветствие, которое передавали в 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>
    <!-- Далее идут элементы, которые содержат не обязательные данные,
         но тем не менее их желательно заполнить -->
    <creationDate>2007 02 22</creationDate>
    <author>John Doe</author>
    <authorEmail>john.doe@example.org</authorEmail>
    <authorUrl>http://www.example.org</authorUrl>
    <copyright>Copyright Info</copyright>
    <license>License Info</license>
    <!--  Версия компонента, может использоваться для обновлений -->
    <version>Component Version String</version>
    <!-- Краткое описание возможностей компонента -->
    <description>Description of the component ...</description>

    <!-- Опции копирования файлов при установке -->
    <files folder="cite">
        <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>
        <!-- Имя пункта меню в панели управления -->
        <menu>Hello World!</menu>

        <!-- Файлы для копирования в панель администратора -->
        <files folder="administrator">
            <filename>index.html</filename>
            <filename>admin.hello.php</filename>
        </files>  
    </administration>
</install>

Также есть файл, который будет скопирован, это - index.html.

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

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

Прикрепленные файлы:
com_hello_1.zip
Объем: 4.27 KB; Тип: zip; Загрузок: 2586; в сутки: ~1; Обновлен: 14:19, 24 Июля 2011;
Смотрите также:
Комментарии (17) Добавить комментарий
  • Алексей
    Алексей
    13 Апреля 2011, 18:21
     ↑  0  ↓     ответ

    Так этот компонент не устанавливается. joomla ошибку выдаёт:

    JInstaller::install: Файл /home/c/cl38835/public_html/test/tmp/install_4da58646ed63f/hello.php не существует

    Может я не правильно что-то понимаю:

    Этот файл com_hello_1.zip мы можем установить в joomla как полноценный компонент?

    у меня joomla 1.5.22 может это влияет

    • smet.denis
      smet.denis (админ)
      17 Апреля 2011, 13:37
       ↑  -4  ↓     ответ

      у вас уже установлен модуль com_hello, удалите его и попробуйте снова...

      • Николай
        Николай
        25 Апреля 2011, 18:27
         ↑  0  ↓     ответ

        вы не правы

        не правильно написан xml файл

        обратите внимание на имена папок

        • smet.denis
          smet.denis (админ)
          25 Апреля 2011, 18:39
           ↑  0  ↓     ответ

          Ок, поглядим.

  • Severin
    Severin
    25 Мая 2011, 22:46
     ↑  +3  ↓     ответ

    В установочном xml нужно отредактировать строки <files folder="">. Должно быть

    <files folder="cite"> для файлов фронт-энда

    <files folder="administrator"> для файлов бек-энда

    • smet.denis
      smet.denis (админ)
      26 Мая 2011, 04:32
       ↑  -3  ↓     ответ

      Спасибо за наводку. Исправлено.

    • Николай
      Николай
      23 Ноября 2012, 17:12
       ↑  +2  ↓     ответ

      Может стоит написать всё-таки SITE?

      web-разработчик, а ка "сайт" пишется, не знает...

  • Александр
    Александр
    15 Июля 2011, 18:34
     ↑  0  ↓     ответ

    Не исправлено.

    Этот компонент по прежнему не устанавливается.

    Joomla 1.5.22

    Ошибка! Не найден XML-файл установки Joomla!

  • snake
    snake
    22 Октября 2011, 14:54
     ↑  +2  ↓     ответ

    По переданной ссылке типа «index.php?option=com_hello&view=hello»

    Подгружается файл hello.php и ему передается управление, тот исходя из значения переменной $controller инклудит соответственный файл php.

    Создает объект класса и вызывает метод execute() передав ему значение переменной task из get или post.

    Метод execute нашего контроллера, унаследован из класса родителя и вызывает метод display(), который мы переопредилили в нашем классе (и на самом деле он тупо вызывает метод display() родителя). До этого места все понятно и логично, видно что откуда грузиться.

    А вот дальше пошел полный «алес»… Мы описываем потомка от класса JView в котором, переопределяем метод display() который как написано в статье передает переменные в шаблон. Вопрос, а где прописано, какой именно php файл является шаблоном. В файле с описанием класса просмотра HelloViewHello нигде не указанно что надо погружать именно файл \com_hello\site\views\hello\tmpl\default.php. Да и собственно говоря, в классе с контроллером мы тоже не указываем какой именно php файл содержит описание класса наследника от JView. Да и нет ни где создания объекта класса HelloViewHello.

    Нельзя ли подробнее пояснить откуда тут что берется?

    • Игорь
      Игорь
      04 Декабря 2011, 01:36
       ↑  0  ↓     ответ

      snake зачем такие вопросы задаешь? Парни просто передрали чужую статью))

      • icewind
        icewind
        27 Апреля 2012, 05:30
         ↑  0  ↓     ответ

        точно передрали

        Вот еще в 2007 году были опубликованы уроки по созданию компонента:

        webflasher.net/ru/webmasteru/joomla-1-5.html

    • zemelea
      zemelea
      22 Марта 2012, 03:43
       ↑  0  ↓     ответ

      В нашем случае мы явно не прописываем имя задачи, поэтому (как уже указывалось выше) используется default.

  • mak
    mak
    31 Марта 2012, 13:14
     ↑  +3  ↓     ответ

    А как заставить вьюхи зацепляться из файлов *.phtml ?

  • JeneZis
    JeneZis
    23 Мая 2012, 19:33
     ↑  0  ↓     ответ

    Для установки данного компонента необходимо

    1. исправить в файле install.xml строку 36:

    <files folder="admin">

    на следующую:

    <files folder="administrator">

    2. Переименовать папку admin в administrator

    3. Дать права на запись директории components

  • Артем
    Артем
    06 Февраля 2013, 04:16
     ↑  +1  ↓     ответ

    if($controller = JRequest::getVar( 'controller' )) {

    там не двойное равно разве?

    • Стас
      Стас
      31 Января 2014, 14:11
       ↑  0  ↓     ответ

      JRequest::getVar( 'controller' ) в случае неудачи вернет false

  • Sergio
    Sergio
    27 Марта 2014, 04:07
     ↑  0  ↓     ответ

    Вы уверены в том, что front-end это сайт, а back-end это панель администратора?

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.