170 lines
9.3 KiB
PHP
170 lines
9.3 KiB
PHP
<?
|
||
|
||
namespace ui;
|
||
|
||
|
||
use ui\form\structure\eInputType;
|
||
use ui\input\Avatar_Picker;
|
||
use ui\input\Cancel;
|
||
use ui\input\Checkbox;
|
||
use ui\input\Color_Picker;
|
||
use ui\input\DATE_RANGE_TIME;
|
||
use ui\input\DATE_Time;
|
||
use ui\input\Hidden;
|
||
use ui\input\Html;
|
||
use ui\input\Image;
|
||
use ui\input\Input;
|
||
use ui\input\Radio;
|
||
use ui\input\Script;
|
||
use ui\input\Select;
|
||
use ui\input\Select_Ajax;
|
||
use ui\input\Select_Multi;
|
||
use ui\input\Select_Search;
|
||
use ui\input\Switch_Ios;
|
||
use ui\input\Text;
|
||
use ui\input\Date;
|
||
use ui\input\Submit;
|
||
use ui\input\Email;
|
||
use ui\input\Textarea;
|
||
use ui\input\Video;
|
||
use ui\input\Yandex_Country_City;
|
||
|
||
class Form {
|
||
const VALUES = 1; // Значения для полей ввода - общая настройка формы
|
||
const INPUTS = 2; // Поля ввода - общая настройка формы
|
||
const INPUT = 3; // Поле ввода, поднастрйока INPUTS
|
||
const KEY_VALUE = 4; // Ключ из массва VALUES для подстановки значения, поднастройка INPUTS
|
||
const TYPE = 5; // Тип конкретного поля ввода, поднастройка INPUTS
|
||
const LABEL = 6; // Label для поля вода, поднастройка INPUTS
|
||
const VIEW = 7; // Тип отображения настройки, поднастрйока INPUTS
|
||
const INPUT_OPT = 8; // Настройки для поля ввода, поднстройка INPUTS
|
||
const ON_SUBMIT = 9; // джействие для формы
|
||
const ROW = 10; // Нужно для отображение полей в вода в виде строки
|
||
const ROW_CLASSES = 11; // Дополнительные классы для строки в форме
|
||
const COL_CLASSES = 12; // Классы столбца в строке
|
||
const COLS = 13; // Массив столбцов для отображения внутри строки
|
||
const CONTROLLER = 14; // Контроллер к которому должна отправлять форма данные
|
||
const ACTION = 15; // Действие, которое должен выполнить контроллер
|
||
const COL_CLASSES_ALL_FORCE = 16; // Жёстко задать класс всем столбцам (это понадобилось для того, чтобы отобразить все поля ввода по одному на строку)
|
||
const TITLE = 17; // Заголовок разделитель
|
||
const TITLE_TEXT = 18; // Текст заголовка
|
||
const BUTTONS = 19; // Тип отображения
|
||
const BUTTON = 20; // Тип отображения
|
||
const INPUT_ALL_THEME_FORCE = 21; // Жёсткое указание темы для всех полей ввода
|
||
const FORM_WRAP = 22; // нужно ли оборачивать форму в тег form
|
||
const RULES = 23; // Правила полей ввода
|
||
|
||
|
||
var $values = [];
|
||
var $inputs = [];
|
||
var $options = [];
|
||
|
||
function __construct(array $options = []){
|
||
$this->values = isset($options[$c = self::VALUES]) ? $options[$c] : [];
|
||
$this->inputs = isset($options[$c = self::INPUTS]) ? $options[$c] : [];
|
||
$this->options = $options;
|
||
return $this;
|
||
}
|
||
function toJSON(){
|
||
return [
|
||
'values' => $this->values,
|
||
'inputs' => $this->inputs,
|
||
//'options' => $this->options,
|
||
];
|
||
}
|
||
|
||
|
||
|
||
protected function toString($a){
|
||
$res = '';
|
||
foreach ($a as $k=>$v){
|
||
switch ($v[Form::VIEW]){
|
||
// Если это строка, то начинаем рекурсивно выводить колонки
|
||
case Form::TITLE:
|
||
$res.='<div class="text-uppercase font-size-lg font-weight-bold pb-3">'.$v[Form::TITLE_TEXT].'</div>';
|
||
break;
|
||
case Form::ROW:
|
||
$res.='<div class="row '.($v[Form::ROW_CLASSES]).'">'.$this->toString($v[Form::COLS]).'</div>';
|
||
break;
|
||
case Form::BUTTONS:
|
||
$res.='<div class="row '.($v[Form::ROW_CLASSES]).'"><div class="col-12">'.$this->toString($v[Form::COLS]).'</div></div>';
|
||
break;
|
||
// Если это поле ввода, то отрисовываем его
|
||
case Form::INPUT:
|
||
case Form::BUTTON:
|
||
$isButton = $v[Form::VIEW]==Form::BUTTON;
|
||
// Определяем что это за тип, и вызываем соответствующий конструктор и отрисовку
|
||
$input = null;
|
||
$key = $v[Form::KEY_VALUE];
|
||
$value = $this->values[ $key ];
|
||
|
||
$o = $v[Form::INPUT_OPT];
|
||
if($key) $o[Input::NAME] = $key;
|
||
if(!isset($o[Input::VALUE])) $o[Input::VALUE] = $value;
|
||
|
||
if($c = $this->options[Form::INPUT_ALL_THEME_FORCE]) {
|
||
$o[Input::THEME] = $c;
|
||
}
|
||
|
||
switch ($v[Form::TYPE]) {
|
||
case eInputType::HIDDEN : $input = new Hidden($o); break;
|
||
case eInputType::TEXT : $input = new Text($o); break;
|
||
case eInputType::SELECT : $input = new Select($o); break;
|
||
case eInputType::DATE : $input = new Date($o); break;
|
||
case eInputType::SELECT_SEARCH : $input = new Select_Search($o); break;
|
||
case eInputType::SUBMIT : $input = new Submit($o); break;
|
||
case eInputType::CANCEL : $input = new Cancel($o); break;
|
||
case eInputType::SELECT_MULTI : $input = new Select_Multi($o); break;
|
||
case eInputType::DATE_RANGE_TIME : $input = new Date_Range_Time($o); break;
|
||
case eInputType::DATE_TIME : $input = new Date_Time($o); break;
|
||
case eInputType::TEXTAREA : $input = new Textarea($o); break;
|
||
case eInputType::CHECKBOX : $input = new Checkbox($o); break;
|
||
case eInputType::YANDEX_COUNTRY_CITY : $input = new Yandex_Country_City($o); break;
|
||
case eInputType::SWITCH_IOS : $input = new Switch_Ios($o); break;
|
||
case eInputType::COLOR_PICKER : $input = new Color_Picker($o); break;
|
||
case eInputType::AVATAR_PICKER : $input = new Avatar_Picker($o); break;
|
||
case eInputType::SELECT_AJAX : $input = new Select_Ajax($o); break;
|
||
case eInputType::EMAIL : $input = new Email($o); break;
|
||
case eInputType::SCRIPT : $input = new Script($o); break;
|
||
case eInputType::HTML : $input = new Html($o); break;
|
||
case eInputType::IMAGE : $input = new Image($o); break;
|
||
case eInputType::RADIO : $input = new Radio($o); break;
|
||
case eInputType::VIDEO : $input = new Video($o); break;
|
||
case eInputType::SUBMIT_AND_CLOSE : $input = new Submit($o); break;
|
||
}
|
||
$col_classes = $v[Form::COL_CLASSES];
|
||
$isCol = isset($v[Form::COL_CLASSES]);
|
||
|
||
if(!$isButton) {
|
||
if (isset($this->options[Form::COL_CLASSES_ALL_FORCE])) {
|
||
$col_classes = $this->options[Form::COL_CLASSES_ALL_FORCE];
|
||
$isCol = boolval($col_classes);
|
||
}
|
||
}
|
||
|
||
if ($input) $res .= ($isCol?'<div class="'.$col_classes.'">':'').$input->render().($isCol?'</div>':'');
|
||
}
|
||
}
|
||
return $res;
|
||
}
|
||
|
||
|
||
|
||
function __toString(){
|
||
|
||
$isFormWrap = isset($this->options[FORM::FORM_WRAP]) ? boolval($this->options[FORM::FORM_WRAP]) : true;
|
||
|
||
return ($isFormWrap?
|
||
'<form class="_form" '
|
||
.(($c = $this->options[FORM::CONTROLLER])?'data-controller="'.$c.'" ':'')
|
||
.(($c = $this->options[FORM::ACTION])?'data-action="'.$c.'" ':'')
|
||
.'onsubmit="'.(($c = $this->options[Form::ON_SUBMIT])?$c:'return false').'">'
|
||
:'<div class="_form">')
|
||
|
||
.$this->toString($this->inputs).'<div class="res"></div>'.
|
||
|
||
($isFormWrap?'</form>':'</div>');
|
||
}
|
||
|
||
}
|