/** * Finds user by specified field(username, email, phone) * @param \DevGroup\Users\models\LoginForm $loginForm * @param string $field * * @return array */ protected function findUserByField(LoginForm &$loginForm, $field = 'username') { return [$field, function ($attribute) use(&$loginForm) { $user = Yii::createObject(ModelMapHelper::User()); /** @var LazyCache $cache */ $cache = Yii::$app->cache; $value = $loginForm->{$attribute}; $loginForm->user = $cache->lazy(function () use($user, $value, $attribute) { return $user::find()->where("{$attribute}=:param", [':param' => $value])->one(); }, "User:by:{$attribute}:{$value}", 86400, new TagDependency(['tags' => $user::commonTag()])); }]; }
public function authenticate(ClientInterface $client) { // find existing user by service if ($this->userService !== null) { /** @var User $user */ $user = Yii::createObject(ModelMapHelper::User()); $user = $user->loadModel($this->userService->user_id); $user->login(UsersModule::module()->loginDuration); } else { // no user for this pair // this is the most hard part // create user /** @var SocialServiceInterface|BaseClient $client */ $client->retrieveAdditionalData(); /** @var RegistrationForm $registrationForm */ $registrationForm = Yii::createObject(ModelMapHelper::RegistrationForm()); $this->mapServiceAttributes($client, $registrationForm); $user = $registrationForm->socialRegister($client); if ($user === false) { throw new ErrorException("Unable to register user"); } $userService = $this->createService(); if ($user->save() === false) { throw new ErrorException("Unable to save user:" . var_export($user->errors, true)); } $user->link('services', $userService); // check if we need to run post-registration $user->login(UsersModule::module()->loginDuration); // check if there's some required or recommended fields missing foreach (UsersModule::module()->requiredUserAttributes as $attribute) { if (empty($user->{$attribute})) { Yii::$app->session->setFlash('info', Yii::t('users', 'Please fill required profile fields.')); $this->redirectToProfileUpdate(); return; } } foreach (UsersModule::module()->recommendedUserAttributes as $attribute) { if (empty($user->{$attribute})) { //! @todo Add limitation on UsersModule::recommendedFieldsMaxPrompts Yii::$app->session->setFlash('info', Yii::t('users', 'Please fill recommended profile fields.')); $this->redirectToProfileUpdate(); return; } } } }
/** * @inheritdoc */ public function bootstrap($app) { $this->buildModelMap(); $this->buildAliases(); $app->i18n->translations['users'] = ['class' => 'yii\\i18n\\PhpMessageSource', 'basePath' => __DIR__ . DIRECTORY_SEPARATOR . 'messages']; foreach (ArrayHelper::merge($this->defaultHandlers, $this->handlers) as $eventData) { Event::on($eventData['class'], $eventData['event_name'], $eventData['event_handler']); } $app->on(Application::EVENT_BEFORE_REQUEST, function () { if ($this->logLastLoginTime === true) { Event::on(ModelMapHelper::User(), User::EVENT_LOGIN, function (Event $event) { /** @var User $user */ $user = $event->sender; $user->last_login_at = time(); $user->save(true, ['last_login_at']); }); } }); $this->frontendMonsterPatch(); }
public function generateUsername($additionalData = []) { // try to use name part of email if (!empty($this->email)) { $this->username = explode('@', $this->email)[0]; if ($this->validate(['username'])) { return $this->username; } } $additionalDataChecks = ['name', 'full_name', 'first_name', 'last_name']; foreach ($additionalDataChecks as $key) { if (isset($additionalData[$key])) { $this->username = $additionalData[$key]; if ($this->validate(['username'])) { return $this->username; } } } /** @var User $userModel */ $userModel = Yii::createObject(ModelMapHelper::User()); $tableName = $userModel->tableName(); unset($userModel); while (!$this->validate(['username'])) { $row = (new Query())->from($tableName)->select('MAX(id) as id')->one(); $this->username = '******' . ++$row['id']; } return $this->username; }