phplibrary/src/Form/Form.php
2022-01-20 13:22:57 +03:00

214 lines
5.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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