خوب فکر میکنم یک مقدار توی درک نحوه کار Yii دچار اشتباه شدین. برای نمونه، پیاده سازی سیستم login و logout رو توضیح میدم ببینید کدهاتون رو باید چطور تغییر بدین.
1- ابتدا توی فایل تنظیمات (protected/config/main.php)، کامپوننت db رو تنظیم کنید:
return array(
//...
'components'=>array(
//...
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=voip',
'emulatePrepare' => true,
'username' => 'root',
'password' => '123456',
'charset' => 'utf8',
'tablePrefix' => 'Structuretbl_',
),
//...
//...
);
2- اکشنهای login و logout رو به کنترلر site اضافه کنید (فایل protected/controllers/SiteController.php) :
public function actionLogin() {
$model = new LoginForm();
// collect user input data
if(isset($_POST ['LoginForm'])) {
$model->attributes = $_POST ['LoginForm'];
// validate user input and redirect to the previous page if valid
if($model->validate() && $model->login()) {
$log = new Logs;
$log->user_id = Yii::app()->user->id;
$log->login = time();
$log->activity = $log->login;
$log->save();
$this->redirect(Yii::app()->user->returnUrl);
}
else {
Yii::app()->session->add('failure', 'خطا در نام کاربری یا رمز عبور');
}
}
// display the login form
$this->render('login', array ('model' => $model));
}
public function actionLogout()
{
Yii::app()->user->logout();
$this->redirect(Yii::app()->homeUrl);
}
3- کلاس UserIdentity رو اصلاح کنید (فایل protected/components/UserIdentity.php) :
<?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 UserIdentity extends CUserIdentity {
private $_id;
/**
* 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 = Users::model()->find('LOWER(username)=? AND confirmed=1', array(strtolower($this->username)));
if($user === null) {
$user = Users::model()->find('LOWER(email)=? AND confirmed=1', array(strtolower($this->username)));
}
if($user === null) {
$this->errorCode = self::ERROR_USERNAME_INVALID;
}
elseif(!$user->validatePassword($this->password)) {
$this->errorCode = self::ERROR_PASSWORD_INVALID;
}
else {
$this->_id = $user->id;
$this->username = $user->name;
$this->errorCode = self::ERROR_NONE;
}
return $this->errorCode == self::ERROR_NONE;
}
/**
* Get the current user ID
* @return int Current user ID
*/
public function getId() {
return $this->_id;
}
}
4- مدل Users رو با کمک Gii ایجاد کنید (من فرض کردم فقط دو فیلد username و password رو دارین - فایل protected/models/Users.php) :
<?php
/**
* This is the model class for table "{{useraccounts}}".
*
* The followings are the available columns in table '{{useraccounts}}':
* @property integer $id
* @property string $username
* @property string $password
*/
class Users extends CActiveRecord {
public $password_repeat;
private $_attributesBackup;
/**
*
* @return string the associated database table name
*/
public function tableName() {
return '{{useraccounts}}';
}
/**
*
* @return array validation rules for model attributes.
*/
public function rules() {
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array (
array ('username, mobile, password, password_repeat', 'required', 'on'=>'create'),
array ('username', 'required', 'on'=>'update'),
array ('username, password', 'length', 'max' => 255),
array ('password', 'compare', 'on'=>'create'),
// The following rule is used by search().
// @todo Please remove those attributes that should not be searched.
array ('id, username, password', 'safe', 'on' => 'search'));
}
/**
*
* @return array relational rules.
*/
public function relations() {
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array (
);
}
/**
*
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels() {
return array (
'id' => 'ردیف',
'username' => 'نام کاربری',
'password' => 'رمز عبور',
);
}
/**
* Retrieves a list of models based on the current search/filter conditions.
* Typical usecase:
* - Initialize the model fields with values from filter form.
* - Execute this method to get CActiveDataProvider instance which will filter
* models according to data in model fields.
* - Pass data provider to CGridView, CListView or any similar widget.
* @return CActiveDataProvider the data provider that can return the models
* based on the search/filter conditions.
*/
public function search() {
// @todo Please modify the following code to remove attributes that should not be searched.
$criteria = new CDbCriteria();
$criteria->compare('id', $this->id);
$criteria->compare('username', $this->username, true);
$criteria->compare('password', $this->password, true);
return new CActiveDataProvider($this, array ('criteria' => $criteria));
}
/**
* Returns the static model of the specified AR class.
* Please note that you should have this exact method in all your CActiveRecord descendants!
* @param string $className active record class name.
* @return Users the static model class
*/
public static function model($className = __CLASS__) {
return parent::model($className);
}
/**
* Apply a hash on the password before we store it in the database
*/
protected function afterValidate() {
parent::afterValidate();
if(!$this->hasErrors() && $this->getOriginalAttribute('password') != $this->password) {
$this->password = $this->hashPassword($this->password);
}
}
/**
* Generates the password hash
* @param string $password The password to hash
* @return string The hashed password
*/
public static function hashPassword($password) {
return md5($password);
}
/**
* Checks if the given password is correct
* @param string The password to be validated
* @return boolean Whether the password is valid
*/
public function validatePassword($password) {
return $this->hashPassword($password) === $this->password;
}
/**
* Store original attributes in a backup area
*/
public function afterFind() {
$this->_attributesBackup = $this->attributes;
}
/**
* Get original specific attribute
* @param string $attribute The attribute name to retrieve
* @return mixed The original attribute value
*/
public function getOriginalAttribute($attribute) {
if($this->_attributesBackup) {
return $this->_attributesBackup [$attribute];
}
return null;
}
}
5- مدل LoginForm رو ایجاد کنید (فایل protected/models/LoginForm.php) :
<?php
/**
* LoginForm class.
* LoginForm is the data structure for keeping
* user login form data. It is used by the 'login' action of 'SiteController'.
*/
class LoginForm extends CFormModel {
public $username;
public $password;
public $rememberMe;
private $_identity;
/**
* Declares the validation rules.
* The rules state that username and password are required,
* and password needs to be authenticated.
*/
public function rules() {
return array (
// username and password are required
array ('username, password', 'required'),
// rememberMe needs to be a boolean
array ('rememberMe', 'boolean'),
// password needs to be authenticated
array ('password', 'authenticate'));
}
/**
* Declares attribute labels.
*/
public function attributeLabels() {
return array ('username' => 'نام کاربری', 'password' => 'رمز عبور', 'rememberMe' => 'به خاطر بسپار');
}
/**
* Authenticates the password.
* This is the 'authenticate' validator as declared in rules().
*/
public function authenticate($attribute, $params) {
if(!$this->hasErrors()) {
$this->_identity = new UserIdentity($this->username, $this->password);
if(!$this->_identity->authenticate())
$this->addError('password', 'Incorrect username or password.');
}
}
/**
* Logs in the user using the given username and password in the model.
* @return boolean whether login is successful
*/
public function login() {
if($this->_identity === null) {
$this->_identity = new UserIdentity($this->username, $this->password);
$this->_identity->authenticate();
}
if($this->_identity->errorCode === UserIdentity::ERROR_NONE) {
$duration = $this->rememberMe ? 3600 * 24 * 30 : 0; // 30 days
Yii::app()->user->login($this->_identity, $duration);
Yii::app()->user->id = $this->_identity->id;
return true;
}
else
return false;
}
}
6- ویوی لاگین رو بسازین (protected/views/site/login.php) :
کد HTML:
<?php
/* @var $this UserController */
$this->pageTitle = Yii::app()->name . ' - ورود';
?>
<h1>ورود به سایت</h1>
<hr />
<p>لطفاً فرم زیر را برای ورود به سایت تکمیل کنید:</p>
<form action="<?php echo Yii::app()->createUrl('site/login'); ?>" method="post">
<table>
<tr>
<td><strong>نام کاربری یا ایمیل:</strong></td>
<td><input name="LoginForm[username]" placeholder="نام کاربری" style="width: 150px;" type="text" /></td>
</tr>
<tr>
<td><strong>رمز عبور:</td></tr>
<td><input name="LoginForm[password]" placeholder="رمز عبور" style="width: 150px;" type="password" /></td>
</tr>
<tr>
<td><strong>مرا بخاطر بسپار:</td></tr>
<td><input name="LoginForm[rememberMe]" style="width: 150px;" type="checkbox" /></td>
</tr>
<tr>
<td> </span>
<td><input style="width: 150px;" type="submit" value="ورود" /></td>
</tr>
</table>
</form>
توصیه میکنم پکیج آموزش Yii رو که لینکش توی امضام هست، تهیه کنید. درصورت عدم تمایل برای صرف هزینه هم میتونید eBookهای خوبی که در این زمینه هست مثل Web Development with Yii and PHP و... رو مطالعه کنید. خود سایت Yii هم مستندات کامل و خوبی داره (yiiframework.com)