пятница, 24 февраля 2012 г.

Создание компонента для CMS Joomla. Часть 12. Добавление категорий.

Доброго времени суток. И мы снова возвращаемся к созданию компонента для 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. Обратите внимание, что данная функция будет выполнять следующее:
  • изменять подменю;
  • изменять свойства 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-рассылку  данного блога.

Понравилась статья? Поблагодарить автора:

Введите e-mail адрес:



0 коммент.:

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