Для CMS Joomla! существуют тысячи расширений и плагинов для самых разных нужд, но нередко случается так, что ни одно из них не подходит для решаемой задачи. К счастью, Joomla! предоставляет удобные инструменты для создания собственных расширений.
JPATH_COMPONENT — абсолютный путь к компоненту, DS - автоматический выбор разделителя директорий '\' или '/', в зависимости от ОС.
Функция execute даёт указание контроллеру выполнить задачу, которая указана в URL: /index.php? option=com_userlist&task=Задача. Если определения задачи нет, то по умолчанию будет выполенеа задача ''display''.
Создание контроллера
Создим файл controller.php в той же директории:
Создание модели
Создадим файл userlist.php в субдиректории com_userlist/models:
Модель содержит данные и методы для их обработки. В нашем случае, в здесь булет единственная функция getUserlist(), которая возвращает массив имён пользователей.
Создание представления
Представеление (вид), отображает данные, полученные от модели.
Создадим ещё одну субдиректорию com_userlist/views, в ней директорию userlist — имя нашего представления (представлений может быть несколько), а в ней файл представления view.html.php:
Итак, мы создали компонент, выводящий список всех пользователей. Теперь добавим возможность выводить пользователей только конкртеной категории, задав её в админиcтративной панели.
Создание административной части.
При создании админиcтративной части нашего компонента используется почти такие же имена файлов и директорий в каталоге administrator/components/com_userlist/.
Точка входа, файл userlist.php будeт таким же, как и в наружной части сайта.
В модели (models/usetlist.php) будет функция getUsertypes(), возвращающая массив имён категорий пользователей, зарегистрированных на сайте, и функция store(), сохраняющаяя имя категории, пользователей которой будет отображать наш компонент.
defined('_JEXEC') or die();
jimport( 'joomla.application.component.model' );
class UserlistModelUserlist extends JModel
{
function getData() {
$db =& JFactory::getDBO();
$query = 'SELECT DISTINCT usertype FROM #__users';
$db->setQuery($query);
$this->data = $db->loadRowList();
return $this->data;
}
function store() {
//Получаем данные от контроллера
$data = JRequest::get( 'post' );
$db =& JFactory::getDBO();
$ut = $data["usertype"];
//О таблице userlist будет сказно позже
$query = 'UPDATE #__userlist SET value="'.$ut.'" WHERE property = "usertype"';
$db->setQuery($query);
$db->query();
}
}
Представеление (views/useslist/view.html.php) не сильно отличается от представления внешней части компонента:
defined('_JEXEC') or die();
jimport( 'joomla.application.component.view' );
class UserlistViewUserlist extends JView
{
function display($tpl = null)
{
// Устанавливаем заголовок и значок для компонента админиcтративной части
JToolBarHelper::title( JText::_( 'Userlist manager' ), 'generic.png' );
//Добавляем кнопку «Сохранить».
JToolBarHelper::save();
$catlist =& $this->get('Data');
$this->assignRef('catlist', $catlist );
parent::display($tpl);
}
}
Более подробную информацию об использовании стандартных элементов панели админиcтратора можно найти в официальной документации по Joomla на http://api.joomla.org/ .
Создадим файл шаблона (views/userlist/tmpl/default.php) :
И, наконец, создадим контроллер (controller.php):
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');
class UserlistController extends JController
{
function display()
{
parent::display();
}
function save()
{
//Опредеяем модель
$model = $this->getModel('userlist');
//Модель сохраненяет данные
$model->store($post)
$msg = JText::_( 'Сохранено' );
$link = 'index.php?option=com_userlist';
//Перенаправление
$this->setRedirect($link, $msg);
}
}
Тепрь можно модифицировать функцию getUserlist() в модели внешней части для выбора пользователей определённой категории:
function getUserlist()
{
$db =& Jfactory::getDBO();
$query = 'SELECT value FROM #__userlist WHERE property = "usertype"';
$db->setQuery($query);
$ut = $db->loadResult();
$query = 'SELECT name FROM #__users WHERE usertype = "'.$ut.'"';
$db->setQuery($query);
$userlist[] = $db->loadResultArray();
return $userlist;
}
Стоит отметить, что один компонент может имметь несколько контроллеров, видов и моделей.
Мы создали две части компонента: внешнюю для отображения и админиcтративную для управления. Теперь нам нужно создать файл с инструкциями для установки. Данные об установке компонента в Joomla храняться в XML-файле, в нашем случае userlist.xml:
Userlist
Author
author@example.org
http://www.example.org
Copyright Info
License Info
Component Version String
Displays lis of users
models/userlist.php
models/index.html
index.html
userlist.php
controller.php
views/index.html
views/userlist/index.html
views/userlist/view.html.php
views/userlist/tmpl/index.html
views/userlist/tmpl/default.php
install.sql
uninstall.sql
userlist.php
models/userlist.php
models/index.html
controller.php
views/index.html
views/userlist/index.html
views/userlist/view.html.php
views/userlist/tmpl/index.html
views/userlist/tmpl/default.php
index.html
install.sql
uninstall.sql
В этом файле хранится список файлов компонента, а таже инфорация о нём.
Для корректной установки нужно, чтобы файлы и каталоги, предназначенные для админиcтративной части, то есть для (\admninidtrator\components\com_<имя компонента>)? а также файлы intstall.sql и uninstall.sql находилились в директории admin, а файлы, предназначенные для внешней части сайта (components\com_<имя компонента>)) — в директории site. Файл userlist.xml должен быть на одном уровне с admin и site. Таким образом, получается следующаяя структура:
tree.png
Все файлы index.html содержат код , чтобы исключить получение списка файлов директорий.
В файле install.sql прописываются запросы к базе данных, которые нужно выполнить при установки:
DROP TABLE IF EXISTS `#__userlist`;
CREATE TABLE `#__userlist` (
`property` varchar(25) NOT NULL,
`value` varchar(25) NOT NULL,
PRIMARY KEY (`property`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
INSERT INTO #__userlist VALUES ('usertype','Registered');
А в файле uninstall.sql - запросы при удалении:
DROP TABLE IF EXISTS `#__userlist`;
Файл userlist.xml, директории admin и site запаковываем в архив и наш компонент можно устанавливать через менеджер расширени Joomla.
скриншоты
Теперь ссылка на панель усправления компонентом доступна из выпадающего меню «Компоненты» панели администратора, а ссылку на внешнюю часть компонента можно создать через меню.
Автор: Роман Сухов
Расширения в Joomla делятся на три категории: компоненты, модули и плагины.
Комоненты — это расширения, которые могут иметь пункт в меню, а также свою панель управления в админиcтративной части, модули — блоки с информацией, располагающиеся на сайте, их положение задано в шаблоне; а плагины — это расширения, только дополняющие функциональность каких-либо компонентов сайта.
Для примера создадим компонент, позволяющий выводить список определённой категории пользователей сайта, категория будет задаваться из административной панели.
Компоненты в Joomla! строятся на архитектуре MVC (Model-View-Controller - Модель-Представление-Контроллер) – схемы, с помощью которой модель данных, интерфейс пользователя и механизм взаимодействия с пользователем разделены на три отдельных составляющих так, что изменение одного из них минимально сказывается на двух других.
Все компоненты в Joomla доступны по URL вида /index.php?option= com_<имя комонента> или /administrator/index.php?option=<имя комонента>, если речь идёт об админимтративной панели. Создадим в директории /components Joomla каталог с именем com_userlist – так будет называться наш компонент. В нём создадим файл userlist.php — точку входа в наш компонент.
<?php // Защита от прямого обращения файлу defined( '_JEXEC' ) or die( 'Restricted access' ); // Подключение файла контроллера require_once( JPATH_COMPONENT.DS.'controller.php' ); echo "test"; // Создание контроллера $controller = new UserlistController( ); // Даём инструкцию контроллеру $controller->execute(JRequest::getVar('task')); ); // Перенаправление, если это задано контроллером $controller->redirect(); ?>
JPATH_COMPONENT — абсолютный путь к компоненту, DS - автоматический выбор разделителя директорий '\' или '/', в зависимости от ОС.
Функция execute даёт указание контроллеру выполнить задачу, которая указана в URL: /index.php? option=com_userlist&task=Задача. Если определения задачи нет, то по умолчанию будет выполенеа задача ''display''.
Создание контроллера
Создим файл controller.php в той же директории:
<?php defined( '_JEXEC' ) or die( 'Restricted access' ); jimport('joomla.application.component.controller'); class UserlistController extends JController function display() { parent::display(); } } ?>Поскольку никакагоко взаимодействия с пользователем здесь не потребуется, всё, что нужно от контроллера — загрузить представление. Эта функция уже предусмотрена в родительском классе JController, так что всё, что нужно сделать, это вызвать JController::display () из нашего метода display(). Как было сказано выше, если в URL не указана задача, то вызывается именно он.
Создание модели
Создадим файл userlist.php в субдиректории com_userlist/models:
<?php defined( '_JEXEC' ) or die( 'Restricted access' ); jimport( 'joomla.application.component.model' ); class UserlistModelUserlist extends JModel { function getUserlist() { //Создаём объект базы данных $db =& Jfactory::getDBO(); //Пока нет выбора категории, выбирем всех пользователей $query = 'SELECT name FROM #__users'; $db->setQuery($query); $userlist[] = $db->loadResultArray(); return $userlist; }
Модель содержит данные и методы для их обработки. В нашем случае, в здесь булет единственная функция getUserlist(), которая возвращает массив имён пользователей.
Создание представления
Представеление (вид), отображает данные, полученные от модели.
Создадим ещё одну субдиректорию com_userlist/views, в ней директорию userlist — имя нашего представления (представлений может быть несколько), а в ней файл представления view.html.php:
<?php defined( '_JEXEC' ) or die( 'Restricted access' ); jimport( 'joomla.application.component.view'); class UserlistViewUserlist extends JView { function display($tpl = null) { // Получаем модель: $model =& $this->getModel(); // Получаем данные из модели $userlist = $model->getUserlist(); // И передаём их в шаблон $this->assignRef('userlist',$userlist); parent::display($tpl); } }Файл шаблона должен находиться по адресу com_userlist/views/userlist/tmpl/default.php.
<?php defined('_JEXEC') or die('Restricted access'); echo "В шаблоне выводим данные в нужном виде.Users:
"; foreach ($this->userlist as $i) { foreach ($i as $j) { echo $j; } } ?>
Итак, мы создали компонент, выводящий список всех пользователей. Теперь добавим возможность выводить пользователей только конкртеной категории, задав её в админиcтративной панели.
Создание административной части.
При создании админиcтративной части нашего компонента используется почти такие же имена файлов и директорий в каталоге administrator/components/com_userlist/.
Точка входа, файл userlist.php будeт таким же, как и в наружной части сайта.
В модели (models/usetlist.php) будет функция getUsertypes(), возвращающая массив имён категорий пользователей, зарегистрированных на сайте, и функция store(), сохраняющаяя имя категории, пользователей которой будет отображать наш компонент.
defined('_JEXEC') or die();
jimport( 'joomla.application.component.model' );
class UserlistModelUserlist extends JModel
{
function getData() {
$db =& JFactory::getDBO();
$query = 'SELECT DISTINCT usertype FROM #__users';
$db->setQuery($query);
$this->data = $db->loadRowList();
return $this->data;
}
function store() {
//Получаем данные от контроллера
$data = JRequest::get( 'post' );
$db =& JFactory::getDBO();
$ut = $data["usertype"];
//О таблице userlist будет сказно позже
$query = 'UPDATE #__userlist SET value="'.$ut.'" WHERE property = "usertype"';
$db->setQuery($query);
$db->query();
}
}
Представеление (views/useslist/view.html.php) не сильно отличается от представления внешней части компонента:
defined('_JEXEC') or die();
jimport( 'joomla.application.component.view' );
class UserlistViewUserlist extends JView
{
function display($tpl = null)
{
// Устанавливаем заголовок и значок для компонента админиcтративной части
JToolBarHelper::title( JText::_( 'Userlist manager' ), 'generic.png' );
//Добавляем кнопку «Сохранить».
JToolBarHelper::save();
$catlist =& $this->get('Data');
$this->assignRef('catlist', $catlist );
parent::display($tpl);
}
}
Более подробную информацию об использовании стандартных элементов панели админиcтратора можно найти в официальной документации по Joomla на http://api.joomla.org/ .
Создадим файл шаблона (views/userlist/tmpl/default.php) :
И, наконец, создадим контроллер (controller.php):
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');
class UserlistController extends JController
{
function display()
{
parent::display();
}
function save()
{
//Опредеяем модель
$model = $this->getModel('userlist');
//Модель сохраненяет данные
$model->store($post)
$msg = JText::_( 'Сохранено' );
$link = 'index.php?option=com_userlist';
//Перенаправление
$this->setRedirect($link, $msg);
}
}
Тепрь можно модифицировать функцию getUserlist() в модели внешней части для выбора пользователей определённой категории:
function getUserlist()
{
$db =& Jfactory::getDBO();
$query = 'SELECT value FROM #__userlist WHERE property = "usertype"';
$db->setQuery($query);
$ut = $db->loadResult();
$query = 'SELECT name FROM #__users WHERE usertype = "'.$ut.'"';
$db->setQuery($query);
$userlist[] = $db->loadResultArray();
return $userlist;
}
Стоит отметить, что один компонент может имметь несколько контроллеров, видов и моделей.
Мы создали две части компонента: внешнюю для отображения и админиcтративную для управления. Теперь нам нужно создать файл с инструкциями для установки. Данные об установке компонента в Joomla храняться в XML-файле, в нашем случае userlist.xml:
В этом файле хранится список файлов компонента, а таже инфорация о нём.
Для корректной установки нужно, чтобы файлы и каталоги, предназначенные для админиcтративной части, то есть для (\admninidtrator\components\com_<имя компонента>)? а также файлы intstall.sql и uninstall.sql находилились в директории admin, а файлы, предназначенные для внешней части сайта (components\com_<имя компонента>)) — в директории site. Файл userlist.xml должен быть на одном уровне с admin и site. Таким образом, получается следующаяя структура:
tree.png
Все файлы index.html содержат код , чтобы исключить получение списка файлов директорий.
В файле install.sql прописываются запросы к базе данных, которые нужно выполнить при установки:
DROP TABLE IF EXISTS `#__userlist`;
CREATE TABLE `#__userlist` (
`property` varchar(25) NOT NULL,
`value` varchar(25) NOT NULL,
PRIMARY KEY (`property`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
INSERT INTO #__userlist VALUES ('usertype','Registered');
А в файле uninstall.sql - запросы при удалении:
DROP TABLE IF EXISTS `#__userlist`;
Файл userlist.xml, директории admin и site запаковываем в архив и наш компонент можно устанавливать через менеджер расширени Joomla.
скриншоты
Теперь ссылка на панель усправления компонентом доступна из выпадающего меню «Компоненты» панели администратора, а ссылку на внешнюю часть компонента можно создать через меню.
Автор: Роман Сухов
Очень сжато и по делу в одной статье. К сожалению подобных статей по Joomla! очень мало. Спасибо!
ОтветитьУдалить