Joomla создание компонента 3 с нуля

20.11.2021 Видео

В этом уроке мы создадим простой компонент, который строчку «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. Скачать архив с исходными кодами можно здесь.

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.

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

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

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 такой:

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

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

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

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

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

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

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

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

greeting; ?> Создание hello.xml

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

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

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

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

Hello 2007 02 22 Имя Автора author собачка mail.net http://www.autor.net Копирайт Лицензия Component Version String Description of the component ... index.html hello.php controller.php views/index.html views/hello/index.html views/hello/view.html.php views/hello/tmpl/index.html views/hello/tmpl/default.php Hello World! index.html admin.hello.php

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

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

Архив исходных файлов для этого урока можно скачать по этой ссылке:

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

  • 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

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

Стоит заметить, что

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). Остальные возможности контроллера пока пропустим

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

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

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

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

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

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

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

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

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

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

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

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

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

Hello 2007 02 22 John Doe [email protected] http://www.example.org Copyright Info License Info Component Version String Description of the component ... index.html hello.php controller.php views/index.html views/hello/index.html views/hello/view.html.php views/hello/tmpl/index.html views/hello/tmpl/default.php Hello World! index.html admin.hello.php

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

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

Прикрепленные файлы:

Третий урок по созданию MVC компонента

В этом уроке мы создадим форму для отправки сообщений, а так же отправим его на указанный E-mail указанный в настройках, сохраним запись в базу данных и выведем пользователю сообщение об успешной отправке сообщения!

Для начала отредактируем XML файл с нашей формой. Файл у нас находится по адресу: components/com_form/models/forms/form.xml
Сейчас этот файл содержит следующий код:

В нашей форме только одно поле с именем test. Нам нужно его удалить(или изменить) и сделать что бы у нас было 3 поля: Имя , E-mail и Сообщение

После добавления этих полей форма у нас будет выглядеть так:

Если обратить внимание у нас появилось несколько дополнительных атрибутов в полях field:

  • required="true" - означает что поле будет обязательное, если его не заполнить будет ошибка!
  • validate="email" - означает что выполнится проверка или в это поле введен E-mail адрес (проверка будет выполняться только на стороне сервера)

Теперь нам нужно вывести эти поля в форме!
Для этого откроем файл components/com_form/views/form/tmpl/default.php

Для вывода полей формы, которые мы перед этим создали в XML файле, используются строки:

//для вывода метки поля из атрибута "label" echo $this->form->getLabel("name"); //для вывода самого поля, название поля содержится в атрибуте "name" echo $this->form->getInput("name");

Теперь нам нужно вывести три наших поля в форме, и код шаблона нашей формы изменится на такой:

Форма обратной связи Hello World! January 2018 John Doe [email protected] http://www.example.org Copyright Info License Info 0.0.1 Description of the Hello World component ... sql/updates/mysql index.html helloworld.php Hello World! index.html helloworld.php sql

site/helloworld.php