VvebOIDC/system/traits/field-group.php

206 lines
5.9 KiB
PHP

<?php
/**
* Vvveb
*
* Copyright (C) 2022 Ziadin Givan
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Vvveb\System\Traits;
use function Vvveb\__;
trait FieldGroup {
function renderFields2($fields) {
$htmlView = new \Vvveb\System\Core\View();
$htmlView->setTheme();
$htmlView->template('field/field-group/renderfields.html');
$htmlView->fields = $fields;
$html = $htmlView->render(true, false, true);
//return only content inside <body>
$html = preg_replace('@<!DOCTYPE[^>]+>|</?html>|</?body>@', '', $html);
return $html;
}
function field() {
$type = $this->request->post['type'] ?? 'text';
$field_id = $this->request->post['field_id'];
$json = $this->renderField($type, $field_id);
$this->response->setType('json');
return $json;
}
private function renderField($type, $field_id, $input = []) {
$fields = [];
$data = [];
$json = [];
foreach (['settings', 'validation', 'presentation', 'conditionals'] as $section) {
$input[$section] = $input[$section] ?? $this->request->post['field'][$field_id][$section] ?? [];
}
$field = ucfirst($type);
$fieldClass = "Vvveb\System\Fields\\$field";
if (! class_exists($fieldClass)) {
return;
}
$fieldObj = new $fieldClass();
$data['settings'] = $fieldObj->getSettings();
$data['validation'] = $fieldObj->getValidation();
$data['presentation'] = $fieldObj->getPresentation();
foreach ($data as $section => $field) {
foreach ($field as $name => $value) {
if (! $value) {
continue;
}
/*
if (isset($this->request->post['field'][$field_id][$section][$name])) {
$data[$section][$name]['value'] = $this->request->post['field'][$field_id][$section][$name];
}
*/
if (isset($input[$section][$name])) {
$data[$section][$name]['value'] = $input[$section][$name];
}
$data[$section][$name]['id'] = $name;
$data[$section][$name]['name'] = "field[$field_id][$section][$name]";
$data[$section][$name]['class'] = ($value['type'] != 'hidden') ? 'row mb-3' : '';
$data[$section][$name]['label-class'] = 'col-sm-2 col-form-label py-0';
$data[$section][$name]['input-class'] = 'col-sm-10 col-xl-8 col-xxl-6';
if ($value['type'] == 'checkbox' && (isset($this->request->post['field'][$field_id][$section][$name]) || isset($input[$section][$name]))) {
$data[$section][$name]['checked'] = true;
}
}
}
//check if we have a complex value (json array) or a single value
if ($fieldClass::valueType) {
foreach ($fieldClass::valueType as $name) {
$value[$name] = $data['settings'][$name]['value'] ?? '';
}
} else {
$value = $data['settings']['default']['value'] ?? '';
}
$field = [
'label' => $data['settings']['label']['value'] ?? __('Label'),
'instructions' => $data['presentation']['instructions']['value'] ?? __('Instructions'),
'name' => 'label',
//'id' => 'input-' . $field_id,
'type' => $type,
'label-class' => 'form-label',
'placeholder' => $data['settings']['label']['value'] ?? __('Placeholder'),
'readonly' => true,
'value' => $value,
//'required' => $data['validation']['required']['checked'] ?? '',
] + $input['presentation'] + $input['settings'];
foreach ($field as $name => $value) {
/*
if (isset($this->request->post['field'][$field_id]['settings'][$name])) {
$field[$name] = $this->request->post['field'][$field_id]['settings'][$name];
}*/
if (isset($input[$section][$name])) {
$field[$name] = $input[$section][$name];
}
}
$data['field']['input'] = $field;
$json['settings'] = $this->renderFields2($data['settings']);
$json['validation'] = $this->renderFields2($data['validation']);
$json['presentation'] = $this->renderFields2($data['presentation']);
$json['field'] = $this->renderFields2($data['field']);
return $json;
}
function renderFields() {
$type = $this->request->get['type'] ?? '';
$fields = [];
if ($type == 'field') {
$field = $this->request->get['field'] ?? 'text';
$section = $this->request->get['section'] ?? 'settings';
$field = ucfirst($field);
$fieldClass = "Vvveb\System\Fields\\$field";
if (! class_exists($fieldClass)) {
return;
}
$fieldObj = new $fieldClass();
switch ($section) {
case 'settings':
$fields = $fieldObj->getSettings();
break;
case 'validation':
$fields = $fieldObj->getValidation();
case 'presentation':
$fields = $fieldObj->getPresentation();
break;
}
foreach ($fields as $fieldName => $field) {
foreach ($field as $name => $value) {
if (isset($this->request->post[$fieldName][$name])) {
$fields[$fieldName][$name] = $this->request->post[$fieldName][$name];
}
}
}
}
if ($type == 'input') {
$field = [
'label' => __('Label'),
'instructions' => __('Instructions'),
'name' => 'label',
'type' => 'text',
'class' => 'form-label',
'placeholder' => 'placeholder',
//'value' => 'value',
];
foreach ($field as $name => $value) {
if (isset($this->request->post[$name])) {
$field[$name] = $this->request->post[$name];
}
}
$fields['input'] = $field;
}
$this->view->fields = $fields;
}
}