You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
390 lines
10 KiB
390 lines
10 KiB
6 years ago
|
<?php
|
||
|
/**
|
||
|
* Created by Error202
|
||
|
* Date: 31.07.2018
|
||
|
*/
|
||
|
|
||
|
namespace common\modules\forms\widgets;
|
||
|
|
||
|
|
||
|
use yii\web\View;
|
||
|
|
||
|
class FormGenerator
|
||
|
{
|
||
|
public static function generateFormView($id, $json)
|
||
|
{
|
||
|
$viewName = 'DynaView' . $id;
|
||
|
$fields = [];
|
||
|
$fieldRender = new FormViewField();
|
||
|
|
||
|
//print_r($json); die;
|
||
|
|
||
|
foreach ($json as $item) {
|
||
|
if ( isset( $item['name'] ) ) {
|
||
|
$item['name'] = str_replace( '-', '_', $item['name'] );
|
||
|
}
|
||
|
switch ($item['type']) {
|
||
|
case 'text':
|
||
|
$fields[] = $fieldRender->text($item);
|
||
|
break;
|
||
|
case 'header':
|
||
|
$fields[] = $fieldRender->header($item);
|
||
|
break;
|
||
|
case 'paragraph':
|
||
|
$fields[] = $fieldRender->paragraph($item);
|
||
|
break;
|
||
|
case 'hidden':
|
||
|
$fields[] = $fieldRender->hidden($item);
|
||
|
break;
|
||
|
case 'radio-group':
|
||
|
$fields[] = $fieldRender->radioGroup($item);
|
||
|
break;
|
||
|
case 'checkbox-group':
|
||
|
$fields[] = $fieldRender->checkboxGroup($item);
|
||
|
break;
|
||
|
case 'select':
|
||
|
$fields[] = $fieldRender->select($item);
|
||
|
break;
|
||
|
case 'button':
|
||
|
$fields[] = $fieldRender->button($item);
|
||
|
break;
|
||
|
case 'textarea':
|
||
|
$fields[] = $fieldRender->textArea($item);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
$fields = implode("\n", $fields);
|
||
|
$tpl = file_get_contents(\Yii::getAlias('@common/modules/forms/widgets/templates/DynaView.tpl'));
|
||
|
|
||
|
$tpl = preg_replace([
|
||
|
'/\{\$fields\}/'
|
||
|
], [
|
||
|
$fields
|
||
|
], $tpl);
|
||
|
|
||
|
file_put_contents(\Yii::getAlias('@common/modules/forms/runtime/' . $viewName . '.php'), $tpl);
|
||
|
}
|
||
|
|
||
|
|
||
|
public static function generateFormView2($id, $json)
|
||
|
{
|
||
|
$viewName = 'DynaView' . $id;
|
||
|
|
||
|
$fields = [];
|
||
|
|
||
|
foreach ($json as $item) {
|
||
|
if (isset($item['name'])) {
|
||
|
$item['name'] = str_replace( '-', '_', $item['name'] );
|
||
|
}
|
||
|
|
||
|
if ($item['type'] == 'text') {
|
||
|
$options = [];
|
||
|
$options[] = isset($item['placeholder']) ? "'placeholder' => '{$item['placeholder']}'" : "";
|
||
|
$options[] = isset($item['value']) ? "'value' => '{$item['value']}'" : "";
|
||
|
$options[] = isset($item['maxlength']) ? "'maxlength' => true" : "";
|
||
|
$options = implode(',', array_filter($options));
|
||
|
$description = isset($item['description']) ? $item['description'] : '';
|
||
|
$fields[] = "<?= \$form->field(\$model, '{$item['name']}')->textInput([{$options}])->hint('{$description}') ?>";
|
||
|
}
|
||
|
|
||
|
elseif ($item['type'] == 'header' || $item['type'] == 'paragraph') {
|
||
|
$fields[] = "<{$item['subtype']}>{$item['label']}</{$item['subtype']}>";
|
||
|
}
|
||
|
|
||
|
elseif ($item['type'] == 'textarea') {
|
||
|
$options = [];
|
||
|
$options[] = isset($item['rows']) ? "'rows' => {$item['rows']}" : "";
|
||
|
$options[] = isset($item['placeholder']) ? "'placeholder' => '{$item['placeholder']}'" : "";
|
||
|
$options[] = isset($item['value']) ? "'value' => '{$item['value']}'" : "";
|
||
|
$options = implode(',', array_filter($options));
|
||
|
$description = isset($item['description']) ? $item['description'] : '';
|
||
|
$fields[] = "<?= \$form->field(\$model, '{$item['name']}')->textarea([{$options}])->hint('{$description}') ?>";
|
||
|
}
|
||
|
|
||
|
elseif ($item['type'] == 'hidden') {
|
||
|
$options = [];
|
||
|
$options[] = isset($item['value']) ? "'value' => '{$item['value']}'" : "";
|
||
|
$options = implode(',', array_filter($options));
|
||
|
$fields[] = "<?= \$form->field(\$model, '{$item['name']}')->hiddenInput([{$options}])->label(false) ?>";
|
||
|
}
|
||
|
|
||
|
elseif ($item['type'] == 'radio-group') {
|
||
|
$values = [];
|
||
|
$selected = [];
|
||
|
foreach ($item['values'] as $value) {
|
||
|
$values[] = "'{$value['value']}' => '{$value['label']}'";
|
||
|
if (isset($value['selected']) && $value['selected'] == true) {
|
||
|
$selected[] = "'{$value['value']}'";
|
||
|
}
|
||
|
}
|
||
|
$values = implode(',', $values);
|
||
|
$selected = implode(',', $selected);
|
||
|
|
||
|
if ($selected) {
|
||
|
$fields[] = "<?php \$model->{$item['name']} = [{$selected}] ?>";
|
||
|
}
|
||
|
|
||
|
$options = [];
|
||
|
//$options[] = $selected ? "'value' => [{$selected}]" : "";
|
||
|
$options = implode(',', array_filter($options));
|
||
|
$description = isset($item['description']) ? $item['description'] : '';
|
||
|
$fields[] = "<?= \$form->field(\$model, '{$item['name']}')
|
||
|
->radioList([
|
||
|
{$values}
|
||
|
], [{$options}])->hint('{$description}'); ?>";
|
||
|
}
|
||
|
|
||
|
elseif ($item['type'] == 'checkbox-group') {
|
||
|
$values = [];
|
||
|
$selected = [];
|
||
|
foreach ($item['values'] as $value) {
|
||
|
$values[] = "'{$value['value']}' => '{$value['label']}'";
|
||
|
if (isset($value['selected']) && $value['selected'] == true) {
|
||
|
$selected[] = "'{$value['value']}'";
|
||
|
}
|
||
|
}
|
||
|
$values = implode(',', $values);
|
||
|
$selected = implode(',', $selected);
|
||
|
|
||
|
if ($selected) {
|
||
|
$fields[] = "<?php \$model->{$item['name']} = [{$selected}] ?>";
|
||
|
}
|
||
|
|
||
|
$options = [];
|
||
|
//$options[] = $selected ? "'value' => [{$selected}]" : "";
|
||
|
$options = implode(',', array_filter($options));
|
||
|
$description = isset($item['description']) ? $item['description'] : '';
|
||
|
$fields[] = "<?= \$form->field(\$model, '{$item['name']}')
|
||
|
->checkboxList([
|
||
|
{$values}
|
||
|
], [{$options}])->hint('{$description}'); ?>";
|
||
|
}
|
||
|
|
||
|
elseif ($item['type'] == 'select') {
|
||
|
$values = [];
|
||
|
$selected = [];
|
||
|
foreach ($item['values'] as $value) {
|
||
|
$values[] = "'{$value['value']}' => '{$value['label']}'";
|
||
|
if (isset($value['selected']) && $value['selected'] == true) {
|
||
|
$selected[] = "'{$value['value']}'";
|
||
|
}
|
||
|
}
|
||
|
$values = implode(',', $values);
|
||
|
$selected = implode(',', $selected);
|
||
|
|
||
|
$options = [];
|
||
|
$options[] = $selected ? "'value' => [{$selected}]" : "";
|
||
|
$options[] = isset($item['placeholder']) ? "'prompt' => '{$item['placeholder']}'" : "";
|
||
|
$options[] = isset($item['multiple']) && $item['multiple'] == true ? "'multiple' => 'multiple'" : "";
|
||
|
$options = implode(',', array_filter($options));
|
||
|
$description = isset($item['description']) ? $item['description'] : '';
|
||
|
$fields[] = "<?= \$form->field(\$model, '{$item['name']}')->dropDownList([{$values}], [{$options}])->hint('{$description}') ?>";
|
||
|
}
|
||
|
|
||
|
elseif ($item['type'] == 'button' && $item['subtype'] == 'submit') {
|
||
|
$fields[] = <<<BUTTON
|
||
|
<div class="form-group">
|
||
|
<?= Html::submitButton('{$item['label']}', [
|
||
|
'class' => 'btn btn-success',
|
||
|
]) ?>
|
||
|
</div>
|
||
|
BUTTON;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// prepare
|
||
|
$fields = implode("\n", $fields);
|
||
|
|
||
|
$view = <<<VIEW
|
||
|
<?php
|
||
|
|
||
|
use kartik\\form\\ActiveForm;
|
||
|
use yii\\helpers\\Html;
|
||
|
|
||
|
?>
|
||
|
<?php \$form = ActiveForm::begin([
|
||
|
'action' => ['/forms/form/send', 'id' => \$form_entity->id],
|
||
|
]); ?>
|
||
|
|
||
|
{$fields}
|
||
|
|
||
|
<?php ActiveForm::end(); ?>
|
||
|
|
||
|
VIEW;
|
||
|
file_put_contents(\Yii::getAlias('@common/modules/forms/runtime/' . $viewName . '.php'), $view);
|
||
|
}
|
||
|
|
||
|
public static function generateFormClass2($id, $json)
|
||
|
{
|
||
|
$className = 'DynaForm' . $id;
|
||
|
$publicVars = [];
|
||
|
$rule = [];
|
||
|
$labels = [];
|
||
|
|
||
|
$fieldClass = new FormClassField();
|
||
|
|
||
|
foreach ($json as $item) {
|
||
|
if (isset($item['name'])) {
|
||
|
$item['name'] = str_replace( '-', '_', $item['name'] );
|
||
|
}
|
||
|
|
||
|
if ($item['type'] == 'button') {continue;}
|
||
|
if ($item['type'] == 'paragraph') {continue;}
|
||
|
if ($item['type'] == 'header') {continue;}
|
||
|
// public
|
||
|
$publicVars[] = 'public $' . $item['name'] . ';';
|
||
|
|
||
|
// required
|
||
|
if (isset($item['required']) && $item['required'] == 1) {
|
||
|
$rule[] = "['{$item['name']}', 'required'],";
|
||
|
}
|
||
|
|
||
|
// rules
|
||
|
switch ($item['type']) {
|
||
|
case 'text':
|
||
|
$rule[] = $fieldClass->text($item);
|
||
|
break;
|
||
|
case 'textarea':
|
||
|
$rule[] = $fieldClass->textarea($item);
|
||
|
break;
|
||
|
case 'hidden':
|
||
|
$rule[] = $fieldClass->hidden($item);
|
||
|
break;
|
||
|
case 'select':
|
||
|
$rule[] = $fieldClass->select($item);
|
||
|
break;
|
||
|
case 'checkbox-group':
|
||
|
$rule[] = $fieldClass->checkboxGroup($item);
|
||
|
break;
|
||
|
case 'radio-group':
|
||
|
$rule[] = $fieldClass->radioGroup($item);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
if (isset($item['label'])) {
|
||
|
$labels[] = "'{$item['name']}' => '{$item['label']}',";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// prepare data
|
||
|
$publicVars = implode("\n", $publicVars);
|
||
|
$rule = implode("\n", $rule);
|
||
|
$labels = implode("\n", $labels);
|
||
|
|
||
|
$classData = <<<CLASS
|
||
|
<?php
|
||
|
namespace common\\modules\\forms\\runtime;
|
||
|
|
||
|
use yii\\base\\Model;
|
||
|
|
||
|
class {$className} extends Model
|
||
|
{
|
||
|
{$publicVars}
|
||
|
|
||
|
public function rules(): array
|
||
|
{
|
||
|
return [
|
||
|
{$rule}
|
||
|
];
|
||
|
}
|
||
|
|
||
|
public function attributeLabels() {
|
||
|
return [
|
||
|
{$labels}
|
||
|
];
|
||
|
}
|
||
|
}
|
||
|
CLASS;
|
||
|
|
||
|
file_put_contents(\Yii::getAlias('@common/modules/forms/runtime/' . $className . '.php'), $classData);
|
||
|
}
|
||
|
|
||
|
public static function generateFormClass($id, $json)
|
||
|
{
|
||
|
$className = 'DynaForm' . $id;
|
||
|
|
||
|
$publicVars = [];
|
||
|
$rule = [];
|
||
|
$labels = [];
|
||
|
|
||
|
foreach ($json as $item) {
|
||
|
if (isset($item['name'])) {
|
||
|
$item['name'] = str_replace( '-', '_', $item['name'] );
|
||
|
}
|
||
|
|
||
|
if ($item['type'] == 'button') {continue;}
|
||
|
if ($item['type'] == 'paragraph') {continue;}
|
||
|
if ($item['type'] == 'header') {continue;}
|
||
|
// public
|
||
|
$publicVars[] = 'public $' . $item['name'] . ';';
|
||
|
// rule
|
||
|
if (isset($item['required']) && $item['required'] == 1)
|
||
|
{
|
||
|
$rule[] = "['{$item['name']}', 'required'],";
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
($item['type'] == 'text' && $item['subtype'] == 'text') ||
|
||
|
($item['type'] == 'textarea' && $item['subtype'] == 'textarea') ||
|
||
|
($item['type'] == 'hidden')
|
||
|
)
|
||
|
{
|
||
|
$rule[] = "['{$item['name']}', 'string'],";
|
||
|
}
|
||
|
if ($item['type'] == 'text' && $item['subtype'] == 'email') {
|
||
|
$rule[] = "['{$item['name']}', 'email'],";
|
||
|
}
|
||
|
if ($item['type'] == 'checkbox-group') {
|
||
|
$rule[] = "['{$item['name']}', 'each', 'rule' => ['string']],";
|
||
|
}
|
||
|
if ($item['type'] == 'radio-group') {
|
||
|
$rule[] = "['{$item['name']}', 'string'],";
|
||
|
}
|
||
|
if ($item['type'] == 'select' && isset($item['multiple']) && $item['multiple'] == true) {
|
||
|
$rule[] = "['{$item['name']}', 'each', 'rule' => ['string']],";
|
||
|
}
|
||
|
if ($item['type'] == 'select' && !isset($item['multiple'])) {
|
||
|
$rule[] = "['{$item['name']}', 'string'],";
|
||
|
}
|
||
|
|
||
|
if (isset($item['label'])) {
|
||
|
$labels[] = "'{$item['name']}' => '{$item['label']}',";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// prepare data
|
||
|
$publicVars = implode("\n", $publicVars);
|
||
|
$rule = implode("\n", $rule);
|
||
|
$labels = implode("\n", $labels);
|
||
|
|
||
|
$classData = <<<CLASS
|
||
|
<?php
|
||
|
namespace common\\modules\\forms\\runtime;
|
||
|
|
||
|
use yii\\base\\Model;
|
||
|
|
||
|
class {$className} extends Model
|
||
|
{
|
||
|
{$publicVars}
|
||
|
|
||
|
public function rules(): array
|
||
|
{
|
||
|
return [
|
||
|
{$rule}
|
||
|
];
|
||
|
}
|
||
|
|
||
|
public function attributeLabels() {
|
||
|
return [
|
||
|
{$labels}
|
||
|
];
|
||
|
}
|
||
|
}
|
||
|
CLASS;
|
||
|
|
||
|
file_put_contents(\Yii::getAlias('@common/modules/forms/runtime/' . $className . '.php'), $classData);
|
||
|
}
|
||
|
}
|