From: fomichev Date: Thu, 5 Jun 2025 07:50:06 +0000 (+0300) Subject: Добавление в представления X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=1d87dea9854ff3876261cdfe37b7a1dfa00464a1;p=erp24_rep%2Fyii-erp24%2F.git Добавление в представления --- diff --git a/erp24/controllers/crud/MarketplaceOrder1cStatusesController.php b/erp24/controllers/crud/MarketplaceOrder1cStatusesController.php index a39ca83a..8696b4b0 100644 --- a/erp24/controllers/crud/MarketplaceOrder1cStatusesController.php +++ b/erp24/controllers/crud/MarketplaceOrder1cStatusesController.php @@ -3,12 +3,14 @@ namespace yii_app\controllers\crud; use Yii; +use yii\db\Transaction; use yii\helpers\ArrayHelper; use yii_app\records\MarketplaceOrder1cStatuses; use yii\data\ActiveDataProvider; use yii\web\Controller; use yii\web\NotFoundHttpException; use yii\filters\VerbFilter; +use yii_app\records\MarketplaceOrder1cStatusesRelations; use yii_app\services\LessonService; /** @@ -57,18 +59,12 @@ class MarketplaceOrder1cStatusesController extends Controller } } + + $dataProvider = new ActiveDataProvider([ - 'query' => MarketplaceOrder1cStatuses::find()->orderBy(["posit" => SORT_ASC]), - /* - 'pagination' => [ - 'pageSize' => 50 - ], - 'sort' => [ - 'defaultOrder' => [ - 'id' => SORT_DESC, - ] - ], - */ + 'query' => MarketplaceOrder1cStatuses::find() + ->with(['relationsFrom', 'nextStatuses']) + ->orderBy(['posit' => SORT_ASC]), ]); return $this->render('index', [ @@ -98,16 +94,54 @@ class MarketplaceOrder1cStatusesController extends Controller { $model = new MarketplaceOrder1cStatuses(); - if ($this->request->isPost) { - if ($model->load($this->request->post()) && $model->save()) { - return $this->redirect(['view', 'id' => $model->id]); + $relationModels = [new MarketplaceOrder1cStatusesRelations()]; + + $statusOptions = MarketplaceOrder1cStatuses::find() + ->select(['status']) + ->indexBy('id') + ->column(); + + if (Yii::$app->request->isPost) { + if ($model->load(Yii::$app->request->post())) { + $transaction = Yii::$app->db->beginTransaction(Transaction::SERIALIZABLE); + try { + if (!$model->save()) { + throw new \Exception('Не удалось сохранить MarketplaceOrder1cStatuses'); + } + + $postRelations = Yii::$app->request->post('Relations', []); + + foreach ($postRelations as $i => $relData) { + if (empty($relData['status_id_to'])) { + continue; + } + + $rel = new MarketplaceOrder1cStatusesRelations(); + $rel->status_id_from = $model->id; + $rel->status_id_to = $relData['status_id_to']; + $rel->description = $relData['description']; + $rel->button_text = $relData['button_text']; + + if (!$rel->save()) { + throw new \Exception('Не удалось сохранить Relation #' . $i); + } + } + + $transaction->commit(); + return $this->redirect(['view', 'id' => $model->id]); + + } catch (\Exception $e) { + $transaction->rollBack(); + Yii::$app->session->setFlash('error', 'Ошибка при сохранении: ' . $e->getMessage()); + } } - } else { - $model->loadDefaultValues(); } + return $this->render('create', [ - 'model' => $model, + 'model' => $model, + 'relationModels' => $relationModels, + 'statusOptions' => $statusOptions, ]); } @@ -122,12 +156,52 @@ class MarketplaceOrder1cStatusesController extends Controller { $model = $this->findModel($id); - if ($this->request->isPost && $model->load($this->request->post()) && $model->save()) { - return $this->redirect(['view', 'id' => $model->id]); + $existingRelations = $model->getRelationsFrom()->all(); + $relationModels = count($existingRelations) ? $existingRelations : [new MarketplaceOrder1cStatusesRelations()]; + + $statusOptions = MarketplaceOrder1cStatuses::find() + ->select(['status']) + ->indexBy('id') + ->column(); + + if (Yii::$app->request->isPost) { + if ($model->load(Yii::$app->request->post())) { + $transaction = Yii::$app->db->beginTransaction(Transaction::SERIALIZABLE); + try { + if (!$model->save()) { + throw new \Exception('Не удалось сохранить основной статус'); + } + + MarketplaceOrder1cStatusesRelations::deleteAll(['status_id_from' => $model->id]); + + $postRelations = Yii::$app->request->post('Relations', []); + foreach ($postRelations as $i => $relData) { + if (empty($relData['status_id_to'])) { + continue; + } + $rel = new MarketplaceOrder1cStatusesRelations(); + $rel->status_id_from = $model->id; + $rel->status_id_to = $relData['status_id_to']; + $rel->description = $relData['description']; + $rel->button_text = $relData['button_text']; + if (!$rel->save()) { + throw new \Exception('Не удалось сохранить Relation #' . $i); + } + } + + $transaction->commit(); + return $this->redirect(['view', 'id' => $model->id]); + } catch (\Exception $e) { + $transaction->rollBack(); + Yii::$app->session->setFlash('error', 'Ошибка при сохранении отношений: ' . $e->getMessage()); + } + } } return $this->render('update', [ - 'model' => $model, + 'model' => $model, + 'relationModels' => $relationModels, + 'statusOptions' => $statusOptions, ]); } @@ -154,10 +228,15 @@ class MarketplaceOrder1cStatusesController extends Controller */ protected function findModel($id) { - if (($model = MarketplaceOrder1cStatuses::findOne(['id' => $id])) !== null) { - return $model; + $model = MarketplaceOrder1cStatuses::find() + ->with(['relationsFrom', 'nextStatuses']) + ->andWhere(['id' => $id]) + ->one(); + + if ($model === null) { + throw new \yii\web\NotFoundHttpException('Запрошенная страница не найдена.'); } - throw new NotFoundHttpException('The requested page does not exist.'); + return $model; } } diff --git a/erp24/records/MarketplaceOrder1cStatuses.php b/erp24/records/MarketplaceOrder1cStatuses.php index 3261641d..4a396ebb 100644 --- a/erp24/records/MarketplaceOrder1cStatuses.php +++ b/erp24/records/MarketplaceOrder1cStatuses.php @@ -3,6 +3,7 @@ namespace yii_app\records; use Yii; +use yii\db\ActiveQuery; /** * This is the model class for table "marketplace_order_1c_statuses". @@ -70,4 +71,37 @@ class MarketplaceOrder1cStatuses extends \yii\db\ActiveRecord 'posit' => 'Порядок статусов', ]; } + + public function getRelationsFrom(): ActiveQuery + { + return $this->hasMany( + MarketplaceOrder1cStatusesRelations::class, + ['status_id_from' => 'id'] + ); + } + + + public function getRelationsTo(): ActiveQuery + { + return $this->hasMany( + MarketplaceOrder1cStatusesRelations::class, + ['status_id_to' => 'id'] + ); + } + + public function getNextStatuses(): ActiveQuery + { + return $this->hasMany( + MarketplaceOrder1cStatuses::class, + ['id' => 'status_id_to'] + )->via('relationsFrom'); + } + + public function getPrevStatuses(): ActiveQuery + { + return $this->hasMany( + MarketplaceOrder1cStatuses::class, + ['id' => 'status_id_from'] + )->via('relationsTo'); + } } diff --git a/erp24/views/crud/marketplace-order-1c-statuses/_form.php b/erp24/views/crud/marketplace-order-1c-statuses/_form.php index cea0b927..ed005517 100644 --- a/erp24/views/crud/marketplace-order-1c-statuses/_form.php +++ b/erp24/views/crud/marketplace-order-1c-statuses/_form.php @@ -1,22 +1,86 @@ registerJs($js); + ?>
- field($model, 'marketplace_id')->dropDownList([1 => 'ФлауВау', 2 => 'ЯндексМаркет']) ?> + + field($model, 'marketplace_id') + ->dropDownList([1 => 'ФлауВау', 2 => 'ЯндексМаркет'], ['prompt' => 'Выберите маркетплейс']) ?> field($model, 'status')->textInput(['maxlength' => true]) ?> - field($model, 'status_instruction')->textarea(['rows' => 6]) ?> + field($model, 'status_instruction')->textarea(['rows' => 4]) ?> + +
+ + +

Связанные статусы (relations)

+
+ $rel): ?> +
+ + 'control-label']) ?> + status_id_to, + $statusOptions, + ['prompt' => '— выберите статус —', 'class' => 'form-control'] + ); ?> + + + 'control-label', 'style' => 'margin-top:8px;']) ?> + description, + ['class' => 'form-control'] + ); ?> + + + 'control-label', 'style' => 'margin-top:8px;']) ?> + button_text, + ['class' => 'form-control'] + ); ?> + + + +
+ +
+ +
'btn btn-success']) ?> @@ -24,4 +88,28 @@ use yii\widgets\ActiveForm; -
+ + + +
\ No newline at end of file diff --git a/erp24/views/crud/marketplace-order-1c-statuses/create.php b/erp24/views/crud/marketplace-order-1c-statuses/create.php index 59eaeedd..e3140d6b 100644 --- a/erp24/views/crud/marketplace-order-1c-statuses/create.php +++ b/erp24/views/crud/marketplace-order-1c-statuses/create.php @@ -14,7 +14,9 @@ $this->params['breadcrumbs'][] = $this->title;

title) ?>

render('_form', [ - 'model' => $model, + 'model' => $model, + 'relationModels' => $relationModels, + 'statusOptions' => $statusOptions, ]) ?> diff --git a/erp24/views/crud/marketplace-order-1c-statuses/index.php b/erp24/views/crud/marketplace-order-1c-statuses/index.php index 153340db..628305f2 100644 --- a/erp24/views/crud/marketplace-order-1c-statuses/index.php +++ b/erp24/views/crud/marketplace-order-1c-statuses/index.php @@ -53,6 +53,22 @@ $this->params['breadcrumbs'][] = $this->title; return Url::toRoute([$action, 'id' => $model->id]); } ], + [ + 'label' => 'Связанные статусы', + 'format' => 'raw', + 'value' => function (MarketplaceOrder1cStatuses $model) { + $links = []; + foreach ($model->nextStatuses as $nextStatus) { + $links[] = Html::a( + Html::encode($nextStatus->status), + ['/crud/marketplace-order-1c-statuses/view', 'id' => $nextStatus->id] + ); + } + return empty($links) + ? '— нет связи —' + : implode('
', $links); + }, + ], ], ]); ?> diff --git a/erp24/views/crud/marketplace-order-1c-statuses/update.php b/erp24/views/crud/marketplace-order-1c-statuses/update.php index 3ed56535..2bdf182b 100644 --- a/erp24/views/crud/marketplace-order-1c-statuses/update.php +++ b/erp24/views/crud/marketplace-order-1c-statuses/update.php @@ -18,7 +18,9 @@ $this->params['breadcrumbs'][] = 'Update'; render('_form', [ - 'model' => $model, + 'model' => $model, + 'relationModels' => $relationModels, + 'statusOptions' => $statusOptions, ]) ?> diff --git a/erp24/views/crud/marketplace-order-1c-statuses/view.php b/erp24/views/crud/marketplace-order-1c-statuses/view.php index 103faefa..18c6ac3f 100644 --- a/erp24/views/crud/marketplace-order-1c-statuses/view.php +++ b/erp24/views/crud/marketplace-order-1c-statuses/view.php @@ -2,6 +2,7 @@ use yii\helpers\Html; use yii\widgets\DetailView; +use yii_app\records\MarketplaceOrder1cStatuses; /** @var yii\web\View $this */ /** @var yii_app\records\MarketplaceOrder1cStatuses $model */ @@ -41,6 +42,22 @@ $this->params['breadcrumbs'][] = $this->title; ], 'status', 'status_instruction:ntext', + [ + 'label' => 'Связанные статусы', + 'format' => 'raw', + 'value' => function (MarketplaceOrder1cStatuses $model) { + $links = []; + foreach ($model->nextStatuses as $nextStatus) { + $links[] = Html::a( + Html::encode($nextStatus->status), + ['marketplace-order1c-statuses/view', 'id' => $nextStatus->id] + ); + } + return empty($links) + ? '— нет связи —' + : implode('
', $links); + }, + ], ], ]) ?>