Прежде чем разрабатывать какой-то более-менее большой продукт на фреймворке. Я бы посоветовал, углубленно изучить его возможности.
Сегодня, речь пойдет об экшинах. Но не о тех что "жестко" прописываются в наших контроллерах. А тех, которые можно использовать в разных контроллерах, подключая через метод контроллера "actions()":
public function actions() { $actions = parent::actions(); $actions['aj-avatar-upload'] = [ 'class' => 'commonactionuserAjaxAvatarUploadAction', ]; $actions['aj-avatar-delete'] = [ 'class' => 'commonactionuserAjaxAvatarDeleteAction', ]; return $actions; }
С подобным "действием" мы сталкиваемся еще в самом начале своего пути, открывая файл конфига, где прописывается action ошибки:
'errorHandler' => [ 'errorAction' => 'site/error', ],
А теперь, подробнее о применении. Велосипед я не создал, и к сожалению раньше его не встречал. Но подобные экшины очень удобно использовать формируя такие себе заготовки для стандартных действий (речь идет об админке):
- список записей
- создание
- редактирование
- удаление (включая файл или файлы)
- сортировка
Ниже, я лишь приведу пример двух экшинов - создания и удаления.
Action создания записи:
use Yii; use yiibaseAction; class AddAction extends Action { public $Model; public $model_config = []; public $view = '@backend/actions/object/view/add'; public $view_model = 'ModelForm'; public $flash; public $text = []; public function init() { parent::init(); if($this -> flash === NULL) { $this -> flash = Yii::t('app','Object created'); } if(isset($this -> text['title']) == false) { $this -> text['title'] = Yii::t('app', 'Creating Object'); } } /** * Add * @return mixed */ public function run() { $LocalModel = $this -> Model; $ModelForm = new $LocalModel($this -> model_config); if($ModelForm -> load(Yii::$app -> request -> post()) && $ModelForm -> save()) { return $this -> controller -> setFlash(['edit', 'id' => $ModelForm -> id], $this -> flash); } //View $this -> controller -> setBreadcrumbs($this -> text['title']); $this -> controller -> setTitle($this -> text['title']); return $this -> controller -> render($this -> view, [ $this-> view_model => $ModelForm, ]); } }
Конфигурирование экшина выполняется в методе "actions()" текущего контроллера. Если вид используется не стандартный, то через свойство "view", мы можем указать путь к своему виду. Под стандартным видом я предполагаю вид, который может использоваться в большинстве случаев (без удаления или добавления полей формы). К примеру - форма имеющая лишь одно поле "Title", для создания списков записей. Таких как - категории, регионы, пр.
Второе. Экшин удаления записи из БД:
use Yii; use yiibaseAction; use yiiwebNotFoundHttpException; class DeleteAction extends Action { public $Model; public $field_delete = NULL; public $flash = NULL; public function init() { parent::init(); if($this -> flash === NULL) { $this -> flash = Yii::t('app','Object deleted'); } } /** * Delete row in DB * @param int $id * @return mixed * @throws NotFoundHttpException */ public function run($id) { $LocalModel = $this -> Model; $Model = $LocalModel::findOne([ 'id' => (int) $id ]); if($Model === NULL) { throw new NotFoundHttpException(); } if(method_exists($Model, 'deleteFile')) { $field_delete_ar = (array) $this -> field_delete; foreach ($field_delete_ar as $field_delete) { $Model -> deleteFile($Model -> {$field_delete}); } } $Model -> delete(); return $this -> controller -> setFlash(['index'], $this -> flash); } }
Если в модели определен метод "deleteFile". То при вызове действия, будет попытка удаления файлов по определенным полям.
"Экшин" ужасно режет ухо. А есть статьи "куда сохранять" и "как теперь использовать"? А то я по этой статье писать научился и только писать. Спасибо.
На данный момент подходящей статьи для вас нет.