]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Добавлено мягкое удаление feature_fomichev_erp-281_create_stores_type_list origin/feature_fomichev_erp-281_create_stores_type_list
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 16 Jan 2025 09:02:34 +0000 (12:02 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 16 Jan 2025 09:02:34 +0000 (12:02 +0300)
erp24/controllers/StoresTypeListController.php
erp24/migrations/m250115_114940_create_stores_type_list_table.php
erp24/records/StoresTypeList.php
erp24/traits/SoftDeleteTrait.php
erp24/web/js/crud/stores-type-list/index.js

index 474cfec6088926e4ad765d90b0ef7b609c2f14a1..8d3aaee8a118604f3eb7f21bf9f25b99399271e4 100644 (file)
@@ -42,6 +42,11 @@ class StoresTypeListController extends Controller
         $model = new StoresTypeList();
         $editId = $this->request->post('editId');
 
+        $dataProvider = new ActiveDataProvider([
+            'query' => StoresTypeList::find(),
+        ]);
+
+
         if ($model->load($this->request->post())) {
             if (!empty($editId)) {
                 // Редактирование
@@ -54,23 +59,40 @@ class StoresTypeListController extends Controller
                         return $this->redirect(['index']);
                     } else {
                         Yii::$app->session->setFlash('error', 'Ошибка сохранения.');
+                        return $this->renderAjax('index', [
+                            'model' => $model,
+                            'dataProvider' => $dataProvider,
+                        ]);
                     }
                 }
             } else {
                 $model->type_alias = strtolower(preg_replace('/[\s-]+/', '_', $model->type_name));
+                $existingDeleted = StoresTypeList::find()->where(['type_name' => $model->type_name, 'active' => 0])->one();
+                if ($existingDeleted) {
+                    Yii::$app->session->setFlash('error', 'Запись с таким именем была удалена. Вы можете восстановить её.');
+                    if (Yii::$app->request->isPjax) {
+                        return $this->renderAjax('index', [
+                            'model' => $model,
+                            'dataProvider' => $dataProvider,
+                        ]);
+                    }
+                    return;
+                }
                 if ($model->save()) {
                     Yii::$app->session->setFlash('success', 'Новая запись успешно создана.');
                     return $this->redirect(['index']);
                 } else {
                     Yii::$app->session->setFlash('error', 'Ошибка сохранения.');
+                    if (Yii::$app->request->isPjax) {
+                        return $this->renderAjax('index', [
+                            'model' => $model,
+                            'dataProvider' => $dataProvider,
+                        ]);
+                    }
                 }
             }
         }
 
-        $dataProvider = new ActiveDataProvider([
-            'query' => StoresTypeList::find(),
-        ]);
-
         return $this->render('index', [
             'dataProvider' => $dataProvider,
             'model' => $model,
@@ -150,7 +172,7 @@ class StoresTypeListController extends Controller
      */
     public function actionDelete($id)
     {
-        $this->findModel($id)->delete();
+        $this->findModel($id)->softDelete();
 
         if (Yii::$app->request->isAjax) {
             return $this->asJson(['success' => true, 'message' => 'Запись успешно удалена.']);
index 4ad1b4185066e60110d256d552883fb12c7c6513..443de77e2184a5985236f4e216200451f67b1b11 100644 (file)
@@ -21,6 +21,10 @@ class m250115_114940_create_stores_type_list_table extends Migration
                 'type_name' => $this->string()->notNull()->comment('Наименование типа магазина'),
                 'type_alias' => $this->string()->notNull()->comment('Алиас типа магазина'),
                 'type_description' => $this->string()->null()->comment('Описание типа магазина'),
+                'active' => $this->tinyInteger()->notNull()->defaultValue(1)->comment('Активность'),
+                'deleted_by' => $this->integer()->null()->comment('Пользователь, удаливший запись'),
+                'deleted_at' => $this->timestamp()
+                    ->null()->defaultValue(null)->comment('Дата мягкого удаления'),
                 'created_at' => $this->dateTime()
                     ->notNull()
                     ->defaultExpression('CURRENT_TIMESTAMP')
index 1955e758bd64a92e245961e48148b073edca4597..1168e8b4038f9b5cfcdacedba6593c214698e7cd 100644 (file)
@@ -3,6 +3,7 @@
 namespace yii_app\records;
 
 use Yii;
+use yii_app\traits\SoftDeleteTrait;
 
 /**
  * This is the model class for table "stores_type_list".
@@ -11,10 +12,15 @@ use Yii;
  * @property string $type_name Наименование типа магазина
  * @property string $type_alias Алиас типа магазина
  * @property string|null $type_description Описание типа магазина
+ * @property Admin $deleted_by удаливший пользователь
+ * @property int $active активность
+ * @property string $deleted_at время удаления
  * @property string $created_at Дата создания записи
  */
 class StoresTypeList extends \yii\db\ActiveRecord
 {
+    use SoftDeleteTrait;
+
     /**
      * {@inheritdoc}
      */
@@ -30,8 +36,8 @@ class StoresTypeList extends \yii\db\ActiveRecord
     {
         return [
             [['type_name'], 'required'],
-            [['created_at'], 'safe'],
-            [['type_name'], 'unique', 'message' => 'Название "{value}" уже существует.'],
+            [['created_at', 'active'], 'safe'],
+            [['type_name'], 'unique', 'targetAttribute' => 'type_name', 'filter' => ['active' => 1], 'message' => 'Название "{value}" уже существует.'],
             [['type_name', 'type_alias', 'type_description'], 'string', 'max' => 255],
         ];
     }
@@ -49,4 +55,18 @@ class StoresTypeList extends \yii\db\ActiveRecord
             'created_at' => 'Дата создания записи',
         ];
     }
+
+    public static function hasSoftDelete(): bool
+    {
+        return true;
+    }
+
+    public static function find()
+    {
+        $query = parent::find();
+        if (static::hasSoftDelete()) {
+            $query->andWhere(['active' => 1]);
+        }
+        return $query;
+    }
 }
index 6fd45fedc507331e11f5dda984b93634129fe95d..4b3f48ffcc5f93dff961e76ae44b669bcf6e7382 100644 (file)
@@ -2,7 +2,6 @@
 namespace yii_app\traits;
 
 use Yii;
-use yii\db\ActiveQuery;
 
 trait SoftDeleteTrait
 {
index 7e2b297293b45aff32494e31fdc1f8e2b4e664cb..e7d0675e85d932769deea37ddbfe10ae3adf3649 100644 (file)
@@ -1,4 +1,14 @@
 document.addEventListener('DOMContentLoaded', function () {
+   init();
+    $(document).on('pjax:end', function () {
+        console.log('Pjax обновил содержимое.');
+        init();
+    });
+});
+
+
+
+function init () {
     const list = document.getElementById('record-list');
     const typeNameField = document.getElementById('type-name-field');
     const editIdInput = document.getElementById('edit-id');
@@ -16,7 +26,7 @@ document.addEventListener('DOMContentLoaded', function () {
             const id = target.dataset.id;
 
             fetch('/stores-type-list/get-record?id=' + id)
-        .then(response => response.json())
+                .then(response => response.json())
                 .then(data => {
                     if (data.error) {
                         alert(data.error);
@@ -93,4 +103,4 @@ document.addEventListener('DOMContentLoaded', function () {
             item.classList.remove('active');
         });
     });
-});
\ No newline at end of file
+}
\ No newline at end of file