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.
		
		
		
		
		
			
		
			
				
					
					
						
							114 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
	
	
							114 lines
						
					
					
						
							3.2 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * Created by Error202 | 
						|
 * Date: 04.06.2018 | 
						|
 */ | 
						|
 | 
						|
namespace backend\components; | 
						|
 | 
						|
use yii\base\Action; | 
						|
use yii\db\Expression; | 
						|
use yii\base\InvalidConfigException; | 
						|
use yii\web\MethodNotAllowedHttpException; | 
						|
use Yii; | 
						|
 | 
						|
class ToggleAction extends Action | 
						|
{ | 
						|
    /** | 
						|
     * @var string name of the model | 
						|
     */ | 
						|
    public $modelClass; | 
						|
    /** | 
						|
     * @var string model attribute | 
						|
     */ | 
						|
    public $attribute = 'active'; | 
						|
    /** | 
						|
     * @var string scenario model | 
						|
     */ | 
						|
    public $scenario = null; | 
						|
    /** | 
						|
     * @var string|array additional condition for loading the model | 
						|
     */ | 
						|
    public $andWhere; | 
						|
    /** | 
						|
     * @var string|int|boolean|Expression what to set active models to | 
						|
     */ | 
						|
    public $onValue = 1; | 
						|
    /** | 
						|
     * @var string|int|boolean what to set inactive models to | 
						|
     */ | 
						|
    public $offValue = 0; | 
						|
    /** | 
						|
     * @var bool whether to set flash messages or not | 
						|
     */ | 
						|
    public $setFlash = false; | 
						|
    /** | 
						|
     * @var string flash message on success | 
						|
     */ | 
						|
    public $flashSuccess = 'Model saved'; | 
						|
    /** | 
						|
     * @var string flash message on error | 
						|
     */ | 
						|
    public $flashError = 'Error saving Model'; | 
						|
    /** | 
						|
     * @var string|array URL to redirect to | 
						|
     */ | 
						|
    public $redirect; | 
						|
    /** | 
						|
     * @var string pk field name | 
						|
     */ | 
						|
    public $primaryKey = 'id'; | 
						|
 | 
						|
 | 
						|
    public function run($id) | 
						|
    { | 
						|
        if (!Yii::$app->request->getIsPost()) { | 
						|
            throw new MethodNotAllowedHttpException(); | 
						|
        } | 
						|
        $id     = (int)$id; | 
						|
        $result = null; | 
						|
        if (empty($this->modelClass) || !class_exists($this->modelClass)) { | 
						|
            throw new InvalidConfigException("Model class doesn't exist"); | 
						|
        } | 
						|
        /* @var $modelClass \yii\db\ActiveRecord */ | 
						|
        $modelClass = $this->modelClass; | 
						|
        $attribute  = $this->attribute; | 
						|
        $model      = $modelClass::find()->where([$this->primaryKey => $id]); | 
						|
        if (!empty($this->andWhere)) { | 
						|
            $model->andWhere($this->andWhere); | 
						|
        } | 
						|
        $model = $model->one(); | 
						|
        if (!is_null($this->scenario)) { | 
						|
            $model->scenario = $this->scenario; | 
						|
        } | 
						|
        if (!$model->hasAttribute($this->attribute)) { | 
						|
            throw new InvalidConfigException("Attribute doesn't exist"); | 
						|
        } | 
						|
        if ($model->$attribute == $this->onValue) { | 
						|
            $model->$attribute = $this->offValue; | 
						|
        } elseif ($this->onValue instanceof Expression && $model->$attribute != $this->offValue) { | 
						|
            $model->$attribute = $this->offValue; | 
						|
        } else { | 
						|
            $model->$attribute = $this->onValue; | 
						|
        } | 
						|
        if ($model->save()) { | 
						|
            if ($this->setFlash) { | 
						|
                Yii::$app->session->setFlash('success', $this->flashSuccess); | 
						|
            } | 
						|
        } else { | 
						|
            if ($this->setFlash) { | 
						|
                Yii::$app->session->setFlash('error', $this->flashError); | 
						|
            } | 
						|
        } | 
						|
        if (Yii::$app->request->getIsAjax()) { | 
						|
            Yii::$app->end(); | 
						|
        } | 
						|
        /* @var $controller \yii\web\Controller */ | 
						|
        $controller = $this->controller; | 
						|
        if (!empty($this->redirect)) { | 
						|
            return $controller->redirect($this->redirect); | 
						|
        } | 
						|
 | 
						|
        return $controller->redirect(Yii::$app->request->getReferrer()); | 
						|
    } | 
						|
}
 | 
						|
 |