true, 'targetClass' => User::class, 'targetAttribute' => ['manager_id' => 'id'] ], ]; } public function attributeLabels() { return [ 'nickname' => Yii::t('backend', 'Ник менеджера в чате'), 'allowChat' => Yii::t('backend', 'Разрешить работу с чатом'), ]; } public function getManager(): ActiveQuery { return $this->hasOne(User::class, ['id' => 'manager_id']); } public static function getOrCreate($managerId): ManagerAllowChat { $managerAllowChat = ManagerAllowChat::findOne(['manager_id' => $managerId]); if (!$managerAllowChat) { $managerAllowChat = new ManagerAllowChat(); $managerAllowChat->allowChat = false; $managerAllowChat->manager_id = $managerId; } return $managerAllowChat; } public static function isAllowChat(): bool { if (!ChatSettings::getValueByName(ChatSettings::ENABLE_CHAT)) { return false; } $managerAllowChat = ManagerAllowChat::getOrCreate(Yii::$app->user->id); return $managerAllowChat->allowChat; } public static function generateTemporaryNick(User $user): string { $nick = $user->username; if (strpos($nick, '@') !== false) { $nick = ArrayHelper::getValue(explode('@', $nick), 0); } return $nick; } public static function loadFromPost(int $managerId): void { $managerAllowChat = ManagerAllowChat::getOrCreate($managerId); $oldNick = $managerAllowChat->nickname; $allowChat = $managerAllowChat->allowChat; if ($managerAllowChat->load(Yii::$app->request->post())) { $managerAllowChat->allowChat = boolval($managerAllowChat->allowChat); if ( $oldNick != $managerAllowChat->nickname || $allowChat != $managerAllowChat->allowChat ) { if ($managerAllowChat->allowChat) { $transaction = Yii::$app->db->beginTransaction(); try { if (!$managerAllowChat->save()) { throw new RecordNotValid($managerAllowChat); } ManagerChatUser::updateUserAccount($managerId, $managerAllowChat->nickname); $transaction->commit(); } catch (Throwable $th) { Yii::error( "Ошибка во обработки разрешения модератору на работу с чатом: {$th->getMessage()}", 'ManagerAllowChat.loadFromPost' ); $transaction->rollBack(); } } else { $managerAllowChat->delete(); } } } } }