From 66a8b7c84f97ae730647b0be2337cb0fe02c0926 Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Thu, 4 Dec 2025 17:00:28 +0300 Subject: [PATCH] =?utf8?q?=D0=A3=D0=B1=D0=B8=D1=80=D0=B0=D0=B5=D0=BC=20?= =?utf8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=BE?= =?utf8?q?=D0=B2=D1=8B=D1=85=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=20=D0=B8=20?= =?utf8?q?=D0=B8=D1=85=20=D1=83=D0=BD=D0=B8=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD?= =?utf8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=BF=D0=BE=20=D0=B8=D0=BC=D0=B5?= =?utf8?q?=D0=BD=D0=B8=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?utf8?q?=D0=BA=D0=B0=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../actions/grade/AdminGroupUpdateAction.php | 67 ++++++++++++++-- erp24/actions/grade/IndexAction.php | 80 ++++++++++++++----- erp24/records/AdminGroup.php | 1 + erp24/views/grade/admin-group-update.php | 32 +++++++- erp24/views/grade/index.php | 58 ++++++++++++-- 5 files changed, 205 insertions(+), 33 deletions(-) diff --git a/erp24/actions/grade/AdminGroupUpdateAction.php b/erp24/actions/grade/AdminGroupUpdateAction.php index 9650427a..40f14388 100644 --- a/erp24/actions/grade/AdminGroupUpdateAction.php +++ b/erp24/actions/grade/AdminGroupUpdateAction.php @@ -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; + } + } + } +} diff --git a/erp24/actions/grade/IndexAction.php b/erp24/actions/grade/IndexAction.php index 3870868b..5d3ade37 100755 --- a/erp24/actions/grade/IndexAction.php +++ b/erp24/actions/grade/IndexAction.php @@ -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 diff --git a/erp24/records/AdminGroup.php b/erp24/records/AdminGroup.php index f713c5ad..74e779b8 100755 --- a/erp24/records/AdminGroup.php +++ b/erp24/records/AdminGroup.php @@ -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' => 'Группа с таким именем уже существует. Пожалуйста, выберите другое имя.'], ]; } diff --git a/erp24/views/grade/admin-group-update.php b/erp24/views/grade/admin-group-update.php index ead8ef72..192fd85e 100644 --- a/erp24/views/grade/admin-group-update.php +++ b/erp24/views/grade/admin-group-update.php @@ -15,10 +15,40 @@ use yii_app\records\AdminGroup;

'btn btn-primary m-2']) ?> - name) ?>

+ name ?: 'Новая группа') ?>
+ session->hasFlash('error')): + $errorMessage = Yii::$app->session->getFlash('error'); + ?> +
+
+ +
+
+ registerJs("alert('" . addslashes($errorMessage) . "');"); + endif; + + if (Yii::$app->session->hasFlash('success')): + ?> +
+
+ +
+
+ + 'admin-group-update-form']); ?> field($adminGroup, 'name')->textInput(['maxlength' => true])->label(false)) ?> diff --git a/erp24/views/grade/index.php b/erp24/views/grade/index.php index b01c6e34..bc9823c9 100755 --- a/erp24/views/grade/index.php +++ b/erp24/views/grade/index.php @@ -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; 'search-form']); ?> +
field($searchModel, 'name')->textInput()->label(false) ?> @@ -69,11 +107,21 @@ use kartik\select2\Select2;
-
-
Последний раз был(а)
-
Позиция
-
Должность
-
Магазин
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
-- 2.39.5