Замена компонента Ext.form.field.Date на Ext.ux.form.DateTimeField и шаблона автоматической генерации интерфейсов DVelum 1.x
Заменим стандартный компонент дизайнера интерфейса Ext.form.field.Date на Ext.ux.DateTimeField с поддержкой ввода времени и шаблон автоматической генерации интерфейсов.
Для примера возьмем сторонний компонент Ext.ux.DateTimeField
https://github.com/gportela85/DateTimeField/tree/master/src
Скачиваем два js-файла:
- DateTimeField.js
- DateTimePicker.js
Копируем файлы на платформу в папку www/js/lib/ext_ux/
Теперь необходимо описать объект дизайнера интерфейсов, делается это в два шага:
1) Создание класса объекта
Поскольку это поле формы, расположим его по адресу dvelum/library/Ext/Component/Field/Ux/Datetime.php
Опишем класс, т.к. у него не будет явной собственной логики, достаточно просто объявить класс и отнаследовать его от Ext_Object.
<?php
class Ext_Component_Field_Ux_Datetime extends Ext_Object{
}
2) Описание набора свойств компонента
Создадим класс свойств dvelum/library/Ext/Property/Component/Field/Ux/Datetime.php
В этом классе должны описываться свойства компонента ExtJs, если быть точнее, параметры config.
<?php
class Ext_Property_Component_Field_Ux_Datetime extends Ext_Property_Form_Field_Date
{
static public $extend = 'Ext.ux.DateTimeField';
static public $xtype = 'datetimefield';
}
Поскольку компонент наследует все свойства от DateField и не содержит собственных настроек, просто отнаследуем класс от Ext_Property_Form_Field_Date.
Далее необходимо указать системные настройки компонента:
- static public $xtype - xtype компонента, в данном случае это datetimefield;
- static public $extend - имя класса для конструкции extend и Ext.create, в данном случае это Ext.ux.DateTimeField.
Теперь компонент будет автоматически распознан системой, осталось подключить js-файлы в интерфейс.
Вносим изменения в в файл конфигурации js_inc_backend.php, для этого копируем application/configs/dist/js_inc_backend.php в application/configs/local/js_inc_backend.php
и добавляем в сецию JS следующие строки:
<?php
...
'js' => [
...
'/js/lib/ext_ux/DateTimePicker.js'=> ['order'=>3, 'minified'=>false],
'/js/lib/ext_ux/DateTimeField.js'=> ['order'=>4, 'minified'=>false],
]
...
На этом все, компонент интегрирован в систему. Проверить его можно, загрузив дизайнер интерфейсов, выбрав поле формы и на панели свойств нажав Change field type.
Поле появится в списке адаптеров.
Возможно, возникнет желание использовать это поле при импорте данных из ORM и при автоматической генерации интерфейса (вместо «datefield»). Подменить поле достаточно просто.
Открываем файл класса Backend_Designer_Import (dvelum/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'; так же не забываем выставить нужный формат $newField->submitFormat и altFormats.
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->