Доброго времени суток. И мы снова возвращаемся к созданию компонента для CMS Joomla. Так в предыдущей статье “Создание компонента для CMS Joomla. Часть 11. Проверка данных.” мы с Вами сделали проверку данных введеных пользователем как на стороне пользователя, так и на стороне сервера. Сегодня мы продолжим наращивать функциональность нашего компонента для CMS Joomla. А остановимся мы на добавлении категорий. И так, приступим...
Задача добавления категории к компоненту в CMS Joomla очень простая. Для начала нам необходимо изменить SQL-таблицу нашего компонента. Для этого отредактируем файл admin/sql/install.mysql.utf8.sql следующим образом:
DROP TABLE IF EXISTS `#__helloworld`;
CREATE TABLE `#__helloworld` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`greeting` varchar(25) NOT NULL,
`catid` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');
Этот файл будет выполняться при установке нашего компонента. Теперь добавим файл admin/sql/updates/mysql/0.0.12.sql И поместим в него следующий код:
ALTER TABLE `#__helloworld` ADD `catid` int(11) NOT NULL DEFAULT '0'
А этот файл уже будет выполняться при обновлении нашего компонента. На этом с базой данных мы разобрались. Приступим к редактированию самого компонента.
Изменение формы.
Теперь сообщение HelloWorld будет относиться к категории, поэтому нам необходимо изменить форму редактирования. Для этого изменим код в файле admin/models/forms/helloworld.xml
<?xml version="1.0" encoding="utf-8"?>
<form
addrulepath="/administrator/components/com_helloworld/models/rules"
>
<fieldset>
<field
name="id"
type="hidden"
/>
<field
name="greeting"
type="text"
label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC"
size="40"
class="inputbox validate-greeting"
validate="greeting"
required="true"
default=""
/>
<field
name="catid"
type="category"
extension="com_helloworld"
class="inputbox"
default=""
label="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC"
required="true"
>
<option value="0">JOPTION_SELECT_CATEGORY</option>
</field>
</fieldset>
</form>
Тут следует отметить, что категория может равняться нулю. Это означает, что сообщение не относится ни к какой категории.
Изменим тип меню.
На данный момент в нашем меню выпадает список сообщений. Теперь нам надо добавить еще и категорию. Для этого отредактируем файл admin/models/fields/helloworld.php следующим образом:
<?php
// права доступа
defined('_JEXEC') or die;
// импорт списка типа полей
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');
/**
* поля формы HelloWorld класса для компонента HelloWorld
*/
class JFormFieldHelloWorld extends JFormFieldList
{
protected $type = 'HelloWorld';
protected function getOptions()
{
$db = JFactory::getDBO();
$query = new JDatabaseQuery;
$query->select('#__helloworld.id as id,greeting,#__categories.title as category,catid');
$query->from('#__helloworld');
$query->leftJoin('#__categories on catid=#__categories.id');
$db->setQuery((string)$query);
$messages = $db->loadObjectList();
$options = array();
if ($messages)
{
foreach($messages as $message)
{
$options[] = JHtml::_('select.option', $message->id, $message->greeting . ($message->catid ? ' (' . $message->category . ')' : ''));
}
}
$options = array_merge(parent::getOptions(), $options);
return $options;
}
}
Управление подменю.
Компонент com_categories позволяет с легкостью управлять подменю. Давайте создадим подпапку helpers в папке admin. И уже в этой папке создадим helloworld.php. И добавим в этот файл admin/helpers/helloworld.php следующий код:
<?php
// права доступа
defined('_JEXEC') or die;
/**
* HelloWorld компонент helper.
*/
abstract class HelloWorldHelper
{
/**
* Настройка панели управления
*/
public static function addSubmenu($submenu)
{
JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_MESSAGES'), 'index.php?option=com_helloworld', $submenu == 'messages');
JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_CATEGORIES'), 'index.php?option=com_categories&view=categories&extension=com_helloworld', $submenu == 'categories');
// set some global property
$document = JFactory::getDocument();
$document->addStyleDeclaration('.icon-48-helloworld {background-image: url(../media/com_helloworld/images/tux-48x48.png);}');
if ($submenu == 'categories')
{
$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION_CATEGORIES'));
}
}
}
Эта функция будет автоматически вызывать компонент com_categories. Обратите внимание, что данная функция будет выполнять следующее:
Мы должны изменить основной контроллер для вызова данной функции. Для этого изменим файл admin/controller.php следующим образом:
<?php
// проверка доступа
defined('_JEXEC') or die('Restricted access');
// импорт библиотеки Joomla controller
jimport('joomla.application.component.controller');
/**
* Основной контроллер HelloWorld
*/
class HelloWorldController extends JController
{
function display($cachable = false)
{
// устанавливаем шаблон по умолчанию, если другой не задан
JRequest::setVar('view', JRequest::getCmd('view', 'HelloWorlds'));
// вызываем поведение как у родителя
parent::display($cachable);
// устанавливаем подменю
HelloWorldHelper::addSubmenu('messages');
}
}
Теперь изменим файл admin/helloworld.php:
<?php
// проверка доступа
defined('_JEXEC') or die('Restricted access');
// вызываем helpper файл
JLoader::register('HelloWorldHelper', dirname(__FILE__) . DS . 'helpers' . DS . 'helloworld.php');
// импортируем библиотеку controller
jimport('joomla.application.component.controller');
// получаем экземпляр контроллера HelloWorld
$controller = JController::getInstance('HelloWorld');
// выполняем запрос задачи
$controller->execute(JRequest::getCmd('task'));
// перенаправление
$controller->redirect();
Изменение языкового файла.
Давайте для корректного отображения надписей в нашем компоненте добавим в admin/language/en-GB/en-GB.com_helloworld.ini следующие строки:
COM_HELLOWORLD="Hello World!"
COM_HELLOWORLD_ADMINISTRATION="HelloWorld - Administration"
COM_HELLOWORLD_ADMINISTRATION_CATEGORIES="HelloWorld - Categories"
COM_HELLOWORLD_HELLOWORLD_CREATING="HelloWorld - Creating"
COM_HELLOWORLD_HELLOWORLD_DETAILS="Details"
COM_HELLOWORLD_HELLOWORLD_EDITING="HelloWorld - Editing"
COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE="Some values are unacceptable"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC="The category the messages belongs to"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL="Category"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC="This message will be displayed"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL="Message"
COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING="Greeting"
COM_HELLOWORLD_HELLOWORLD_HEADING_ID="Id"
COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT="HelloWorld manager: Edit Message"
COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW="HelloWorld manager: New Message"
COM_HELLOWORLD_MANAGER_HELLOWORLDS="HelloWorld manager"
COM_HELLOWORLD_N_ITEMS_DELETED_1="One message deleted"
COM_HELLOWORLD_N_ITEMS_DELETED_MORE="%d messages deleted"
COM_HELLOWORLD_SUBMENU_MESSAGES="Messages"
COM_HELLOWORLD_SUBMENU_CATEGORIES="Categories"
На этом все. Осталось изменить файл описания следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.0" method="upgrade">
<name>Hello World!</name>
<!-- Данные о разработчике -->
<creationDate>2012</creationDate>
<author>zloykolobok</author>
<authorEmail></authorEmail>
<authorUrl>http://zloykolobok.blogspot.com</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- Версия продукта-->
<version>0.0.12</version>
<!-- Описание компонента-->
<description>Продолжение статей по созданию расширений для CMS Joomla</description>
<install> <!--Выполняется при установке -->
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall> <!-- Выполняется при удалении-->
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update> <!-- Выполняется при обновлении. Данная функция появиласть с версии 1.6 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Копирование файлов в секцию site-->
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
<folder>models</folder>
<folder>language</folder>
</files>
<!-- в папке media создается папка com_helloworld и туда производиться копирование media-файлов-->
<media destination="com_helloworld" folder="media">
<filename>index.html</filename>
<folder>images</folder>
</media>
<administration>
<!-- меню в административном разделе-->
<menu img="../media/com_helloworld/images/tux-16x16.png">COM_HELLOWORLD_MENU</menu>
<!-- Копирование сайтов в секцию Administration -->
<files folder="admin">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<!-- папка для SQL файлов -->
<folder>sql</folder>
<!-- папка для table-файлов -->
<folder>tables</folder>
<!-- папка для model-файлов-->
<folder>models</folder>
<!-- папка для views-файлов -->
<folder>views</folder>
<!--папка для controller-файлов-->
<folder>controllers</folder>
<!-- папка для helpers-файлов -->
<folder>helpers</folder>
</files>
<languages folder="admin">
<language tag="en-GB">language/en-GB/en-GB.com_helloworld.ini</language>
<language tag="en-GB">language/en-GB/en-GB.com_helloworld.sys.ini</language>
</languages>
</administration>
</extension>
Теперь все поместить в zip-ахив и можно проверять. Скачать исходник данного поста Вы можете отсюда.
В следующей статье мы добавим к нашему компоненту файл конфигурации, который можно будет настраивать из админки. Так, что не пропускайте выхода новых материалов, подписавшись на RSS-рассылку данного блога.
Задача добавления категории к компоненту в CMS Joomla очень простая. Для начала нам необходимо изменить SQL-таблицу нашего компонента. Для этого отредактируем файл admin/sql/install.mysql.utf8.sql следующим образом:
DROP TABLE IF EXISTS `#__helloworld`;
CREATE TABLE `#__helloworld` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`greeting` varchar(25) NOT NULL,
`catid` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');
Этот файл будет выполняться при установке нашего компонента. Теперь добавим файл admin/sql/updates/mysql/0.0.12.sql И поместим в него следующий код:
ALTER TABLE `#__helloworld` ADD `catid` int(11) NOT NULL DEFAULT '0'
А этот файл уже будет выполняться при обновлении нашего компонента. На этом с базой данных мы разобрались. Приступим к редактированию самого компонента.
Изменение формы.
Теперь сообщение HelloWorld будет относиться к категории, поэтому нам необходимо изменить форму редактирования. Для этого изменим код в файле admin/models/forms/helloworld.xml
<?xml version="1.0" encoding="utf-8"?>
<form
addrulepath="/administrator/components/com_helloworld/models/rules"
>
<fieldset>
<field
name="id"
type="hidden"
/>
<field
name="greeting"
type="text"
label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC"
size="40"
class="inputbox validate-greeting"
validate="greeting"
required="true"
default=""
/>
<field
name="catid"
type="category"
extension="com_helloworld"
class="inputbox"
default=""
label="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC"
required="true"
>
<option value="0">JOPTION_SELECT_CATEGORY</option>
</field>
</fieldset>
</form>
Тут следует отметить, что категория может равняться нулю. Это означает, что сообщение не относится ни к какой категории.
Изменим тип меню.
На данный момент в нашем меню выпадает список сообщений. Теперь нам надо добавить еще и категорию. Для этого отредактируем файл admin/models/fields/helloworld.php следующим образом:
<?php
// права доступа
defined('_JEXEC') or die;
// импорт списка типа полей
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');
/**
* поля формы HelloWorld класса для компонента HelloWorld
*/
class JFormFieldHelloWorld extends JFormFieldList
{
protected $type = 'HelloWorld';
protected function getOptions()
{
$db = JFactory::getDBO();
$query = new JDatabaseQuery;
$query->select('#__helloworld.id as id,greeting,#__categories.title as category,catid');
$query->from('#__helloworld');
$query->leftJoin('#__categories on catid=#__categories.id');
$db->setQuery((string)$query);
$messages = $db->loadObjectList();
$options = array();
if ($messages)
{
foreach($messages as $message)
{
$options[] = JHtml::_('select.option', $message->id, $message->greeting . ($message->catid ? ' (' . $message->category . ')' : ''));
}
}
$options = array_merge(parent::getOptions(), $options);
return $options;
}
}
Управление подменю.
Компонент com_categories позволяет с легкостью управлять подменю. Давайте создадим подпапку helpers в папке admin. И уже в этой папке создадим helloworld.php. И добавим в этот файл admin/helpers/helloworld.php следующий код:
<?php
// права доступа
defined('_JEXEC') or die;
/**
* HelloWorld компонент helper.
*/
abstract class HelloWorldHelper
{
/**
* Настройка панели управления
*/
public static function addSubmenu($submenu)
{
JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_MESSAGES'), 'index.php?option=com_helloworld', $submenu == 'messages');
JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_CATEGORIES'), 'index.php?option=com_categories&view=categories&extension=com_helloworld', $submenu == 'categories');
// set some global property
$document = JFactory::getDocument();
$document->addStyleDeclaration('.icon-48-helloworld {background-image: url(../media/com_helloworld/images/tux-48x48.png);}');
if ($submenu == 'categories')
{
$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION_CATEGORIES'));
}
}
}
Эта функция будет автоматически вызывать компонент com_categories. Обратите внимание, что данная функция будет выполнять следующее:
- изменять подменю;
- изменять свойства CSS(для изменения иконки);
- если Вы находитесь в подменю, то заголовок в браузере будет соответствующим;
- изменит название и добавит кнопку “Настройка”.
Мы должны изменить основной контроллер для вызова данной функции. Для этого изменим файл admin/controller.php следующим образом:
<?php
// проверка доступа
defined('_JEXEC') or die('Restricted access');
// импорт библиотеки Joomla controller
jimport('joomla.application.component.controller');
/**
* Основной контроллер HelloWorld
*/
class HelloWorldController extends JController
{
function display($cachable = false)
{
// устанавливаем шаблон по умолчанию, если другой не задан
JRequest::setVar('view', JRequest::getCmd('view', 'HelloWorlds'));
// вызываем поведение как у родителя
parent::display($cachable);
// устанавливаем подменю
HelloWorldHelper::addSubmenu('messages');
}
}
Теперь изменим файл admin/helloworld.php:
<?php
// проверка доступа
defined('_JEXEC') or die('Restricted access');
// вызываем helpper файл
JLoader::register('HelloWorldHelper', dirname(__FILE__) . DS . 'helpers' . DS . 'helloworld.php');
// импортируем библиотеку controller
jimport('joomla.application.component.controller');
// получаем экземпляр контроллера HelloWorld
$controller = JController::getInstance('HelloWorld');
// выполняем запрос задачи
$controller->execute(JRequest::getCmd('task'));
// перенаправление
$controller->redirect();
Изменение языкового файла.
Давайте для корректного отображения надписей в нашем компоненте добавим в admin/language/en-GB/en-GB.com_helloworld.ini следующие строки:
COM_HELLOWORLD="Hello World!"
COM_HELLOWORLD_ADMINISTRATION="HelloWorld - Administration"
COM_HELLOWORLD_ADMINISTRATION_CATEGORIES="HelloWorld - Categories"
COM_HELLOWORLD_HELLOWORLD_CREATING="HelloWorld - Creating"
COM_HELLOWORLD_HELLOWORLD_DETAILS="Details"
COM_HELLOWORLD_HELLOWORLD_EDITING="HelloWorld - Editing"
COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE="Some values are unacceptable"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC="The category the messages belongs to"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL="Category"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC="This message will be displayed"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL="Message"
COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING="Greeting"
COM_HELLOWORLD_HELLOWORLD_HEADING_ID="Id"
COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT="HelloWorld manager: Edit Message"
COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW="HelloWorld manager: New Message"
COM_HELLOWORLD_MANAGER_HELLOWORLDS="HelloWorld manager"
COM_HELLOWORLD_N_ITEMS_DELETED_1="One message deleted"
COM_HELLOWORLD_N_ITEMS_DELETED_MORE="%d messages deleted"
COM_HELLOWORLD_SUBMENU_MESSAGES="Messages"
COM_HELLOWORLD_SUBMENU_CATEGORIES="Categories"
На этом все. Осталось изменить файл описания следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.0" method="upgrade">
<name>Hello World!</name>
<!-- Данные о разработчике -->
<creationDate>2012</creationDate>
<author>zloykolobok</author>
<authorEmail></authorEmail>
<authorUrl>http://zloykolobok.blogspot.com</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- Версия продукта-->
<version>0.0.12</version>
<!-- Описание компонента-->
<description>Продолжение статей по созданию расширений для CMS Joomla</description>
<install> <!--Выполняется при установке -->
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall> <!-- Выполняется при удалении-->
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update> <!-- Выполняется при обновлении. Данная функция появиласть с версии 1.6 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Копирование файлов в секцию site-->
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
<folder>models</folder>
<folder>language</folder>
</files>
<!-- в папке media создается папка com_helloworld и туда производиться копирование media-файлов-->
<media destination="com_helloworld" folder="media">
<filename>index.html</filename>
<folder>images</folder>
</media>
<administration>
<!-- меню в административном разделе-->
<menu img="../media/com_helloworld/images/tux-16x16.png">COM_HELLOWORLD_MENU</menu>
<!-- Копирование сайтов в секцию Administration -->
<files folder="admin">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<!-- папка для SQL файлов -->
<folder>sql</folder>
<!-- папка для table-файлов -->
<folder>tables</folder>
<!-- папка для model-файлов-->
<folder>models</folder>
<!-- папка для views-файлов -->
<folder>views</folder>
<!--папка для controller-файлов-->
<folder>controllers</folder>
<!-- папка для helpers-файлов -->
<folder>helpers</folder>
</files>
<languages folder="admin">
<language tag="en-GB">language/en-GB/en-GB.com_helloworld.ini</language>
<language tag="en-GB">language/en-GB/en-GB.com_helloworld.sys.ini</language>
</languages>
</administration>
</extension>
Теперь все поместить в zip-ахив и можно проверять. Скачать исходник данного поста Вы можете отсюда.
В следующей статье мы добавим к нашему компоненту файл конфигурации, который можно будет настраивать из админки. Так, что не пропускайте выхода новых материалов, подписавшись на RSS-рассылку данного блога.
0 коммент.:
Отправить комментарий