214 lines
5.6 KiB
PHP
214 lines
5.6 KiB
PHP
<?php
|
||
|
||
/**
|
||
* При рендеринге каждому классу соответствует шаблон (см. themes/maxim/templates/macros.html)
|
||
*/
|
||
|
||
class TCheckbox extends Form_Field
|
||
{
|
||
public $checked = false;
|
||
function setValue($value)
|
||
{
|
||
$this->value = $value;
|
||
$this->checked = $value;
|
||
}
|
||
}
|
||
|
||
class TQuestionType extends Form_Select
|
||
{
|
||
function setValue($value)
|
||
{
|
||
// Установить selected у options
|
||
$this->value = $value;
|
||
foreach ($this->options as &$option) {
|
||
$option['selected'] = ($option['value'] == $value);
|
||
}
|
||
}
|
||
}
|
||
|
||
class TDateTime extends Form_Input {
|
||
}
|
||
|
||
/**
|
||
* Поле для ввода пароля
|
||
*/
|
||
class TSecret extends Form_Field {
|
||
}
|
||
|
||
class TUpload extends Form_Field {
|
||
}
|
||
|
||
class THidden extends Form_Input {
|
||
public $hidden = true;
|
||
}
|
||
|
||
class TComponentBrowserInput extends Form_Input {
|
||
}
|
||
|
||
/**
|
||
* Форма для ввода
|
||
*/
|
||
class Form_Form extends View_View {
|
||
public $field = array(); //Поля формы
|
||
public $fieldsets = array(); //Группы полей (fieldset). Некоторые поля могут не принадлежать никаким группам
|
||
|
||
public $action = "";
|
||
public $method = 'post';
|
||
public $header;
|
||
|
||
protected $replace;
|
||
protected $before;
|
||
|
||
public $_title = array();
|
||
public $alias = array();
|
||
public $constructor = array();
|
||
|
||
/**
|
||
* Строим форму по ее структуре. Каждому типу соответствует определенный класс.
|
||
*/
|
||
public function __construct()
|
||
{
|
||
$this->constructor = array(
|
||
'input' => 'Form_Input',
|
||
'inputreq' => 'Form_Input', // input с проверкой на заполненность
|
||
|
||
'date' => 'Form_Date',
|
||
'datereq' => 'Form_Date',
|
||
'datetime' => 'TDateTime',
|
||
|
||
'color' => 'Form_Color',
|
||
'textarea' => 'Form_TextArea',
|
||
'text' => 'Form_TextArea',
|
||
'multiselect' => 'Form_SelectMany',
|
||
// 'selectmany' => 'TSelectMany',
|
||
'select1' => 'Form_SelectOne',
|
||
'select' => 'Form_SelectOne',
|
||
'questiontype'=> 'TQuestionType',
|
||
'secret' => 'TSecret',
|
||
'upload' => 'TUpload',
|
||
'image' => 'TUpload',
|
||
'checkbox' => 'TCheckbox',
|
||
'checkmany' => 'Form_SelectMany',
|
||
'hidden' => 'THidden',
|
||
'radio' => 'Form_SelectOne',
|
||
'filebrowser' => 'TComponentBrowserInput',
|
||
'documents' => 'TComponentBrowserInput',
|
||
'chooser' => 'Form_Input'
|
||
);
|
||
|
||
}
|
||
|
||
function getId()
|
||
{
|
||
return '_form_edit';
|
||
}
|
||
|
||
public function addFieldClass($name, $class)
|
||
{
|
||
$this->constructor [$name] = $class;
|
||
}
|
||
|
||
/**
|
||
* Добавляет одно поле ввода на форму
|
||
*/
|
||
public function addField(array $init, $factory = null)
|
||
{
|
||
assert(isset($init['type']));
|
||
assert(isset($init['name']));
|
||
|
||
$constructor = $this->constructor[$init['type']];
|
||
$el = new $constructor($init, $factory);
|
||
if (!$el->type) {
|
||
$el->type = $init['type'];
|
||
}
|
||
|
||
if(isset($init['hint'])) {
|
||
$el->hint = $init['hint'];
|
||
}
|
||
|
||
$this->field [$init['name']] = $el;
|
||
return $el;
|
||
}
|
||
|
||
/**
|
||
* Добавление fieldset на форму
|
||
*/
|
||
|
||
public function addFieldSet(array $fieldset)
|
||
{
|
||
$this->fieldsets[$fieldset['name']] = $fieldset;
|
||
}
|
||
|
||
/**
|
||
* Добавление массива fieldset на форму
|
||
*/
|
||
|
||
public function addFieldSetList(array $list)
|
||
{
|
||
foreach ($list as $fieldset) {
|
||
$this->addFieldSet($fieldset);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Добавляет список полей для формы
|
||
* @param array $list
|
||
*/
|
||
public function addFieldList(array $list, $factory = null)
|
||
{
|
||
foreach ($list as $init) {
|
||
$this->addField($init, $factory);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Устанавливает ошибки после проверки
|
||
*/
|
||
function setError(Validator_Validator $validator)
|
||
{
|
||
foreach ($validator->getErrorMsg() as $name => $error)
|
||
{
|
||
$this->field[$name]->error = true;
|
||
$this->field[$name]->error_msg = $error;
|
||
}
|
||
}
|
||
|
||
function setFieldError($name, $message)
|
||
{
|
||
$this->field[$name]->error = true;
|
||
$this->field[$name]->error_msg = $message;
|
||
}
|
||
|
||
/**
|
||
* Устанавливает значения из масива
|
||
*/
|
||
function setValues(HttpRequest $request) {
|
||
foreach ($this->field as $key => $el) {
|
||
$value = $request->getRawData($this->method, $key);
|
||
$this->field[$key]->setValue($value);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Заполняет форму данными из обьекта
|
||
* @param object $data
|
||
* @param array $schema Связь между элементами формы и свойствами обьекта
|
||
*/
|
||
public function fill($data, array $schema)
|
||
{
|
||
foreach ($schema as $key => $conv) {
|
||
list($value, $type) = $conv;
|
||
$this->field [$key]->setValue(call_user_func(array('Primitive', 'from_' . $type), $data->$value));
|
||
}
|
||
}
|
||
|
||
public function set($name, $value)
|
||
{
|
||
$this->field[$name]->setValue($value);
|
||
}
|
||
|
||
function execute()
|
||
{
|
||
return $this;
|
||
}
|
||
}
|