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.
		
		
		
		
		
			
		
			
				
					
					
						
							389 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
	
	
							389 lines
						
					
					
						
							10 KiB
						
					
					
				<?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); | 
						|
	} | 
						|
}
 | 
						|
 |