]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Убираем создание новых групп и их уникальность по имени
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 4 Dec 2025 14:00:28 +0000 (17:00 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 4 Dec 2025 14:00:28 +0000 (17:00 +0300)
сортировка списка

erp24/actions/grade/AdminGroupUpdateAction.php
erp24/actions/grade/IndexAction.php
erp24/records/AdminGroup.php
erp24/views/grade/admin-group-update.php
erp24/views/grade/index.php

index 9650427a55bae39555dbffbf38668b0a48c14379..40f14388ee69f65c30b5f6a346682d8612b03c9d 100644 (file)
@@ -9,15 +9,70 @@ use yii_app\records\AdminGroup;
 class AdminGroupUpdateAction extends Action
 {
     public function run($id) {
-
-        $adminGroup = AdminGroup::findOne($id);
+        // Если id равен 0, создаем новую группу с дефолтными значениями
+        if ($id == 0) {
+            $adminGroup = new AdminGroup();
+            $this->setDefaults($adminGroup);
+        } else {
+            $adminGroup = AdminGroup::findOne($id);
+            if (!$adminGroup) {
+                Yii::$app->session->setFlash('error', 'Группа не найдена.');
+                return $this->controller->redirect(['/grade']);
+            }
+        }
 
         if (Yii::$app->request->isPost && $adminGroup->load(Yii::$app->request->post())) {
-//            if ($adminGroup->validate()) {
-                $adminGroup->save(false); // На данный момент 2023-07-26 в таблице полно лишних полей, которые не проходят валидацию
-//            }
+            // Для новой группы заполняем обязательные поля значениями по умолчанию
+            if ($adminGroup->isNewRecord) {
+                $this->setDefaults($adminGroup);
+            }
+            
+            // Проверяем уникальность имени
+            $existingGroup = AdminGroup::find()
+                ->where(['name' => $adminGroup->name])
+                ->andWhere(['!=', 'id', $adminGroup->id ?: 0])
+                ->one();
+            
+            if ($existingGroup) {
+                Yii::$app->session->setFlash('error', 'Группа с таким именем уже существует. Пожалуйста, выберите другое имя.');
+            } else {                
+                if ($adminGroup->save()) {
+                    Yii::$app->session->setFlash('success', 'Группа успешно сохранена.');
+                    return $this->controller->redirect(['/grade']);
+                } else {
+                    Yii::$app->session->setFlash('error', 'Ошибка при сохранении группы.');
+                }
+            }
         }
 
         return $this->controller->render('admin-group-update', compact('adminGroup'));
     }
-}
\ No newline at end of file
+
+    /**
+     * Устанавливает значения по умолчанию для обязательных полей новой группы
+     * 
+     * @param AdminGroup $group Группа для заполнения значениями по умолчанию
+     */
+    private function setDefaults(AdminGroup $group)
+    {
+        $defaults = [
+            'name' => '',
+            'parent_id' => 0,
+            'message' => '',
+            'dostup' => '',
+            'dostup_array' => '',
+            'status_dostup_arr' => '',
+            'status_arr' => '',
+            'istochnik_dostup_arr' => '',
+            'info_block' => '',
+            'posit' => 0,
+            'admin_group_add_arr' => '',
+        ];
+
+        foreach ($defaults as $field => $value) {
+            if (empty($group->$field)) {
+                $group->$field = $value;
+            }
+        }
+    }
+}
index 3870868b596e959d9094e7a6412566bc5e6b9103..5d3ade370dc4c8e47a42a019791ea4d30213e536 100755 (executable)
@@ -21,34 +21,68 @@ class IndexAction extends Action
             return $this->controller->redirect(['/grade/admin-update', 'id' => Admin::createAdminWithDefaultData()->id]);
         }
         if ($action == 'addAdminGroup') {
-            $adminGroup = new AdminGroup;
-            $adminGroup->name = 'Новая группа';
-            $adminGroup->parent_id = 0;
-            $adminGroup->message = '';
-            $adminGroup->dostup = '';
-            $adminGroup->dostup_array = '';
-            $adminGroup->status_dostup_arr = '';
-            $adminGroup->status_arr = '';
-            $adminGroup->istochnik_dostup_arr = '';
-            $adminGroup->info_block = '';
-            $adminGroup->posit = 0;
-            $adminGroup->admin_group_add_arr = '';
-            $adminGroup->save(false);
-            return $this->controller->redirect(['/grade/admin-group-update', 'id' => $adminGroup->id]);
+            // Просто открываем форму создания без создания группы
+            return $this->controller->redirect(['/grade/admin-group-update', 'id' => 0]);
         }
 
         $searchModel = DynamicModel::validateData(['name' => '', 'group_id' => 0, 'store_id' => 0],
             [['name', 'string'], [['group_id', 'store_id'], 'integer']]);
-        if ($searchModel->load(Yii::$app->request->post()) && $searchModel->validate()) {
-            $adminsQuery = Admin::find()
-                ->where(['ilike', 'name', '%' . $searchModel->name . '%', false])
-                ->andWhere(['or', ['=', 0, $searchModel->group_id], ['group_id' => $searchModel->group_id]])
-                ->andWhere(['or', ['=', 0, $searchModel->store_id], ['store_id' => $searchModel->store_id]]);
+        // Загружаем данные из GET или POST
+        $searchModel->load(Yii::$app->request->get());
+        $searchModel->load(Yii::$app->request->post());
+        
+        if ($searchModel->validate()) {
+            $adminsQuery = Admin::find();
+            if (!empty($searchModel->name)) {
+                $adminsQuery->where(['ilike', 'admin.name', '%' . $searchModel->name . '%', false]);
+            }
+            if ($searchModel->group_id > 0) {
+                $adminsQuery->andWhere(['admin.group_id' => $searchModel->group_id]);
+            }
+            if ($searchModel->store_id > 0) {
+                $adminsQuery->andWhere(['admin.store_id' => $searchModel->store_id]);
+            }
         } else {
             $adminsQuery = Admin::find();
         }
 
-        $admins = $adminsQuery->with(['position', 'adminGroup', 'store'])->andWhere(['>=', 'group_id', empty($searchModel->name) ? 0 : -1])->all();
+        // Обработка сортировки (из GET или POST)
+        $sortField = Yii::$app->request->get('sort') ?: Yii::$app->request->post('sort');
+        $sortOrder = Yii::$app->request->get('order') ?: Yii::$app->request->post('order') ?: 'asc'; // asc или desc
+        
+        // Применяем сортировку
+        if ($sortField) {
+            switch ($sortField) {
+                case 'name':
+                    // Сортировка по имени сотрудника
+                    $adminsQuery->orderBy(['admin.name' => $sortOrder === 'desc' ? SORT_DESC : SORT_ASC]);
+                    break;
+                case 'lasttime':
+                    // Сортировка по дате последнего визита
+                    $adminsQuery->orderBy(['admin.lasttime' => $sortOrder === 'desc' ? SORT_DESC : SORT_ASC]);
+                    break;
+                case 'position':
+                    // Сортировка по позиции через join
+                    $adminsQuery->leftJoin('employee_position', 'admin.employee_position_id = employee_position.id')
+                        ->orderBy(['employee_position.name' => $sortOrder === 'desc' ? SORT_DESC : SORT_ASC]);
+                    break;
+                case 'group':
+                    // Сортировка по группе через join
+                    $adminsQuery->leftJoin('admin_group', 'admin.group_id = admin_group.id')
+                        ->orderBy(['admin_group.name' => $sortOrder === 'desc' ? SORT_DESC : SORT_ASC]);
+                    break;
+                case 'store':
+                    // Сортировка по магазину через join
+                    $adminsQuery->leftJoin('city_store', 'admin.store_id = city_store.id')
+                        ->orderBy(['city_store.name' => $sortOrder === 'desc' ? SORT_DESC : SORT_ASC]);
+                    break;
+            }
+        } else {
+            // Сортировка по умолчанию
+            $adminsQuery->orderBy(['admin.name' => SORT_ASC]);
+        }
+
+        $admins = $adminsQuery->with(['position', 'adminGroup', 'store'])->andWhere(['>=', 'admin.group_id', empty($searchModel->name) ? 0 : -1])->all();
 
         $adminGroups = [0 => 'Не выбрано'] + ArrayHelper::map(\yii_app\records\AdminGroup::find()->all(), 'id', 'name');
 
@@ -59,7 +93,11 @@ class IndexAction extends Action
         // Определяем специальные группы для подсветки строк
         $specialGroups = AdminGroup::getWorkersGroups();
 
+        // Передаем параметры сортировки в представление
+        $currentSort = $sortField ?? null;
+        $currentOrder = $sortOrder ?? 'asc';
+
         return $this->controller->render('/grade/index',
-            compact('searchModel', 'admins', 'adminGroups', 'stores', 'adminChats', 'specialGroups'));
+            compact('searchModel', 'admins', 'adminGroups', 'stores', 'adminChats', 'specialGroups', 'currentSort', 'currentOrder'));
     }
 }
\ No newline at end of file
index f713c5adf584a65d9b33381a0ea5f6390895683b..74e779b8a2d82adf41f2a23879b51674635b42c8 100755 (executable)
@@ -111,6 +111,7 @@ class AdminGroup extends ActiveRecord
             [['message', 'dostup', 'dostup_array', 'status_dostup_arr', 'status_arr', 'istochnik_dostup_arr', 'info_block', 'admin_group_add_arr'], 'string'],
             [['name'], 'string', 'max' => 200],
             [['orders_dostup'], 'string', 'max' => 1],
+            [['name'], 'unique', 'message' => 'Группа с таким именем уже существует. Пожалуйста, выберите другое имя.'],
         ];
     }
 
index ead8ef72d3e46097dcfe76c3f83e43836ea15c61..192fd85e067bade2ef5d2a24f13bb2f1c859e0ef 100644 (file)
@@ -15,10 +15,40 @@ use yii_app\records\AdminGroup;
     <div class="row mt-5">
         <div class="col-12">
             <h3><?= Html::a('Назад', ['/grade'], ['class' => 'btn btn-primary m-2']) ?>
-                <?= Html::encode($adminGroup->name) ?></h3>
+                <?= Html::encode($adminGroup->name ?: 'Новая группа') ?></h3>
         </div>
     </div>
 
+    <?php
+    // Отображение flash-сообщений
+    if (Yii::$app->session->hasFlash('error')): 
+        $errorMessage = Yii::$app->session->getFlash('error');
+    ?>
+        <div class="row mb-3">
+            <div class="col">
+                <div class="alert alert-danger alert-dismissible fade show" role="alert">
+                    <strong>Ошибка:</strong> <?= Html::encode($errorMessage) ?>
+                    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
+                </div>
+            </div>
+        </div>
+        <?php
+        // Показываем JavaScript алерт как просил пользователь
+        $this->registerJs("alert('" . addslashes($errorMessage) . "');");
+    endif;
+    
+    if (Yii::$app->session->hasFlash('success')): 
+    ?>
+        <div class="row mb-3">
+            <div class="col">
+                <div class="alert alert-success alert-dismissible fade show" role="alert">
+                    <strong>Успешно:</strong> <?= Html::encode(Yii::$app->session->getFlash('success')) ?>
+                    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
+                </div>
+            </div>
+        </div>
+    <?php endif; ?>
+
     <?php $form = ActiveForm::begin(['id' => 'admin-group-update-form']); ?>
 
     <?php PrintBlockHelper::printBlock('Название', $form->field($adminGroup, 'name')->textInput(['maxlength' => true])->label(false)) ?>
index b01c6e3473c6b6777957906b16ccff859b9da74a..bc9823c996757ceb1736cd6d9cab5dac64f9dc9d 100755 (executable)
@@ -10,6 +10,35 @@ use kartik\select2\Select2;
 /** @var array $stores */
 /** @var array $adminChats */
 /** @var array $specialGroups */
+/** @var string|null $currentSort */
+/** @var string $currentOrder */
+
+use yii\helpers\Url;
+
+// Функция для генерации ссылки сортировки
+$getSortLink = function($field, $label) use ($currentSort, $currentOrder) {
+    $params = $_GET;
+    $params['sort'] = $field;
+    
+    // Если кликаем по той же колонке, меняем порядок
+    if ($currentSort === $field) {
+        $params['order'] = $currentOrder === 'asc' ? 'desc' : 'asc';
+    } else {
+        $params['order'] = 'asc';
+    }
+    
+    $url = Url::to(array_merge(['/grade'], $params));
+    
+    // Определяем иконку сортировки
+    $icon = '';
+    if ($currentSort === $field) {
+        $icon = $currentOrder === 'asc' ? ' ▲' : ' ▼';
+    }
+    
+    return Html::a($label . $icon, $url, [
+        'style' => 'text-decoration: none; color: inherit; cursor: pointer;'
+    ]);
+};
 
 ?>
 
@@ -22,6 +51,15 @@ use kartik\select2\Select2;
 </div>
 
 <?php $searchForm = ActiveForm::begin(['id' => 'search-form']); ?>
+<?php
+// Сохраняем параметры сортировки в скрытых полях формы
+if ($currentSort) {
+    echo Html::hiddenInput('sort', $currentSort);
+}
+if ($currentOrder && $currentSort) {
+    echo Html::hiddenInput('order', $currentOrder);
+}
+?>
 <div class="row mt-2">
     <div class="col-3">
         <?= $searchForm->field($searchModel, 'name')->textInput()->label(false) ?>
@@ -69,11 +107,21 @@ use kartik\select2\Select2;
 <?php ActiveForm::end(); ?>
 
 <div class="row mb-5">
-    <div class="col-2"></div>
-    <div class="col-2 font-weight-bold">Последний раз был(а)</div>
-    <div class="col-2 font-weight-bold">Позиция</div>
-    <div class="col-2 font-weight-bold">Должность</div>
-    <div class="col-2 font-weight-bold">Магазин</div>
+    <div class="col-2 font-weight-bold" style="cursor: pointer;">
+        <?= $getSortLink('name', 'Сотрудник') ?>
+    </div>
+    <div class="col-2 font-weight-bold" style="cursor: pointer;">
+        <?= $getSortLink('lasttime', 'Последний раз был(а)') ?>
+    </div>
+    <div class="col-2 font-weight-bold" style="cursor: pointer;">
+        <?= $getSortLink('position', 'Позиция') ?>
+    </div>
+    <div class="col-2 font-weight-bold" style="cursor: pointer;">
+        <?= $getSortLink('group', 'Должность') ?>
+    </div>
+    <div class="col-2 font-weight-bold" style="cursor: pointer;">
+        <?= $getSortLink('store', 'Магазин') ?>
+    </div>
 </div>
 
 <?php foreach ($admins as $admin): ?>