|  |  |  | <?php
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Created by Error202
 | 
					
						
							|  |  |  |  * Date: 04.06.2018
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace core\forms;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use core\components\LanguageDynamicModel;
 | 
					
						
							|  |  |  | use core\entities\Settings;
 | 
					
						
							|  |  |  | use yii\base\DynamicModel;
 | 
					
						
							|  |  |  | use yii\helpers\Json;
 | 
					
						
							|  |  |  | use Yii;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SettingsForm extends LanguageDynamicModel
 | 
					
						
							|  |  |  | {
 | 
					
						
							|  |  |  |     public $type;
 | 
					
						
							|  |  |  |     public $section;
 | 
					
						
							|  |  |  |     public $key;
 | 
					
						
							|  |  |  |     public $value;
 | 
					
						
							|  |  |  |     public $active;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public $_settings;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function __construct(Settings $settings = null, array $attributes = [], $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($settings, $attributes, $config);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function rules()
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         return array_merge(
 | 
					
						
							|  |  |  |             parent::rules(),
 | 
					
						
							|  |  |  |             [
 | 
					
						
							|  |  |  |                 [['value'], 'string'],
 | 
					
						
							|  |  |  |                 [['section', 'key'], 'string', 'max' => 255],
 | 
					
						
							|  |  |  |                 [
 | 
					
						
							|  |  |  |                     ['key'],
 | 
					
						
							|  |  |  |                     'unique',
 | 
					
						
							|  |  |  |                     'targetAttribute' => ['section', 'key'],
 | 
					
						
							|  |  |  |                     'targetClass'     => Settings::class,
 | 
					
						
							|  |  |  |                     //'filter'          => $this->_settings ? ['<>', 'id', $this->_settings->id] : null,
 | 
					
						
							|  |  |  |                     'filter'          => $this->_settings ? ['AND', ['<>', 'section', $this->_settings->section], ['<>', 'key', $this->_settings->key]] : 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 (\InvalidArgumentException $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 array_merge(
 | 
					
						
							|  |  |  |             parent::attributeLabels(),
 | 
					
						
							|  |  |  |             [
 | 
					
						
							|  |  |  |                 '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();
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 |