[ 'class' => VerbFilter::class, 'actions' => [ 'delete' => ['post'], ], ], 'access' => [ 'class' => AccessControl::class, 'rules' => [ [ 'allow' => true, 'roles' => [User::ROLE_ADMINISTRATOR] ], ], ], ]; } public function actionIndex() { $searchModel = new UserSearch(); $dataProvider = $searchModel->search(Yii::$app->request->get()); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); } public function actionView($id) { return $this->render('view', [ 'model' => $this->findModel($id), ]); } public function actionCreate() { $model = new UserForm(); $model->setScenario('create'); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['index']); } $app_roles = Yii::$app->authManager->getRoles(); $roles = []; $roles['administrator'] = $app_roles['administrator']; $roles['manager'] = $app_roles['manager']; $roles['viewer'] = $app_roles['viewer']; return $this->render('create', [ 'model' => $model, 'roles' => ArrayHelper::map($roles, 'name', 'name') ]); } private function renderUsers($error_message = null) { $searchModel = new UserSearch(); $dataProvider = $searchModel->search(Yii::$app->request->get()); return $this->renderAjax( "../user/user_partial/user_grid", [ 'dataProvider' => $dataProvider, 'searchModel' => $searchModel, 'error_message' => $error_message ] ); } public function actionMoveToArchive() { $request = Yii::$app->request; if ($request->isAjax) { $postArray = $request->post('arrayData'); foreach ($postArray as $value) { $model = User::findOne(['id' => (int)$value]); if (!empty($model)) { $model->is_archive = true; $model->save(); } } return $this->renderUsers(); } return null; } public function actionMoveFromArchive() { $request = Yii::$app->request; if ($request->isAjax) { $postArray = $request->post('arrayData'); foreach ($postArray as $value) { $model = User::find()->andWhere(['id' => (int)$value])->limit(1)->one(); if (!empty($model)) { $model->is_archive = false; $model->save(); } } return $this->renderUsers(); } return null; } public function actionDeleteUsers() { $request = Yii::$app->request; if ($request->isAjax) { $error_msg = null; $postArray = $request->post('arrayData'); $transaction = User::getDb()->beginTransaction(); try { foreach ($postArray as $value) { $model = User::find()->andWhere(['id' => (int)$value])->limit(1)->one(); if (!is_null($model)) { $model->delete(); } } $transaction->commit(); } catch (\Throwable $e) { $transaction->rollBack(); $error_msg = $e->getMessage(); } return $this->renderUsers(); } return false; } public function actionDeleteAllUsers() { $admin_and_moderator_ids = RBACAuthAssignment::find() ->select(['user_id']) ->where(['item_name' => ['administrator', 'manager']],); $userArrayBatches = User::find() ->where(['not', ['id' => $admin_and_moderator_ids]]) ->andWhere(['not', ['username' => ['webmaster', 'manager']]]) ->batch(); $failed = false; foreach ($userArrayBatches as $userArray) { foreach ($userArray as $user) { if (!$user->delete()) { Yii::$app->session->setFlash('alert', [ 'body' => "Ошибка удаления пользователя с ID = {$user->id}", 'options' => ['class' => 'alert-danger'] ]); $failed = true; break; } } if ($failed) { break; } } return $this->redirect(Yii::$app->request->referrer ?: ['index']); } private function getRandomWord($len) { $word = array_merge(range('a', 'z'), range('A', 'Z')); shuffle($word); return substr(implode('', $word), 0, $len); } public function actionDepersonalizeUsers() { $request = Yii::$app->request; $error_message = null; if ($request->isAjax) { $postArray = $request->post('arrayData'); foreach ($postArray as $value) { $model = User::find()->andWhere(['id' => (int)$value])->limit(1)->one(); if ($model !== null) { $profile = $model->userProfile; $profile->firstname = $this->getRandomWord(mb_strlen((string)$profile->firstname)); $profile->middlename = $this->getRandomWord(mb_strlen((string)$profile->middlename)); $profile->lastname = $this->getRandomWord(mb_strlen((string)$profile->lastname)); $profile->passport_series = $this->getRandomWord(mb_strlen((string)$profile->passport_series)); $profile->passport_number = $this->getRandomWord(mb_strlen((string)$profile->passport_number)); $transaction = Yii::$app->db->beginTransaction(); try { $profile->save(false); $questionaries = AbiturientQuestionary::find()->andWhere(['user_id' => $model->id])->all(); foreach ($questionaries as $questionary) { $personalData = $questionary->personalData; $personalData->setScenario(PersonalData::SCENARIO_DEPERSONALIZATION); $personalData->firstname = $this->getRandomWord(mb_strlen((string)$personalData->firstname)); $personalData->middlename = $this->getRandomWord(mb_strlen((string)$personalData->middlename)); $personalData->lastname = $this->getRandomWord(mb_strlen((string)$personalData->lastname)); $personalData->passport_series = $this->getRandomWord(mb_strlen((string)$personalData->passport_series)); $personalData->passport_number = $this->getRandomWord(mb_strlen((string)$personalData->passport_number)); $personalData->snils = null; $personalData->save(false); $passportData = $questionary->passportData; foreach ($passportData as $passportItem) { $passportItem->issued_by = $this->getRandomWord(mb_strlen((string)$passportItem->issued_by)); $passportItem->issued_date = null; $passportItem->series = $this->getRandomWord(mb_strlen((string)$passportItem->series)); $passportItem->number = $this->getRandomWord(mb_strlen((string)$passportItem->number)); $passportItem->save(false); } } $transaction->commit(); } catch (\Throwable $e) { $transaction->rollBack(); $error_message = $e->getMessage(); } } } return $this->renderUsers($error_message); } return null; } public function actionUpdate($id) { $model = new UserForm(); $model->setModel($this->findModel($id)); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['index']); } return $this->render('update', [ 'id' => $id, 'model' => $model, 'roles' => ArrayHelper::map(Yii::$app->authManager->getRoles(), 'name', 'name') ]); } public function actionDelete(int $id) { $transaction = Yii::$app->db->beginTransaction(); try { $this->findModel($id)->delete(); $transaction->commit(); } catch (\Throwable $e) { $transaction->rollBack(); Yii::error("Ошибка удаления пользователя: {$e->getMessage()}"); Yii::$app->session->setFlash('alert', [ 'body' => 'Ошибка удаления пользователя', 'options' => ['class' => 'alert-danger'] ]); } return $this->redirect(['index']); } protected function findModel($id) { if (($model = User::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } } public function actionRemoveApplicationsBlocking() { $request = Yii::$app->request; $error_message = null; if ($request->isAjax) { $postArray = $request->post('arrayData'); $tnUser = User::tableName(); $tnBachelorApplication = BachelorApplication::tableName(); $users = User::find() ->joinWith(['rawApplications']) ->andWhere(['IN', "{$tnUser}.id", $postArray]) ->andWhere(["{$tnBachelorApplication}.block_status" => BachelorApplication::BLOCK_STATUS_ENABLED,]) ->all(); if (!$users) { $error_message = 'Список пустой'; return $this->renderUsers($error_message); } foreach ($users as $user) { $apps = $user->getRawApplications() ->andWhere(["{$tnBachelorApplication}.block_status" => BachelorApplication::BLOCK_STATUS_ENABLED,]) ->all(); if (!$apps) { continue; } foreach ($apps as $app) { $app->block_status = BachelorApplication::BLOCK_STATUS_DISABLED; if (!$app->save()) { $error_message = 'Ошибка снятия блокировки'; return $this->renderUsers($error_message); } } } } return $this->renderUsers(null); } public function actionMergeIndividual(int $id) { $user = User::findOne($id); if (Yii::$app->request->isPost && $user->load(Yii::$app->request->post())) { $user->guid = ArrayHelper::getValue(Yii::$app->request->post(), "{$user->formName()}.guid"); $userReference = UserReferenceTypeManager::getUserReferenceFrom1C($user); $user->user_ref_id = $userReference->id ?? null; $transaction = Yii::$app->db->beginTransaction(); if ($user->save(false, ['user_ref_id', 'guid'])) { $transaction->commit(); Yii::$app->session->setFlash('alert', [ 'body' => Yii::t('backend', 'Пользователь успешно объединен'), 'options' => ['class' => 'alert-success'] ]); return $this->redirect(['/user/index']); } $transaction->rollBack(); Yii::$app->session->setFlash('alert', [ 'body' => Yii::t('backend', 'Ошибка обновления пользователя'), 'options' => ['class' => 'alert-danger'] ]); } return $this->render( 'merge_individual', ['user' => $user] ); } }