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

Создание компонента для CMS Joomla. Часть 11. Проверка данных.

Доброго времени суток, читатель блога zloykolobok.blogspot.com. Сегодня мы продолжим создавать компонент для CMS Joomla. Так в прошлой статье мы с Вами рассмотрели добавления различных украшений к нашему компоненту. А сегодня остановимся на очень важном моменте - проверке введенных данных пользователем. Я думаю, что говорить о важности проверки введенного e-mail пользователем, или заполнения поля ip-адрес нет необходимости. Все это понимают.
Ну что ж. Давайте приступим к реализации задуманного...

Реализацию проверки данных мы можем выполнять как на стороне клиента, так и на стороне сервера. Вам решать где делать проверку данных. Оба способа имеют и плюсы, и минусы. Но мы рассмотрим оба способа.
Проверка введенных данных на стороне клиента.
Введенные данные в форме будем проверять с помощью JavaScript.
Для этого в файле admin/views/helloworld/tmpl/edit.php изменим код на:

<?php
// права доступа
defined('_JEXEC') or die('Restricted access');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
?>
<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">
   <fieldset class="adminform">
       <legend><?php echo JText::_( 'COM_HELLOWORLD_HELLOWORLD_DETAILS' ); ?></legend>
       <?php foreach($this->form->getFieldset() as $field): ?>
           <?php if (!$field->hidden): ?>
               <?php echo $field->label; ?>
           <?php endif; ?>
           <?php echo $field->input; ?>
       <?php endforeach; ?>
   </fieldset>
   <div>
       <input type="hidden" name="task" value="helloworld.edit" />
       <?php echo JHtml::_('form.token'); ?>
   </div>
</form>
В этом файле мы добавили CSS класс проверки и добавили: JHtml::_('behavior.formvalidation'), который подключает встроенный javascript проверки формы в CMS Joomla.
Теперь нам необходимо указать какое поле мы будем проверять для этого нам необходимо изменить файл 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_GREETING_LABEL"
           description="COM_HELLOWORLD_HELLOWORLD_GREETING_DESC"
           size="40"
           class="inputbox validate-greeting"
           validate="greeting"
           required="true"
           default=""
       />
   </fieldset>
</form>

Тут нужно  отметить, что поле “greeting” является классом “inputbox validate-greeting” и required мы поставили атрибут true - это означает, что поле greeting является обязательным для заполнения и требует прохождения проверки.
Теперь создадим файл helloworld.js в admin/models/forms/ и добавим следующий код:

window.addEvent('domready', function() {
    document.formvalidator.setHandler('greeting',
        function (value) {
            regex=/^[^0-9]+$/;
            return regex.test(value);
    });
});

Останавливаться на JavaScript я не буду - это отдельная и немаленькая тема. Но отметим, что данный скрипт добавляет обработчик проверки к форме поле которой имеет имя greeting.
И осталось написать обработчик проверки, когда нажата кнопка “Сохранить”. Для этого создадим файл submitbutton.js в папке admin/views/helloworld/ и добавим туда следующий код:

Joomla.submitbutton = function(task)
{
    if (task == '')
    {
        return false;
    }
    else
    {
        var isValid=true;
        var action = task.split('.');
        if (action[1] != 'cancel' && action[1] != 'close')
        {
            var forms = $$('form.form-validate');
            for (var i=0;i<forms.length;i++)
            {
                if (!document.formvalidator.isValid(forms[i]))
                {
                    isValid = false;
                    break;
                }
            }
        }

        if (isValid)
        {
            Joomla.submitform(task);
            return true;
        }
        else
        {
            alert(Joomla.JText._('COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE',
                                 'Some values are unacceptable'));
            return false;
        }
    }
}


Эта функция будет проверять, что все формы, которые имеют класс form-validate будут действительны, т.е. прошедшие проверку. И тут хотелось бы отметить, что данный обработчик будет выводить предупреждения в стиле Joomla.
Теперь нам необходимо изменить класс HelloWorldViewHelloWorld
представления, который описывается в admin/views/helloworld/view.html.php для того чтобы подключить данный обработчик JavaScript. Для этого в файле admin/views/helloworld/view.html.php изменим следующим образом код:

<?php
// права доступа
defined('_JEXEC') or die('Restricted access');

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

/**
* создаем класс HelloWorld
*/
class HelloWorldViewHelloWorld extends JView
{
   public function display($tpl = null)
   {
       // вытаскиваем данные
       $form = $this->get('Form');
       $item = $this->get('Item');
       $script = $this->get('Script');

       // проверяем на наличие ошибок
       if (count($errors = $this->get('Errors')))
       {
           JError::raiseError(500, implode('<br />', $errors));
           return false;
       }
       // Вывод данных для просмотра
       $this->form = $form;
       $this->item = $item;
       $this->script = $script;

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

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

       // передаем title
       $this->setDocument();
   }

   /**
    * Настройка панели инструментов
    */
   protected function addToolBar()
   {
       JRequest::setVar('hidemainmenu', true);
       $isNew = ($this->item->id == 0);
       JToolBarHelper::title($isNew ? JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW')
                                    : JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT'), 'helloworld');
       JToolBarHelper::save('helloworld.save');
       JToolBarHelper::cancel('helloworld.cancel', $isNew ? 'JTOOLBAR_CANCEL' : 'JTOOLBAR_CLOSE');
   }
   
   protected function setDocument()
   {
       $isNew = ($this->item->id < 1);
       $document = JFactory::getDocument();
       $document->setTitle($isNew ? JText::_('COM_HELLOWORLD_HELLOWORLD_CREATING')
                                  : JText::_('COM_HELLOWORLD_HELLOWORLD_EDITING'));
       $document->addScript(JURI::root() . $this->script);
       $document->addScript(JURI::root() . "/administrator/components/com_helloworld"
                                         . "/views/helloworld/submitbutton.js");
       JText::script('COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE');
   }
}

И последнее, что нам осталось сделать - это реализовать фуекцию getScript в модели HelloWorldModelHelloWorld. Для этого изменим код в файле admin/models/helloworld.php следующим образом:

<?php
// права доступа
defined('_JEXEC') or die('Restricted access');

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

/**
* Модель HelloWorld
*/
class HelloWorldModelHelloWorld extends JModelAdmin
{
   public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array())
   {
       return JTable::getInstance($type, $prefix, $config);
   }
   public function getForm($data = array(), $loadData = true)
   {
       // получение формы
       $form = $this->loadForm('com_helloworld.helloworld', 'helloworld',
                               array('control' => 'jform', 'load_data' => $loadData));
       if (empty($form))
       {
           return false;
       }
       return $form;
   }

   public function getScript()
   {
       return 'administrator/components/com_helloworld/models/forms/helloworld.js';
   }

   protected function loadFormData()
   {
       // проверка раннее веденных данных
       $data = JFactory::getApplication()->getUserState('com_helloworld.edit.helloworld.data', array());
       if (empty($data))
       {
           $data = $this->getItem();
       }
       return $data;
   }
}

Проверка введенных данных на стороне сервера.
Проверка формы на стороне сервера осуществляется наследованием класса контроллера JControllerForm. И как раз в файле admin/models/forms/helloworld.xml мы указали в поле greeting (validate="greeting"), что оно у нас проверяется функциями, которые описаны в файле greering.php. Данный файл находиться в admin/models/rules.
Давайте создадим файл greeting.php в папке admin/models/rules и добавим в него следующий код:
<?php
// Проверка доступа
defined('_JEXEC') or die('Restricted access');

// импорт библиотеки formule
jimport('joomla.form.formrule');

/**
* Форма правил класса для проверки в Joomla
*/
class JFormRuleGreeting extends JFormRule
{
   protected $regex = '^[^0-9]+$';
}

На этом все. Осталось изменить файл описания следующим образом:

<?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.11</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>
       </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>

и откорректировать вывод сообщения об неправильности введённых данных. Для этого в файле admin/language/en-GB/en-GB.com_helloworld.ini добавим к нашему коду следующую строку:
COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE="Введенные данные неприемлемы"
Теперь все сохраним и запакуем в zip архив. Скачать исходники данного урока Вы можете по этой ссылке.

На этом урок посвященный валлидации введеннных пользователем данных завершен. Если у Вас возникли вопросы пишите в комментариях и я постараюсь на них ответить. А на этом все. Не пропускайте выхода новых постов, подписавшись на RSS-рассылку

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

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



0 коммент.:

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