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.
		
		
		
		
		
			
		
			
				
					
					
						
							113 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
	
	
							113 lines
						
					
					
						
							2.7 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()); | 
						|
	} | 
						|
} |