Доброго времени суток, читатель блога 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-рассылку.
Ну что ж. Давайте приступим к реализации задуманного...
Реализацию проверки данных мы можем выполнять как на стороне клиента, так и на стороне сервера. Вам решать где делать проверку данных. Оба способа имеют и плюсы, и минусы. Но мы рассмотрим оба способа.
Проверка введенных данных на стороне клиента.
Введенные данные в форме будем проверять с помощью 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-рассылку.
0 коммент.:
Отправить комментарий