Error override model user.
'user' => [
'class' => 'dektrium\user\Module',
'modelMap' => [
'User' => 'app\models\User',
],
'adminPermission' => 'admin'
],
Argument 1 passed to dektrium\user\models\RegistrationForm::loadAttributes() must be an instance of dektrium\user\models\User, instance of app\models\User given, called in D:\OPENSERV2\OpenServer\domains\news-site3\vendor\dektrium\yii2-user\models\RegistrationForm.php on line 110
<?php
/*
* This file is part of the Dektrium project.
*
* (c) Dektrium project <http://github.com/dektrium/>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace app\models;
use dektrium\user\Finder;
use dektrium\user\helpers\Password;
use dektrium\user\Mailer;
use dektrium\user\Module;
use dektrium\user\traits\ModuleTrait;
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\Application as WebApplication;
use yii\web\IdentityInterface;
use yii\helpers\ArrayHelper;
/**
* User ActiveRecord model.
*
* @property bool $isAdmin
* @property bool $isBlocked
* @property bool $isConfirmed
*
* Database fields:
* @property integer $id
* @property string $username
* @property string $email
* @property string $unconfirmed_email
* @property string $password_hash
* @property string $auth_key
* @property string $registration_ip
* @property integer $confirmed_at
* @property integer $blocked_at
* @property integer $created_at
* @property integer $updated_at
* @property integer $last_login
* @property integer $flags
*
* Defined relations:
* @property Account[] $accounts
* @property Profile $profile
*
* Dependencies:
* @property-read Finder $finder
* @property-read Module $module
* @property-read Mailer $mailer
*
* @author Dmitry Erofeev <dmeroff@gmail.com>
*/
class User extends ActiveRecord implements IdentityInterface
{
use ModuleTrait;
const BEFORE_CREATE = 'beforeCreate';
const AFTER_CREATE = 'afterCreate';
const BEFORE_REGISTER = 'beforeRegister';
const AFTER_REGISTER = 'afterRegister';
const BEFORE_CONFIRM = 'beforeConfirm';
const AFTER_CONFIRM = 'afterConfirm';
// following constants are used on secured email changing process
const OLD_EMAIL_CONFIRMED = 0b1;
const NEW_EMAIL_CONFIRMED = 0b10;
/** @var string Plain password. Used for model validation. */
public $password;
/** @var Profile|null */
private $_profile;
/** @var string Default username regexp */
public static $usernameRegexp = '/^[-a-zA-Z0-9_\.@]+$/';
/**
* @return Finder
* @throws \yii\base\InvalidConfigException
*/
protected function getFinder()
{
return \Yii::$container->get(Finder::className());
}
/**
* @return Mailer
* @throws \yii\base\InvalidConfigException
*/
protected function getMailer()
{
return \Yii::$container->get(Mailer::className());
}
/**
* @return bool Whether the user is confirmed or not.
*/
public function getIsConfirmed()
{
return $this->confirmed_at != null;
}
/**
* @return bool Whether the user is blocked or not.
*/
public function getIsBlocked()
{
return $this->blocked_at != null;
}
/**
* @return bool Whether the user is an admin or not.
*/
public function getIsAdmin()
{
return
(\Yii::$app->getAuthManager() && $this->module->adminPermission ?
\Yii::$app->user->can($this->module->adminPermission) : false)
|| in_array($this->username, $this->module->admins);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getProfile()
{
return $this->hasOne($this->module->modelMap['Profile'], ['user_id' => 'id']);
}
/**
* @param Profile $profile
*/
public function setProfile(Profile $profile)
{
$this->_profile = $profile;
}
/**
* @return Account[] Connected accounts ($provider => $account)
*/
public function getAccounts()
{
$connected = [];
$accounts = $this->hasMany($this->module->modelMap['Account'], ['user_id' => 'id'])->all();
/** @var Account $account */
foreach ($accounts as $account) {
$connected[$account->provider] = $account;
}
return $connected;
}
/**
* Returns connected account by provider.
* @param string $provider
* @return Account|null
*/
public function getAccountByProvider($provider)
{
$accounts = $this->getAccounts();
return isset($accounts[$provider])
? $accounts[$provider]
: null;
}
/** @inheritdoc */
public function getId()
{
return $this->getAttribute('id');
}
/** @inheritdoc */
public function getAuthKey()
{
return $this->getAttribute('auth_key');
}
/** @inheritdoc */
public function attributeLabels()
{
return [
'username' => \Yii::t('user', 'Username'),
'email' => \Yii::t('user', 'Email'),
'registration_ip' => \Yii::t('user', 'Registration ip'),
'unconfirmed_email' => \Yii::t('user', 'New email'),
'password' => \Yii::t('user', 'Password'),
'created_at' => \Yii::t('user', 'Registration time'),
'last_login_at' => \Yii::t('user', 'Last login'),
'confirmed_at' => \Yii::t('user', 'Confirmation time'),
];
}
/** @inheritdoc */
public function behaviors()
{
return [
TimestampBehavior::className(),
];
}
/** @inheritdoc */
public function scenarios()
{
$scenarios = parent::scenarios();
return ArrayHelper::merge($scenarios, [
'register' => ['username', 'email', 'password'],
'connect' => ['username', 'email'],
'create' => ['username', 'email', 'password'],
'update' => ['username', 'email', 'password'],
'settings' => ['username', 'email', 'password'],
]);
}
/** @inheritdoc */
public function rules()
{
return [
// username rules
'usernameRequired' => ['username', 'required', 'on' => ['register', 'create', 'connect', 'update']],
'usernameMatch' => ['username', 'match', 'pattern' => static::$usernameRegexp],
'usernameLength' => ['username', 'string', 'min' => 3, 'max' => 255],
'usernameUnique' => [
'username',
'unique',
'message' => \Yii::t('user', 'This username has already been taken')
],
'usernameTrim' => ['username', 'trim'],
// email rules
'emailRequired' => ['email', 'required', 'on' => ['register', 'connect', 'create', 'update']],
'emailPattern' => ['email', 'email'],
'emailLength' => ['email', 'string', 'max' => 255],
'emailUnique' => [
'email',
'unique',
'message' => \Yii::t('user', 'This email address has already been taken')
],
'emailTrim' => ['email', 'trim'],
// password rules
'passwordRequired' => ['password', 'required', 'on' => ['register']],
'passwordLength' => ['password', 'string', 'min' => 6, 'max' => 72, 'on' => ['register', 'create']],
];
}
/** @inheritdoc */
public function validateAuthKey($authKey)
{
return $this->getAttribute('auth_key') === $authKey;
}
/**
* Creates new user account. It generates password if it is not provided by user.
*
* @return bool
*/
public function create()
{
if ($this->getIsNewRecord() == false) {
throw new \RuntimeException('Calling "' . __CLASS__ . '::' . __METHOD__ . '" on existing user');
}
$transaction = $this->getDb()->beginTransaction();
try {
$this->password = $this->password == null ? Password::generate(<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' /> : $this->password;
$this->trigger(self::BEFORE_CREATE);
if (!$this->save()) {
$transaction->rollBack();
return false;
}
$this->confirm();
$this->mailer->sendWelcomeMessage($this, null, true);
$this->trigger(self::AFTER_CREATE);
$transaction->commit();
return true;
} catch (\Exception $e) {
$transaction->rollBack();
\Yii::warning($e->getMessage());
throw $e;
}
}
/**
* This method is used to register new user account. If Module::enableConfirmation is set true, this method
* will generate new confirmation token and use mailer to send it to the user.
*
* @return bool
*/
public function register()
{
if ($this->getIsNewRecord() == false) {
throw new \RuntimeException('Calling "' . __CLASS__ . '::' . __METHOD__ . '" on existing user');
}
$transaction = $this->getDb()->beginTransaction();
try {
$this->confirmed_at = $this->module->enableConfirmation ? null : time();
$this->password = $this->module->enableGeneratingPassword ? Password::generate(<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' /> : $this->password;
$this->trigger(self::BEFORE_REGISTER);
if (!$this->save()) {
$transaction->rollBack();
return false;
}
if ($this->module->enableConfirmation) {
/** @var Token $token */
$token = \Yii::createObject(['class' => Token::className(), 'type' => Token::TYPE_CONFIRMATION]);
$token->link('user', $this);
}
$this->mailer->sendWelcomeMessage($this, isset($token) ? $token : null);
$this->trigger(self::AFTER_REGISTER);
$transaction->commit();
return true;
} catch (\Exception $e) {
$transaction->rollBack();
\Yii::warning($e->getMessage());
throw $e;
}
}
/**
* Attempts user confirmation.
*
* @param string $code Confirmation code.
*
* @return boolean
*/
public function attemptConfirmation($code)
{
$token = $this->finder->findTokenByParams($this->id, $code, Token::TYPE_CONFIRMATION);
if ($token instanceof Token && !$token->isExpired) {
$token->delete();
if (($success = $this->confirm())) {
\Yii::$app->user->login($this, $this->module->rememberFor);
$message = \Yii::t('user', 'Thank you, registration is now complete.');
} else {
$message = \Yii::t('user', 'Something went wrong and your account has not been confirmed.');
}
} else {
$success = false;
$message = \Yii::t('user', 'The confirmation link is invalid or expired. Please try requesting a new one.');
}
\Yii::$app->session->setFlash($success ? 'success' : 'danger', $message);
return $success;
}
/**
* Generates a new password and sends it to the user.
*
* @param string $code Confirmation code.
*
* @return boolean
*/
public function resendPassword()
{
$this->password = Password::generate(<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />;
$this->save(false, ['password_hash']);
return $this->mailer->sendGeneratedPassword($this, $this->password);
}
/**
* This method attempts changing user email. If user's "unconfirmed_email" field is empty is returns false, else if
* somebody already has email that equals user's "unconfirmed_email" it returns false, otherwise returns true and
* updates user's password.
*
* @param string $code
*
* @return bool
* @throws \Exception
*/
public function attemptEmailChange($code)
{
// TODO refactor method
/** @var Token $token */
$token = $this->finder->findToken([
'user_id' => $this->id,
'code' => $code,
])->andWhere(['in', 'type', [Token::TYPE_CONFIRM_NEW_EMAIL, Token::TYPE_CONFIRM_OLD_EMAIL]])->one();
if (empty($this->unconfirmed_email) || $token === null || $token->isExpired) {
\Yii::$app->session->setFlash('danger', \Yii::t('user', 'Your confirmation token is invalid or expired'));
} else {
$token->delete();
if (empty($this->unconfirmed_email)) {
\Yii::$app->session->setFlash('danger', \Yii::t('user', 'An error occurred processing your request'));
} elseif ($this->finder->findUser(['email' => $this->unconfirmed_email])->exists() == false) {
if ($this->module->emailChangeStrategy == Module::STRATEGY_SECURE) {
switch ($token->type) {
case Token::TYPE_CONFIRM_NEW_EMAIL:
$this->flags |= self::NEW_EMAIL_CONFIRMED;
\Yii::$app->session->setFlash(
'success',
\Yii::t(
'user',
'Awesome, almost there. Now you need to click the confirmation link sent to your old email address'
)
);
break;
case Token::TYPE_CONFIRM_OLD_EMAIL:
$this->flags |= self::OLD_EMAIL_CONFIRMED;
\Yii::$app->session->setFlash(
'success',
\Yii::t(
'user',
'Awesome, almost there. Now you need to click the confirmation link sent to your new email address'
)
);
break;
}
}
if ($this->module->emailChangeStrategy == Module::STRATEGY_DEFAULT
|| ($this->flags & self::NEW_EMAIL_CONFIRMED && $this->flags & self::OLD_EMAIL_CONFIRMED)) {
$this->email = $this->unconfirmed_email;
$this->unconfirmed_email = null;
\Yii::$app->session->setFlash('success', \Yii::t('user', 'Your email address has been changed'));
}
$this->save(false);
}
}
}
/**
* Confirms the user by setting 'confirmed_at' field to current time.
*/
public function confirm()
{
$this->trigger(self::BEFORE_CONFIRM);
$result = (bool) $this->updateAttributes(['confirmed_at' => time()]);
$this->trigger(self::AFTER_CONFIRM);
return $result;
}
/**
* Resets password.
*
* @param string $password
*
* @return bool
*/
public function resetPassword($password)
{
return (bool)$this->updateAttributes(['password_hash' => Password::hash($password)]);
}
/**
* Blocks the user by setting 'blocked_at' field to current time and regenerates auth_key.
*/
public function block()
{
return (bool)$this->updateAttributes([
'blocked_at' => time(),
'auth_key' => \Yii::$app->security->generateRandomString(),
]);
}
/**
* UnBlocks the user by setting 'blocked_at' field to null.
*/
public function unblock()
{
return (bool)$this->updateAttributes(['blocked_at' => null]);
}
/**
* Generates new username based on email address, or creates new username
* like "emailuser1".
*/
public function generateUsername()
{
// try to use name part of email
$username = explode('@', $this->email)[0];
$this->username = $username;
if ($this->validate(['username'])) {
return $this->username;
}
// valid email addresses are less restricitve than our
// valid username regexp so fallback to 'user123' if needed:
if (!preg_match(self::$usernameRegexp, $username)) {
$username = 'user';
}
$this->username = $username;
$max = $this->finder->userQuery->max('id');
// generate username like "user1", "user2", etc...
do {
$this->username = $username . ++$max;
} while (!$this->validate(['username']));
return $this->username;
}
/** @inheritdoc */
public function beforeSave($insert)
{
if ($insert) {
$this->setAttribute('auth_key', \Yii::$app->security->generateRandomString());
if (\Yii::$app instanceof WebApplication) {
$this->setAttribute('registration_ip', \Yii::$app->request->userIP);
}
}
if (!empty($this->password)) {
$this->setAttribute('password_hash', Password::hash($this->password));
}
return parent::beforeSave($insert);
}
/** @inheritdoc */
public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
if ($insert) {
if ($this->_profile == null) {
$this->_profile = \Yii::createObject(Profile::className());
}
$this->_profile->link('user', $this);
}
}
/** @inheritdoc */
public static function tableName()
{
return '{{%user}}';
}
/** @inheritdoc */
public static function findIdentity($id)
{
return static::findOne($id);
}
/** @inheritdoc */
public static function findIdentityByAccessToken($token, $type = null)
{
throw new NotSupportedException('Method "' . __CLASS__ . '::' . __METHOD__ . '" is not implemented.');
}
}