رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
ارور در فایل config ماژول (حل شد)
#1
سلام

برای ماژول 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 جدا و مستقل باشه.

لطفا راهنمایی بفرمایید.

متشکرم.


فایل‌های پیوست تصاویر بندانگشتی
   
پاسخ
تشکر شده توسط:
#2
فایل 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();
پاسخ
تشکر شده توسط:
#3
برای اینکه از یک مدل کاربری جداگانه استفاده کنید، باید 2 تا کامپوننت از کلاس yiiwebUser ایجاد کنید.
پاسخ
تشکر شده توسط: abdollah110110
#4
یعنی چطور؟ در فایل config/web.php باید این کارو انجام بدم؟
مدل Admins که ساخته ام در مسیر app/modules/admin/models/Admins.php قرار داره و از مدل Users جداست.
و کاربرد فایل config که ساختیم دقیقا چیه؟
پاسخ
تشکر شده توسط:
#5
فایل کانفیگ ماژول برای تنظیم اولیه فیلدهای public کلاس ماژولتونه. کامپوننت یوزر مال برنامه است نه ماژول. باید توی کانفیگ برنامه تعریف کنید تا بتونید با Yii::$app بهش دسترسی پیدا کنید. برای اینکه سشنهاشون قاطی نشه باید به دو تا کامپوننتتون id های جداگانه هم بدین.
پاسخ
تشکر شده توسط:
#6
چطور دو کامپوننت تعریف کنم؟
لطفا با استفاده از کد توضیح بدین.
پاسخ
تشکر شده توسط:
#7
تنظیمات 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 متفاوت، سشنهاشون قاطی نمیشن.
پاسخ
تشکر شده توسط: abdollah110110
#8
متأسفانه فیلم جلسه سوم کارگاه که شرکت کردین بخاطر مشکل صدا قابل ارائه نبود وگرنه توی اون جلسه توضیح داده بودم. فیلم دوره بعدی که 29 آبان برگزار میشه رو براتون میفرستم و این موارد کاملاً داخلش توضیح داده شده.

http://www.nada-learn.ir/course/yii-shop
پاسخ
تشکر شده توسط: abdollah110110
#9
دستورات گفته شده در بالا رو در فایل 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
) 
پاسخ
تشکر شده توسط:
#10
فیلد fullname رو توی مدل Admins دارین؟
پاسخ
تشکر شده توسط:
#11
آره 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 ;
   }
پاسخ
تشکر شده توسط:
#12
وقتی توی برنامه میگین Yii::$app->user->id یا کلاً بصورت داخلی میخواد خود Yii برحسب id کاربر رو پیدا کنه، id بصورت آرگومان برای متد findIdentity بطور خودکار ارسال میشه. متن خطایی که دریافت میکنین رو بگذارین تا ببینیم مشکل از کجاست.
پاسخ
تشکر شده توسط: abdollah110110
#13
مشکل اینه کد زیر برای user درست کار میکنه ولی برای admin نه.

Yii::$app->admin->identity->username;

توی لیوت به identity دسترسی ندارم.


فایل‌های پیوست تصاویر بندانگشتی
   
پاسخ
تشکر شده توسط:
#14
توی تیم ویور مشخص شد:

چون شرط زیر برای 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;
   }
}


تشکر از استاد شهرکی
پاسخ
تشکر شده توسط: ADMIN




کاربران در حال بازدید این موضوع: 1 مهمان