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