-
Notifications
You must be signed in to change notification settings - Fork 35
Работа с полем раздела Гибридные данные
По умолчанию все созданные поля для раздела находится в плагине hybrid, но при создании своих собственных типов полей их можно сделать в виде отдельного плагина, просто соблюсти файловую структуру.
plugin_name
|
classes\datasource\hybrid\field\ - путь до класса поля
|
views\datasource\hybrid\field\edit\ - путь до шаблона настроек поля при создании и редактировании (Наличие не обязательно)
views\datasource\hybrid\document\fields\ - путь до шаблона отображения в редакторе документа
|
config\fields.php
Итак, в системе сейчас имеется три типа полей:
-
DataSource_Hybrid_Field::FAMILY_PRIMITIVE
Примитивное поле -
DataSource_Hybrid_Field::FAMILY_FILE
Файловое поле -
DataSource_Hybrid_Field::FAMILY_SOURCE
Поле связи с другими разделами
Придерживаться этих типов не обязательно, можно указать произвольный тип поля. В системе есть только привязка к типу поля File https://github.com/butschster/kodicms/blob/hybrid/cms/plugins/hybrid/classes/datasource/hybrid/document.php#L113 В момент отправки данных документа идет разделение массивов.
Создание нового поля начинается с конфига, все поля описываются в конфиг файле /config/fields.php
, если вы создаете в своем плагине, то в корне плагина в папке конфиг нужно создать файл fields.php
с содержанием:
<?php defined('SYSPATH') or die('No direct access allowed.');
return array(
// В выпадающем списке будет в указанной подкатегории (Название категории любое)
'Category name' => array(
'field_type' => 'Field name' // Тип поля и его название
),
// Поле без категории
'field_type2' => 'Field name 2'
);
Полей может быть сколько угодно. Массив из конфига используется только на странице создания поля в выпадающем списке.
field_type - в примере конфига тип вашего будущего поля, по названию типа поля идет поиска класса поля, т.е,
в данном случае название класса и расположение файла (согласно логике Kohana):
DataSource_Hybrid_Field_Field_Type - classes\datasource\hybrid\field\field\type.php
Все классы полей наследуются от класса DataSource_Hybrid_Field
https://github.com/butschster/kodicms/blob/hybrid/cms/plugins/hybrid/classes/datasource/hybrid/field.php и в них обязательно должен быть указан параметр family
Пример класса поля:
//С самостоятельным указанием семейства поля
class DataSource_Hybrid_Field_Field_Type extends DataSource_Hybrid_Field {
public function __construct( array $data )
{
parent::__construct( $data );
// Может быть любым
$this->family = DataSource_Hybrid_Field::FAMILY_PRIMITIVE;
}
public function get_type()
{
return 'VARCHAR (50) NOT NULL';
}
}
Или
//Наследование от класса семейства поля
class DataSource_Hybrid_Field_Field_Type extends DataSource_Hybrid_Field_Primitive {}
class DataSource_Hybrid_Field_Field_Type extends DataSource_Hybrid_Field_Source {}
class DataSource_Hybrid_Field_Field_Type extends DataSource_Hybrid_Field_File {}
При сохранении формы с настройками поля все данные формы передаются в метод DataSource_Hybrid_Field::set( array $data )
В этом методе массив прогоняется в цикле и происходит присвоение переданных значений
foreach ( $data as $key => $value )
{
$method = "set_{$key}"; // Происходит поиск метода set_{key} и если он существует, то передача значения в него
if(method_exists($this, $method))
{
$this->$method($value);
}
else Если нет то __set($key, $value);
{
$this->{$key} = $value;
}
}
Правила валидации настроек указываются в методе DataSource_Hybrid_Field::rules()
аналогично Kohana ORM. При использовании чекбоксов в настройках поля при сохранении все чекбоксы в неактивном состоянии не попадают в метод DataSource_Hybrid_Field::set()
, что приводит к тому, что если чекбокс активен, то его не получится отключить, для этого необходимо переопределить метод DataSource_Hybrid_Field::set
в своем классе:
public function set( array $data )
{
$data['checkbox'] = !empty($data['checkbox']) ? TRUE : FALSE;
return parent::set( $data );
}
В будущих релизах этот недостаток будет исправлен.
Цепочка событий в момент создания, сохранения, загрузки документа
В момент передачи полю документа значения происходит происходит вызов метода поля DataSource_Hybrid_Field::onSetValue
, и то значение, что вернет этот метод будет присвоено полю документа.
=>
в момент вызова метода документа DataSource_Hybrid_Document::read_values
и DataSource_Hybrid_Document::read_files
в которые передаются значение $_POST
и $_FILES
массивов происходит вызов события в каждом поле документа DataSource_Hybrid_Field::onReadDocumentValue
=>
После присвоения полям документа значение происходит валидация документа и запуск события в каждом поле
DataSource_Hybrid_Field::onValidateDocument
в котором можно указать для поля свои правила валидации значения.
=>
При создании документа запускается событие DataSource_Hybrid_Field::onCreateDocument
.
При обновлении DataSource_Hybrid_Field::onUpdateDocument
При удалении DataSource_Hybrid_Field::onRemoveDocument
Класс DataSource_Hybrid_Field
имеет описание для каждого метода, поэтому с этим можно более менее разобраться
-
public $id
- Идентификатор поля -
public $header
- Название поля -
public $ds_id
- Идентификатор раздела -
public $name
- Ключ поля с преффиксом -
public $key
- Ключ поля без преффикса -
public $position
- Позиция поля -
protected $_props
- Массив параметров поля (Сериализуется при сохранении в БД) -
protected $_use_as_document_id
- Поле можно использовать в качестве идентификатора документа -
protected $_is_sortable
- Поле можно использовать в сортировке -
protected $_widget_types
- Типы виджетов, которые могут быть связаны с полем -
protected $_is_required
- Возможность убрать ограничение поля на обязательность (Например как поля Boolean (https://github.com/butschster/kodicms/blob/hybrid/cms/plugins/hybrid/classes/datasource/hybrid/field/primitive/boolean.php#L9)) Используется в шаблоне создания и редактирования поля.