رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
جدا کردن دو بخش کاربر
#1
سلام
من می خوام در فریم خواندن ایدی یوزر مشتری ها و یوزر بخش مدیریت رو از هم جدا کنم
من زمانی که در بخش مدیریت لاگین می کنم
در سایت با وقتی ایدی کاربر رو می خونم به مشکل می خورم
چون چنین کاربری وجود نداره
تو نت یکم جستجو کردم به این راه حل رسیدم
Yii::app()->setComponents(array(
         'errorHandler' => array(
        'errorAction' => 'admin/default/error',
        ),
        'user' => array(
        'class' => 'CWebUser',
        'stateKeyPrefix' => '_admin',
        'loginUrl' => Yii::app()->createUrl('admin/default/login'),
        ),
       ));
که برای بخش مدیریت یک Prefix تعیین کرده بود
ولی وقتی می خوام از این استفاده کنم به شکل زیر
Yii::app()->getModule('admin')->user->isGuest
که اگر کاربر لاگین نکرده بود بفرستم به صفحه لاگین
با این پیغام مواجه میشم
Property "AdminModule.user" is not defined.
میشه یکم من رو راهنمایی کنید تا این کار رو انجام بدم
پاسخ
تشکر شده توسط:
#2
باید دو تا کامپوننت تعریف کنید توی تنظیمات main.php
'components' => array(
    'user' => array(
        'loginUrl' => array('users/login'),
        'allowAutoLogin' => true,
        'stateKeyPrefix' => 'user_',
    ),
    'admin' => array(
        'class' => 'CWebUser',
        'loginUrl' => array('users/login'),
        'allowAutoLogin' => true,
        'stateKeyPrefix' => 'admin_',
    ),
),
حالا میتونید توی بخش ادمین از Yii::app()->admin بجای Yii::app()->user توی لاگین و لاگ اوت و isGuest و... استفاده کنید.
پاسخ
تشکر شده توسط: googoli
#3
استاد من طبق فرمایشات شما پیش رفتم و توی کانفیگ این طوری عمل کردم
'user'=>array(
 // enable cookie-based authentication
'loginUrl' => array('site/login'),
'allowAutoLogin'=>true,

),
'admin'=>array(
// enable cookie-based authentication
'loginUrl' => array('admin/default/login'),
'allowAutoLogin'=>true,
'stateKeyPrefix' => 'admin_',
),

و در صفحه لاگین برای تست کردم از کد زیر استفاده کردم
echo Yii::app()->admin->isGuest ;

و با خطای زیر مواجه میشم باید چکار کنم ؟
Object configuration must be an array containing a "class" element.
پاسخ
تشکر شده توسط:
#4
کدی که من گذاشتم رو با دقت نگاه کنید. فیلد class رو باید برای admin بگذارین چون کامپوننت پیشفرض user نیست و باید بگین که از کلاس CWebUser استفاده میکنید. stateKeyPrefix رو برای کامپوننت user هم بگذارین.
پاسخ
تشکر شده توسط: googoli
#5
ممنون استاد
کد رو این شکلی کردم درست شد
'user'=>array(
 // enable cookie-based authentication
'loginUrl' => array('site/login'),
'allowAutoLogin'=>true,
'stateKeyPrefix' => 'customer_',
),
'admin'=>array(
// enable cookie-based authentication
'class' => 'CWebUser',
'allowAutoLogin'=>true,
'stateKeyPrefix' => 'admin_',
),
الان به چیز دیگه ای بر خوردم
اونم این هست که
زمانی که من در بخش مدیریت لاگین می کنم در سایت میاد اسم یوزر که در قسمت ادمین هست رو نمایش میده مثلا مدیر سایت
در صورتی که من این شکلی فرخوانی کردم
Yii::app()->user->name
برای این مشکل چه راه حلی رو پیشنهاد می کنید
پاسخ
تشکر شده توسط:
#6
خوب شما قبلش باید با Yii::app()->user->isGuest چک کنید کاربر لاگین کرده یا نه و ضمناً توی لاگین بخش مدیریت، AdminIdentity جداگانه بنویسید برای لاگین.
پاسخ
تشکر شده توسط:
#7
استاد قبلش چک میکنم
و برای ماژول هم AdminIdentity  جداگانه دارم اگر لازم هست کدش رو بذارم اینجا تا مشاهده  کنید
پاسخ
تشکر شده توسط:
#8
این کد
<?php

/**
* UserIdentity represents the data needed to identity a user.
* It contains the authentication method that checks if the provided
* data can identity the user.
*/
class AdminIdentity extends CUserIdentity
{
   private $_id;
   private $_name;
/**
* Authenticates a user.
* The example implementation makes sure if the username and password
* are both 'demo'.
* In practical applications, this should be changed to authenticate
* against some persistent user identity storage (e.g. database).
* @return boolean whether authentication succeeds.
*/
public function authenticate()
{
       $admin = User::model()->find('LOWER(username)=:username ',array(':username'=>strtolower($this->username)));
if(!$admin) {
$this->errorCode=self::ERROR_USERNAME_INVALID;
       }
elseif(!$admin->validatePassword($this->password)) {
$this->errorCode=self::ERROR_PASSWORD_INVALID;
       }
else {
$this->errorCode=self::ERROR_NONE;
           $this->_id = $admin->id;
           $this->_name = $admin->name;
       }
return !$this->errorCode;
}

   public function getId()
   {
       return $this->_id;
   }

   public function getName()
   {
       return $this->_name;
   }
}
پاسخ
تشکر شده توسط:
#9
خوب نباید از جدول User بخونید. خط 22 باید از جدول Admin بخونید کاربر رو.
پاسخ
تشکر شده توسط:
#10
استاد من جدول user همون جدول ادمین من هست

من جدول دوم که جدول مشتری های من هست اسمش customer هست
پاسخ
تشکر شده توسط:
#11
استاد من الان چک کردم
شرط گذاشتم در قسمت مدیریت
 if(!Yii::app()->admin->isGuest) 
یوزر رو Guest میشناسه در صورتی که من لاگین کردم نباید Guest باشه
این هم کد UserIdentity
class UserIdentity extends CUserIdentity
{
private $_id;
private $_name;
/**
* Authenticates a user.
* The example implementation makes sure if the username and password
* are both 'demo'.
* In practical applications, this should be changed to authenticate
* against some persistent user identity storage (e.g. database).
* @return boolean whether authentication succeeds.
*/
public function authenticate()
{
$user = Customer::model()->find('LOWER(username)=:username AND block=0',array(':username'=>strtolower($this->username)));
if(!$user) {
$this->errorCode=self::ERROR_USERNAME_INVALID;
       }
elseif(!$user->validatePassword($this->password)) {
$this->errorCode=self::ERROR_PASSWORD_INVALID;
       }
else {
$this->errorCode=self::ERROR_NONE;
           $this->_id = $user->id;
           $this->_name = $user->name ;
       }
return !$this->errorCode;
}

public function getId()
{
return $this->_id;
}

public function getName()
{
return $this->_name;
}


}
پاسخ
تشکر شده توسط:
#12
لازم هست من بگم که حتی من کنترلر های دو بخش رو از هم جدا کردم
ولی باز میره از کنترلر اصلی می خونه
class DefaultController extends AdminController
پاسخ
تشکر شده توسط:
#13
راستش نباید مشکل خاصی وجود داشته باشه مگه اینکه توی کانفیگ درست عمل نکرده باشین. فایل کانفیگ کامپوننتهای user و customer و همچنین کلاسهای Identity اونها و فرمهای لاگین و کلاً هر بخشی که از این کامپوننتها استفاده کرده رو بگذارین تا بررسی کنم. ضمناً توی توضیحاتتون از اسامی یوزر و کاستومر استفاده کنید چون توی سناریوی شما یوزر معادل ادمین توی پروژه های دیگه است و یه جورایی داره مفاهیم قاطی میشه.
پاسخ
تشکر شده توسط:




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