Skip to content

Работа с полем раздела Гибридные данные

butschster edited this page Mar 25, 2014 · 2 revisions

Работа с гибридным полем раздела "Гибридные данные"


Файловая структура:

По умолчанию все созданные поля для раздела находится в плагине 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)) Используется в шаблоне создания и редактирования поля.

Продолжение следует