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;
+ }
+ }
+ }
+}
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');
// Определяем специальные группы для подсветки строк
$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
[['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' => 'Группа с таким именем уже существует. Пожалуйста, выберите другое имя.'],
];
}
<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)) ?>
/** @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;'
+ ]);
+};
?>
</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) ?>
<?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): ?>