понедельник, 27 февраля 2012 г.

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

Доброго времени суток. Сегодня я хочу продолжить серию статей по созданию компонента для CMS Joomla. Напомню, что в прошлой статье данного цикла мы остановились на добавлении категорий к нашему компоненту. Ну а сегодня мы рассмотрим добавление конфигурации компонента для CMS Joomla, которую можно изменять из админки. 

Итак, у нас есть компонент из прошлого урока, Вы можете скачать его по этой ссылке. И мы будем расширять функционал именно этого компонента.
Добавление конфигурационных параметров.
Joomla позволяет хранить параметры каждого компонента. Для того, чтобы это реализовать необходимо в папке admin создать файл config.xml. И добавить в него следующий код:
<?xml version="1.0" encoding="utf-8"?>
<config>
   <fieldset
       name="greetings"
       label="COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_LABEL"
       description="COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_DESC"
   >
       <field
           name="show_category"
           type="radio"
           label="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_LABEL"
           description="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_DESC"
           default="0"
       >
           <option value="0">JHIDE</option>
           <option value="1">JSHOW</option>
       </field>
   </fieldset>
</config>
Этот файл будет прочитан компонентом com_config, который является компонентом ядра  CMS Joomla. В нашем случае мы опрtделили только один параметр: отображать название категории или не отображать.
Теперь, чтобы вызвать окно настройки создадим в панели инструментов нашего компонента кнопку Настройка.
Добавление кнопки Настройка в панель инструментов.
Для того, чтобы добавить кнопку Настройка отредактируем файл admin/views/helloworlds/view.html.php следующим образом:
<?php
// права доступа
defined('_JEXEC') or die('Restricted access');

// импортируем библиотеку View
jimport('joomla.application.component.view');

/**
* создаем класс HelloWorlds
*/
class HelloWorldViewHelloWorlds extends JView
{
   function display($tpl = null)  
   {
       // берем данные
       $items = $this->get('Items');
       $pagination = $this->get('Pagination');

       // проверяем на наличие ошибок
       if (count($errors = $this->get('Errors')))  
       {
           JError::raiseError(500, implode('<br />', $errors));
           return false;
       }
       // Помещаем данные во view
       $this->items = $items;
       $this->pagination = $pagination;

       // устанавливаем панель инструментов
       $this->addToolBar();

       // показываем шаблон
       parent::display($tpl);

       // Передаем установки title
       $this->setDocument();
   }

   /**
    * настраиваем панель инструментов
    */
   protected function addToolBar()  
   {
       JToolBarHelper::title(JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLDS'), 'helloworld');
       JToolBarHelper::deleteListX('', 'helloworlds.delete');
       JToolBarHelper::editListX('helloworld.edit');
       JToolBarHelper::addNewX('helloworld.add');
       JToolBarHelper::preferences('com_helloworld');
   }
   protected function setDocument()  
   {
       $document = JFactory::getDocument();
       $document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION'));
   }
}
Используем параметры конфигурации по умолчанию.
Для того, чтобы установить параметры конфигурации по умолчанию, нам необходимо отредактировать файл admin/models/forms/helloworld.xml следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<form
    addrulepath="/administrator/components/com_helloworld/models/rules"
>
    <fieldset name="details">
        <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>
    <fields name="params">
        <fieldset
            name="params"
            label="JGLOBAL_FIELDSET_DISPLAY_OPTIONS"
        >
            <field
                name="show_category"
                type="list"
                label="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_LABEL"
                description="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_DESC"
                default=""
            >
                <option value="">JGLOBAL_USE_GLOBAL</option>
                <option value="0">JHIDE</option>
                <option value="1">JSHOW</option>
            </field>
        </fieldset>
    </fields>
</form>

Изменение SQL.
Нам необходимо изменить структуру таблицы базы данных. Теперь у нас есть дополнительное поле params. Изменим файл 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',
 `params` TEXT NOT NULL DEFAULT '',
  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.13.sql, который выполняется при обновлении нашего компонента:
ALTER TABLE `#__helloworld` ADD `params` VARCHAR(1024) NOT NULL DEFAULT '';
Также нам необходимо изменить TableHelloWorld для того, чтобы он начал использовать данное поле. Для реализации этого мы отредактируем файл admin/tables/helloworld.php:
<?php
// права доступа
defined('_JEXEC') or die('Restricted access');

// импортируем библиотеку table
jimport('joomla.database.table');

/**
* Класс Hello Table
*/
class HelloWorldTableHelloWorld extends JTable
{

   function __construct(&$db)  
   {
       parent::__construct('#__helloworld', 'id', $db);
   }

   public function bind($array, $ignore = '')  
   {
       if (isset($array['params']) && is_array($array['params']))  
       {
           // Конвертируем параметры поля params в строку
           $parameter = new JRegistry;
           $parameter->loadArray($array['params']);
           $array['params'] = (string)$parameter;
       }
       return parent::bind($array, $ignore);
   }

   public function load($pk = null, $reset = true)  
   {
       if (parent::load($pk, $reset))  
       {
           // Изменяем регистр поля params
           $params = new JRegistry;
           $params->loadJSON($this->params);
           $this->params = $params;
           return true;
       }
       else
       {
           return false;
       }
   }
}
Изменяем компонент в админке.
Для того, чтобы изменить наш компонент в админке необходимо отредактировать файл admin/views/helloworld/tmpl/edit.php следующим образом:
<?php
// права доступа
defined('_JEXEC') or die('Restricted access');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
$params = $this->form->getFieldsets('params');
?>
<form action="<?php echo JRoute::_('index.php?option=com_helloworld&layout=edit&id='.(int) $this->item->id); ?>"
     method="post" name="adminForm" id="helloworld-form" class="form-validate">

   <div class="width-60 fltlft">
       <fieldset class="adminform">
           <legend><?php echo JText::_( 'COM_HELLOWORLD_HELLOWORLD_DETAILS' ); ?></legend>
           <ul class="adminformlist">
<?php foreach($this->form->getFieldset('details') as $field): ?>
               <li><?php echo $field->label;echo $field->input;?></li>
<?php endforeach; ?>
           </ul>
   </div>

   <div class="width-40 fltrt">
       <?php echo JHtml::_('sliders.start', 'helloworld-slider'); ?>
<?php foreach ($params as $name => $fieldset): ?>
       <?php echo JHtml::_('sliders.panel', JText::_($fieldset->label), $name.'-params');?>
   <?php if (isset($fieldset->description) && trim($fieldset->description)): ?>
       <p class="tip"><?php echo $this->escape(JText::_($fieldset->description));?></p>
   <?php endif;?>
       <fieldset class="panelform" >
           <ul class="adminformlist">
   <?php foreach ($this->form->getFieldset($name) as $field) : ?>
               <li><?php echo $field->label; ?><?php echo $field->input; ?></li>
   <?php endforeach; ?>
           </ul>
       </fieldset>
<?php endforeach; ?>

       <?php echo JHtml::_('sliders.end'); ?>
   </div>

   <div>
       <input type="hidden" name="task" value="helloworld.edit" />
       <?php echo JHtml::_('form.token'); ?>
   </div>
</form>
Изменение интерфейса.
Интерфейс необходимо изменить в соответствии с новым параметром. Для этого мы должны изменить модель: должна обьединить глобальные и индивидуальные параметры, она должна иметь доступ к категориям.
Для этого подправим следующий файл site/models/helloworld.php:
<?php
// Права доступа
defined('_JEXEC') or die('Restricted access');

// Загружаем библиотеку joomla.application.component.modelitem
jimport('joomla.application.component.modelitem');

/**
* Модель HelloWorld
*/
class HelloWorldModelHelloWorld extends JModelItem
{

   protected $item;

   protected function populateState()  
   {
       $app = JFactory::getApplication();
       // получаем id сообщения
       $id = JRequest::getInt('id');
       $this->setState('message.id', $id);

       // загружаем параметры
       $params = $app->getParams();
       $this->setState('params', $params);
       parent::populateState();
   }

   public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array())  
   {
       return JTable::getInstance($type, $prefix, $config);
   }


   public function getItem()  
   {
       if (!isset($this->item))  
       {
           $id = $this->getState('message.id');
           $this->_db->setQuery($this->_db->getQuery(true)
               ->from('#__helloworld as h')
               ->leftJoin('#__categories as c ON h.catid=c.id')
               ->select('h.greeting, h.params, c.title as category')
               ->where('h.id=' . (int)$id));
           if (!$this->item = $this->_db->loadObject())  
           {
               $this->setError($this->_db->getError());
           }
           else
           {
               // загружаем строку JSON
               $params = new JRegistry;
               $params->loadJSON($this->item->params);
               $this->item->params = $params;

               // применяем глобальные параметры
               $params = clone $this->getState('params');
               $params->merge($this->item->params);
               $this->item->params = $params;
           }
       }
       return $this->item;
   }
}
Вид должен запрашивать у модели данной категории. Для этого изменим файл site/views/helloworld/view.html.php
<?php
// Защита доступа
defined('_JEXEC') or die('Restricted access');

// импорт библиотеки контроллеров joomla
jimport('joomla.application.component.view');

/**
* HTML представление класса для компонента HelloWorld
*/
class HelloWorldViewHelloWorld extends JView
{
   // Перезаписываем JView метод display
   function display($tpl = null)  
   {
       // Назначаем данные для просмотра
       $this->item = $this->get('Item');

       // проверяем на ошибки
       if (count($errors = $this->get('Errors')))  
       {
           JError::raiseError(500, implode('<br />', $errors));
           return false;
       }
       // Показываем представление
       parent::display($tpl);
   }
}
Теперь наше представление может корректно отображать сообщение с категорией или не отображать.
Отредактируем файл site/views/helloworld/tmpl/default.php
<?php
// защита доступа
defined('_JEXEC') or die('Restricted access');
?>
<h1><?php echo $this->item->greeting.(($this->item->category and $this->item->params->get('show_category'))
                                     ? (' ('.$this->item->category.')') : ''); ?>
</h1>
На этом все, осталось изменить файл описания.
<?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.13</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">
           <!-- Admin Main File Copy Section -->
           <filename>index.html</filename>
           <filename>config.xml</filename>
           <filename>helloworld.php</filename>
           <filename>controller.php</filename>
           <!-- папка для SQL файлов -->
           <folder>sql</folder>
           <!-- папка для table-файлов -->
           <folder>tables</folder>
           <!-- models files section -->
           <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>
Теперь мы можем изменять конфигурацию нашего компонента: показывать или не показывать категории в компоненте. Скачать исходник данного поста Вы можете по этой ссылке.
Если Вам нравятся статьи данного блога, то подпишитесь на RSS-рассылку данного блога.
А на этом все, всем удачной разработки на CMS Joomla.  

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

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



3 комментария:

  1. В 12-ой части у вас серьезная ошибка, и в 13-ой она не исправлена, проверте ваши коды еще раз

    ОтветитьУдалить
    Ответы
    1. Если Вам не сложно уточните где именно Вы заметили грубую ошибку.

      Удалить
    2. установите зип архив, который вы предоставили для скачивания и попробуйте прикрутить его к меню, ну или если у вас уже создан для этого пунк меню, попробуйте его отредактировать

      ошибка кроется в обращении к базе данных

      Удалить