Замена компонента Ext.form.field.Date на Ext.ux.form.DateTimeField и шаблона автоматической генерации интерфейсов
Заменим стандартный компонент дизайнера интерфейса Ext.form.field.Date на Ext.ux.form.DateTimeField с поддержкой ввода времени и шаблон автоматической генерации интерфейсов.
Для примера возьмем сторонний компонент Ext.ux.DateTimeField
http://www.sencha.com/forum/showthread.php?137242
Скачиваем архив, находим в нем четыре js-файла с классами:
- UX_DateTimeField.js
- UX_DateTimeMenu.js
- UX_DateTimePicker.js
- UX_TimePickerField.js
Копируем файлы на платформу в папку js/lib/ext_ux/
Теперь необходимо описать объект дизайнера интерфейсов, делается это в два шага:
1) Создание класса объекта
Поскольку это поле формы, расположим его по адресу www/system/library/Ext/Component/Field/Ux/Datetime.php
Опишем класс, т.к. у него не будет явной собственной логики, достаточно просто объявить класс и отнаследовать его от Ext_Object.
<?php
class Ext_Component_Field_Ux_Datetime extends Ext_Object{
}
2) Описание набора свойств компонента
Создадим класс свойств по адресу www/system/library/Ext/Property/Component/Field/Ux/Datetime
В этом классе должны описываться свойства компонента ExtJs, если быть точнее, параметры config.
<?php
class Ext_Property_Component_Field_Ux_Datetime extends Ext_Property_Form_Field_Date
{
static public $extend = 'Ext.ux.form.DateTimeField';
static public $xtype = 'datetimefield';
}
Поскольку компонент наследует все свойства от DateField и не содержит собственных настроек, просто отнаследуем класс от Ext_Property_Form_Field_Date.
Далее необходимо указать системные настройки компонента:
- static public $xtype - xtype компонента, в данном случае это datetimefield;
- static public $extend - имя класса для конструкции extend и Ext.create, в данном случае это Ext.ux.form.DateTimeField.
Теперь компонент будет автоматически распознан системой, осталось подключить js-файлы в интерфейс.
В DVelum версии 0.8.9 и выше заносим их в файл конфигурации system/config/js_inc_backend.php :
<?php
return array(
...
'/js/lib/ext_ux/UX_DateTimeField.js'=> array('order'=>4,'minified'=>false),
'/js/lib/ext_ux/UX_DateTimeMenu.js'=> array('order'=>5),'minified'=>false),
'/js/lib/ext_ux/UX_DateTimePicker.js'=> array('order'=>3,'minified'=>false),
'/js/lib/ext_ux/UX_TimePickerField.js'=> array('order'=>2,'minified'=>false),
...
);
В более ранних версиях системы придется подключать эти файлы в контроллерах:
Backend_Controller_Crud и Backend_Designer_Sub_Viewframe
Возможно понадобится добавить в Backend_Controller:
<?php
abstract class Backend_Controller_Crud extends Backend_Controller
{
public function indexAction()
{
...
$this->_resource->addJs('/js/lib/ext_ux/UX_TimePickerField.js', 1);
$this->_resource->addJs('/js/lib/ext_ux/UX_DateTimePicker.js', 2);
$this->_resource->addJs('/js/lib/ext_ux/UX_DateTimeField.js', 1);
....
<?php
class Backend_Designer_Sub_Viewframe extends Backend_Designer_Sub
{
public function indexAction()
{
...
$res->addJs('/js/lib/ext_ux/UX_TimePickerField.js', 0);
$res->addJs('/js/lib/ext_ux/UX_DateTimePicker.js', 0);
$res->addJs('/js/lib/ext_ux/UX_DateTimeField.js', 0);
....
На этом все, компонент интегрирован в систему. Проверить его можно, загрузив дизайнер интерфейсов, выбрав поле формы и на панели свойств нажав Change field type.
Поле появится в списке адаптеров.
Возможно, возникнет желание использовать это поле при импорте данных из ORM и при автоматической генерации интерфейса (вместо «datefield»). Подменить поле достаточно просто.
Открываем файл класса Backend_Designer_Import (www/system/app/Backend/Designer/Import.php)
Находим в нем метод static public function convertOrmFieldToExtField и заменяем кусок, отвечающий за создание поля даты:
Ext_Factory::object('Form_Field_Date'); на Ext_Factory::object('Component_Field_Ux_Datetime');
Выставляем формат $newField->format = 'd.m.Y H:i:s';
class Backend_Designer_Import
{
...
static public function convertOrmFieldToExtField($name , $fieldConfig)
{
...
/*
* Date time
*/
elseif(in_array($type, Db_Object_Builder::$dateTypes, true))
{
switch ($type)
{
case 'date':
$newField = Ext_Factory::object('Form_Field_Date');
$newField->format = 'd.m.Y';
$newField->submitFormat = 'Y-m-d';
break;
case 'datetime':
$newField = Ext_Factory::object('Component_Field_Ux_Datetime');
$newField->format = 'd.m.Y H:i:s';
$newField->submitFormat = 'Y-m-d H:i:s';
break;
case 'time':break;
/*
* not used
*/
$newField = Ext_Factory::object('Form_Field_Time');
break;
}
}
...
}
....
Теперь интерфейс генерируется с этим полем.
$res->