/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
backend/controllers/ModalController.php
217 строк
6 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace backend\controllers; use common\components\crud\BaseCrud; use common\controllers\base\DataController; use common\forms\base\BaseModel as BaseForm; use common\helpers\ModelHelper; use common\models\base\BaseModel; use common\widgets\BasePanelWidget; use Throwable; use Yii; use yii\base\InvalidConfigException; use yii\bootstrap\Html; use yii\helpers\ArrayHelper; use yii\helpers\VarDumper; use yii\web\NotFoundHttpException; /** * Контроллер для работы с объектами FormModel через модальное окно * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2020 */ class ModalController extends DataController { /** * Получить данные для отображения формы * * @param string $class класс Form-модели * @param null $id - ИД модели * @param null $parent_id ИД родительской модели * @return array * @throws InvalidConfigException * @throws NotFoundHttpException */ public function actionSource($class) { $id = Yii::$app->request->getDefault('id', null); $parent_id = Yii::$app->request->getDefault('parent_id', null); /** @var BaseCrud $crud */ $crud = BaseModel::factory($class); $crud->render = 'ajax'; $tpl = $crud->getTemplate(); $model = $crud->createModel($id, [], BaseForm::SCENARIO_LOAD); $data = $crud->getData(); $widget = $this->renderAjax($tpl, ArrayHelper::merge($crud->getData(), [ 'crud' => $crud, 'model' => $model ])); $is_update = !$model->getIsNewRecord(); Yii::debug(VarDumper::dumpAsString([ 'class' => get_class($crud) ])); return ArrayHelper::merge([ 'html' => $widget, 'title' => $crud->getTitle($is_update), 'icon' => $crud->icon, 'is_update' => $is_update ], $data); } /** * Обновление одного объекта * * @param $class * @param null $id * @param null $parent_id ИД родительской модели * @return array * @throws Throwable * @throws InvalidConfigException */ public function actionUpdate($class) { $id = Yii::$app->request->getDefault('id', null); $parent_id = Yii::$app->request->getDefault('parent_id', null); /** @var BaseCrud $crud */ $crud = BaseModel::factory($class); $crud->render = 'ajax'; $post = Yii::$app->request->post(); $get = Yii::$app->request->get(); Yii::debug(VarDumper::dumpAsString([ 'class' => get_class($crud) ])); $model = $crud->createModel($id, [], BaseForm::SCENARIO_SAVE); if ($model->load($post) && $model->save()) { return ArrayHelper::merge($model->getData(), [ 'error' => false, 'response' => 'Данные обновлены', ]); } else { $tpl = $crud->getTemplate(); $widget = $this->renderAjax($tpl, ArrayHelper::merge($crud->getData(), [ 'crud' => $crud, 'model' => $model ])); return [ 'error' => true, 'errors' => $model->errors, 'html' => $widget, 'title' => Yii::t('app', $crud->title), 'icon' => $crud->icon, ]; } } /** * Удаление данных * * @param $class * @param null $id * @throws InvalidConfigException * @throws NotFoundHttpException */ public function actionRemove($class) { $id = Yii::$app->request->getDefault('id', null); /** @var BaseCrud $crud */ $crud = BaseModel::factory($class); $model = $crud->createModel($id); if ($model) { $response = ''; if (ModelHelper::doDelete($model, $response)) { return [ 'error' => false, 'response' => $response, ]; } else { return [ 'error' => true, 'response' => $response, ]; } } else { return [ 'error' => true, 'response' => Yii::t('app', 'Model not found') ]; } } /** * Вывести информацию в модальном окне * * @param string $class Идентификатор класса * @return array * @throws InvalidConfigException * @throws NotFoundHttpException */ public function actionWidget($class) { /** @var BasePanelWidget $crud */ $widget = BasePanelWidget::factory($class, [Yii::$app->request->get()]); Yii::debug(VarDumper::dumpAsString([ 'class' => get_class($widget) ])); return [ 'html' => $widget->run(), 'title' => Yii::t('app', $widget->title), 'icon' => $widget->icon, ]; } /** * Сохранить данные введёные в модальном окне * * @param string $class Идентификатор класса * @return array * @throws InvalidConfigException * @throws NotFoundHttpException */ public function actionSave($class) { $get = Yii::$app->request->get(); $reload = ArrayHelper::remove($get, 'reload', false); /** @var BasePanelWidget $crud */ $widget = BasePanelWidget::factory($class, [$get]); Yii::debug(VarDumper::dumpAsString([ 'class' => get_class($widget) ])); if ($widget->save()) { return ArrayHelper::merge($widget->getData(), [ 'error' => false, 'reload' => $reload, 'response' => 'Данные сохранены', ]); } else { // суммарная ошибка из Widget-a $summary = Html::errorSummary($widget); return [ 'error' => true, 'summary' => $summary, 'errors' => $widget->errors, 'response' => 'Ошибка сохранения данных', ]; } } }