meraproject/module/ui/form/model.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

170 lines
9.3 KiB
PHP
Raw Permalink 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.

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