meraproject/module/ui/form/model.php

170 lines
9.3 KiB
PHP
Raw Normal View History

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