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.
		
		
		
		
			
				
					127 lines
				
				3.0 KiB
			
		
		
			
		
	
	
					127 lines
				
				3.0 KiB
			| 
								 
											7 years ago
										 
									 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Created by Error202
							 | 
						||
| 
								 | 
							
								 * Date: 04.06.2018
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace core\forms;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use core\entities\Settings;
							 | 
						||
| 
								 | 
							
								use yii\base\DynamicModel;
							 | 
						||
| 
								 | 
							
								use yii\base\Model;
							 | 
						||
| 
								 | 
							
								use yii\helpers\Json;
							 | 
						||
| 
								 | 
							
								use yii\base\InvalidParamException;
							 | 
						||
| 
								 | 
							
								use Yii;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SettingsForm extends Model
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									public $type;
							 | 
						||
| 
								 | 
							
									public $section;
							 | 
						||
| 
								 | 
							
									public $key;
							 | 
						||
| 
								 | 
							
									public $value;
							 | 
						||
| 
								 | 
							
									public $active;
							 | 
						||
| 
								 | 
							
									private $_settings;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function __construct(Settings $settings = null, $config = [])
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if ($settings) {
							 | 
						||
| 
								 | 
							
											$this->type = $settings->type;
							 | 
						||
| 
								 | 
							
											$this->section = $settings->section;
							 | 
						||
| 
								 | 
							
											$this->key = $settings->key;
							 | 
						||
| 
								 | 
							
											$this->value = $settings->value;
							 | 
						||
| 
								 | 
							
											$this->active = $settings->active;
							 | 
						||
| 
								 | 
							
											$this->_settings = $settings;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										parent::__construct($config);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function rules()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										return [
							 | 
						||
| 
								 | 
							
											[['value'], 'string'],
							 | 
						||
| 
								 | 
							
											[['section', 'key'], 'string', 'max' => 255],
							 | 
						||
| 
								 | 
							
											[
							 | 
						||
| 
								 | 
							
												['key'],
							 | 
						||
| 
								 | 
							
												'unique',
							 | 
						||
| 
								 | 
							
												'targetAttribute' => ['section', 'key'],
							 | 
						||
| 
								 | 
							
												'targetClass' => Settings::class,
							 | 
						||
| 
								 | 
							
												'filter' => $this->_settings ? ['<>', 'id', $this->_settings->id] : null,
							 | 
						||
| 
								 | 
							
												'message' =>
							 | 
						||
| 
								 | 
							
													Yii::t('main', '{attribute} "{value}" already exists for this section.')
							 | 
						||
| 
								 | 
							
											],
							 | 
						||
| 
								 | 
							
											['type', 'in', 'range' => array_keys($this->getTypes(false))],
							 | 
						||
| 
								 | 
							
											[['type'], 'safe'],
							 | 
						||
| 
								 | 
							
											[['active'], 'integer'],
							 | 
						||
| 
								 | 
							
										];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function getTypes($forDropDown = true)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$values = [
							 | 
						||
| 
								 | 
							
											'string' => ['value', 'string'],
							 | 
						||
| 
								 | 
							
											'integer' => ['value', 'integer'],
							 | 
						||
| 
								 | 
							
											'boolean' => ['value', 'boolean', 'trueValue' => "1", 'falseValue' => "0", 'strict' => true],
							 | 
						||
| 
								 | 
							
											'float' => ['value', 'number'],
							 | 
						||
| 
								 | 
							
											'email' => ['value', 'email'],
							 | 
						||
| 
								 | 
							
											'ip' => ['value', 'ip'],
							 | 
						||
| 
								 | 
							
											'url' => ['value', 'url'],
							 | 
						||
| 
								 | 
							
											'object' => [
							 | 
						||
| 
								 | 
							
												'value',
							 | 
						||
| 
								 | 
							
												function ($attribute) {
							 | 
						||
| 
								 | 
							
													$object = null;
							 | 
						||
| 
								 | 
							
													try {
							 | 
						||
| 
								 | 
							
														Json::decode($this->$attribute);
							 | 
						||
| 
								 | 
							
													} catch (InvalidParamException $e) {
							 | 
						||
| 
								 | 
							
														$this->addError($attribute, Yii::t('main', '"{attribute}" must be a valid JSON object', [
							 | 
						||
| 
								 | 
							
															'attribute' => $attribute,
							 | 
						||
| 
								 | 
							
														]));
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											],
							 | 
						||
| 
								 | 
							
										];
							 | 
						||
| 
								 | 
							
										if (!$forDropDown) {
							 | 
						||
| 
								 | 
							
											return $values;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										$return = [];
							 | 
						||
| 
								 | 
							
										foreach ($values as $key => $value) {
							 | 
						||
| 
								 | 
							
											$return[$key] = Yii::t('main', $key);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return $return;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function attributeLabels()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										return [
							 | 
						||
| 
								 | 
							
											'id' => Yii::t('main', 'ID'),
							 | 
						||
| 
								 | 
							
											'type' => Yii::t('main', 'Type'),
							 | 
						||
| 
								 | 
							
											'section' => Yii::t('main', 'Section'),
							 | 
						||
| 
								 | 
							
											'key' => Yii::t('main', 'Key'),
							 | 
						||
| 
								 | 
							
											'value' => Yii::t('main', 'Value'),
							 | 
						||
| 
								 | 
							
											'active' => Yii::t('main', 'Active'),
							 | 
						||
| 
								 | 
							
											'crated_at' => Yii::t('main', 'Created At'),
							 | 
						||
| 
								 | 
							
											'updated_at' => Yii::t('main', 'Updated At'),
							 | 
						||
| 
								 | 
							
										];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function beforeValidate() {
							 | 
						||
| 
								 | 
							
										$validators = $this->getTypes(false);
							 | 
						||
| 
								 | 
							
										if (!array_key_exists($this->type, $validators)) {
							 | 
						||
| 
								 | 
							
											$this->addError('type', Yii::t('main', 'Please select correct type'));
							 | 
						||
| 
								 | 
							
											return false;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										$model = DynamicModel::validateData([
							 | 
						||
| 
								 | 
							
											'value' => $this->value
							 | 
						||
| 
								 | 
							
										], [
							 | 
						||
| 
								 | 
							
											$validators[$this->type],
							 | 
						||
| 
								 | 
							
										]);
							 | 
						||
| 
								 | 
							
										if ($model->hasErrors()) {
							 | 
						||
| 
								 | 
							
											$this->addError('value', $model->getFirstError('value'));
							 | 
						||
| 
								 | 
							
											return false;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										if ($this->hasErrors()) {
							 | 
						||
| 
								 | 
							
											return false;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return parent::beforeValidate();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |