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.
		
		
		
		
		
			
		
			
				
					
					
						
							138 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
	
	
							138 lines
						
					
					
						
							4.3 KiB
						
					
					
				<?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(); | 
						|
    } | 
						|
}
 | 
						|
 |