سلام
من می خوام در فریم خواندن ایدی یوزر مشتری ها و یوزر بخش مدیریت رو از هم جدا کنم
من زمانی که در بخش مدیریت لاگین می کنم
در سایت با وقتی ایدی کاربر رو می خونم به مشکل می خورم
چون چنین کاربری وجود نداره
تو نت یکم جستجو کردم به این راه حل رسیدم
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.
میشه یکم من رو راهنمایی کنید تا این کار رو انجام بدم
باید دو تا کامپوننت تعریف کنید توی تنظیمات 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 و... استفاده کنید.
استاد من طبق فرمایشات شما پیش رفتم و توی کانفیگ این طوری عمل کردم
'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.
کدی که من گذاشتم رو با دقت نگاه کنید. فیلد class رو باید برای admin بگذارین چون کامپوننت پیشفرض user نیست و باید بگین که از کلاس CWebUser استفاده میکنید. stateKeyPrefix رو برای کامپوننت user هم بگذارین.
ممنون استاد
کد رو این شکلی کردم درست شد
'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
برای این مشکل چه راه حلی رو پیشنهاد می کنید
خوب شما قبلش باید با Yii::app()->user->isGuest چک کنید کاربر لاگین کرده یا نه و ضمناً توی لاگین بخش مدیریت، AdminIdentity جداگانه بنویسید برای لاگین.
استاد قبلش چک میکنم
و برای ماژول هم AdminIdentity جداگانه دارم اگر لازم هست کدش رو بذارم اینجا تا مشاهده کنید
این کد
<?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;
}
}
خوب نباید از جدول User بخونید. خط 22 باید از جدول Admin بخونید کاربر رو.
استاد من جدول user همون جدول ادمین من هست
من جدول دوم که جدول مشتری های من هست اسمش customer هست
استاد من الان چک کردم
شرط گذاشتم در قسمت مدیریت
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;
}
}
لازم هست من بگم که حتی من کنترلر های دو بخش رو از هم جدا کردم
ولی باز میره از کنترلر اصلی می خونه
class DefaultController extends AdminController
راستش نباید مشکل خاصی وجود داشته باشه مگه اینکه توی کانفیگ درست عمل نکرده باشین. فایل کانفیگ کامپوننتهای user و customer و همچنین کلاسهای Identity اونها و فرمهای لاگین و کلاً هر بخشی که از این کامپوننتها استفاده کرده رو بگذارین تا بررسی کنم. ضمناً توی توضیحاتتون از اسامی یوزر و کاستومر استفاده کنید چون توی سناریوی شما یوزر معادل ادمین توی پروژه های دیگه است و یه جورایی داره مفاهیم قاطی میشه.