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