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; } }