سلام
برای ماژول Admin فایل config رو بصورت زیر نوشتم اما ارور داد.
return[
'name' => 'Admin Module',
'basePath' => (__DIR__),
'homeUrl' => 'http://localhost/shopping/web/?r=admin',
'laguage' => 'fa_ir',
'components' =>[
'user' => [
'identityClass' => 'appmodulesadminmodelsadmins',
'enableAutoLogin' => true,
],
],
];
در کلاس ModuleAdmin فایل config.php رو require کردم.
class ModuleAdmin extends Module {
public $controllerNamespace = 'appmodulesadmincontrollers';
public function init(){
Yii::configure($this,require(__DIR__.'/config.php'));
Yii::$app->errorHandler->errorAction = 'admin/default/error';
return parent::init();
}
}
میخوام ماژول admin از Yii::$app->user جدا و مستقل باشه.
لطفا راهنمایی بفرمایید.
متشکرم.
فایل config.php رو بصورت زیر اصلاح کردم و دیگه ارور نداره.
return [
'params' => [
'name' => 'Shopping Admin',
'basePath' => (__DIR__),
'homeUrl' => 'http://localhost/shopping/web/?r=admin',
'laguage' => 'fa_ir',
],
'components' =>[
'user' => [
'class' => 'appmodulesadminmodelsadmins',
'identityClass' => 'appmodulesadminmodelsadmins',
'enableAutoLogin' => true,
],
],
];
حالا از این فایل config در فایل admin/layout/main.php ماژول چطور استفاده کنم؟
NavBar::begin([
'brandLabel' => Yii::$app->name' // در اینجا
'brandUrl' => 'http://localhost/shopping/web/', // در اینجا
'options' => [
'class' => 'navbar-inverse navbar-fixed-top border-bottom',
],
]);
if(!Yii::$app->user->isGuest){
$items = [
['label' => 'خروج (' . Yii::$app->user->identity->username . ')', // در اینجا
'url' => ['/admin/default/logout'],
'linkOptions' => ['data-method' => 'post'],
],
['label' => 'تغییر رمز عبور', 'url' => ['/admin/default/changepass']],
['label' => 'صفحه اصلی', 'url' => ['/admin']],
];
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right my-nav'],
'items' => $items,
]);
}
NavBar::end();
برای اینکه از یک مدل کاربری جداگانه استفاده کنید، باید 2 تا کامپوننت از کلاس yiiwebUser ایجاد کنید.
یعنی چطور؟ در فایل config/web.php باید این کارو انجام بدم؟
مدل Admins که ساخته ام در مسیر app/modules/admin/models/Admins.php قرار داره و از مدل Users جداست.
و کاربرد فایل config که ساختیم دقیقا چیه؟
فایل کانفیگ ماژول برای تنظیم اولیه فیلدهای public کلاس ماژولتونه. کامپوننت یوزر مال برنامه است نه ماژول. باید توی کانفیگ برنامه تعریف کنید تا بتونید با Yii::$app بهش دسترسی پیدا کنید. برای اینکه سشنهاشون قاطی نشه باید به دو تا کامپوننتتون id های جداگانه هم بدین.
چطور دو کامپوننت تعریف کنم؟
لطفا با استفاده از کد توضیح بدین.
تنظیمات config/web.php :
'user' => [
'identityClass' => 'appmodelsUsers',
'enableAutoLogin' => true,
'loginUrl' => ['/site/login'],
'idParam' => 'user',
],
'admin' => [
'class' => 'yiiwebUser',
'identityClass' => 'appmodelsAdmins',
'enableAutoLogin' => true,
'loginUrl' => ['/admin/default/login'],
'idParam' => 'admin',
],
حالا طبق کدی که گذاشتم، هر دو مدل Users و Admins باید رابط IdentityInterface رو پیاده سازی کنن و هرجا خواستین با Yii::$app->user و Yii::$app->admin به اونها بصورت جداگانه دسترسی پیدا کنید. بخاطر وجود idParam متفاوت، سشنهاشون قاطی نمیشن.
متأسفانه فیلم جلسه سوم کارگاه که شرکت کردین بخاطر مشکل صدا قابل ارائه نبود وگرنه توی اون جلسه توضیح داده بودم. فیلم دوره بعدی که 29 آبان برگزار میشه رو براتون میفرستم و این موارد کاملاً داخلش توضیح داده شده.
http://www.nada-learn.ir/course/yii-shop
دستورات گفته شده در بالا رو در فایل web.php قرار دادم.
IdentityInterface رو بصورت زیر در مدل Admins پیاده سازی کردم:
class Admins extends ActiveRecord implements IdentityInterface
{
public $authKey;
public $pass_repeat;
protected $old_password;
/**
* دستورات مربوط به ساخت مدلو برداشتم
*
/*IdentityInterface Implementation*/
public static function findIdentity($id) {
$model = self::findOne($id);
return $model ? new static($model) : null ;
}
public static function findIdentityByAccessToken($token,$type=null) {
return null;
}
public function getId() {
return $this->id;
}
public function getAuthKey() {
return $this->authKey;
}
public function validateAuthKey($authKey) {
return $this->authKey = $authKey;
}
}
در لیوت main ماژول، برا دستور زیر ارور میده(همین دستور برا user ارور نداره):
Yii::$app->admin->identity->fullname;
با اجرای دستور زیر:
MyTools::debug(Yii::$app->admin);
این نتیجه بدست میاد:
yiiwebUser#1
(
[identityClass] => 'app\modules\admin\models\Admins'
[enableAutoLogin] => true
[enableSession] => true
[loginUrl] => [
0 => '/admin/default/login'
]
[identityCookie] => [
'name' => '_identity'
'httpOnly' => true
]
[authTimeout] => null
[absoluteAuthTimeout] => null
[autoRenewCookie] => true
[idParam] => 'admin'
[authTimeoutParam] => '__expire'
[absoluteAuthTimeoutParam] => '__absoluteExpire'
[returnUrlParam] => '__returnUrl'
[yiiwebUser:_access] => []
[yiiwebUser:_identity] => false
[yiibaseComponent:_events] => []
[yiibaseComponent:_behaviors] => null
)
فیلد fullname رو توی مدل Admins دارین؟
آره ruleها بصورت زیر تعریف شده:
public function rules()
{
return [
[['fullname', 'username', 'password'], 'required'],
[['confirmed'], 'integer'],
[['fullname', 'username', 'password'], 'string', 'max' => 255],
];
}
پارامتر id$ در متد زیر از کجا براش ارسال میشه؟
public static function findIdentity($id) {
$model = self::findOne($id);
return $model ? new static($model) : null ;
}
وقتی توی برنامه میگین Yii::$app->user->id یا کلاً بصورت داخلی میخواد خود Yii برحسب id کاربر رو پیدا کنه، id بصورت آرگومان برای متد findIdentity بطور خودکار ارسال میشه. متن خطایی که دریافت میکنین رو بگذارین تا ببینیم مشکل از کجاست.
مشکل اینه کد زیر برای user درست کار میکنه ولی برای admin نه.
Yii::$app->admin->identity->username;
توی لیوت به identity دسترسی ندارم.
توی تیم ویور مشخص شد:
چون شرط زیر برای user اعمال شده بود و نه برای admin ، بنابراین identity از admin هیچوقت بدست نمیومد.
شرط اشتباه این بود:
if(!Yii::$app->user->isGuest){
$items = [
['label' => 'خروج (' . Yii::$app->admin->identity->username. ')',
'url' => ['/admin/default/logout'],
'linkOptions' => ['data-method' => 'post'],
],
];
}
شرط درست اینه:
if(!Yii::$app->admin->isGuest){
$items = [
['label' => 'خروج (' . Yii::$app->admin->identity->username. ')',
'url' => ['/admin/default/logout'],
'linkOptions' => ['data-method' => 'post'],
],
];
}
در نهایت برای اینکه بصورت درست login شویم در فایل loginForm.php ، متد login را تغییر میدهیم(در این متد و هر جای دیگه ای از برنامه که لازم باشه، از Yii::$app->admin بجای Yii::$app->user استفاده میکنیم):
public function login()
{
if ($this->validate()) {
return Yii::$app->admin->login($this->getUser());
} else {
return false;
}
}
تشکر از استاد شهرکی