А как поступить если часть получаемых данных сохраняется в базу, а часть нет? Например при регистрации или смене пароля, где требуется продублировать пароль? Описывать правила валидации подтверждения пароля в AR мне кажется не целесообразно…
<?php
class User extends CActiveRecord
{
/**
* The followings are the available columns in table 'User':
* @var integer $Id
* @var string $name
* @var string $pass
* @var string $type
*/
/**
* Returns the static model of the specified AR class.
* @return CActiveRecord the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'User';
}
}
Модель смены пароля
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of ChangePassForm
*
* @author Administrator
*/
class ChangePassForm extends User{
public $oldPass;
public $newPass;
public $newPass2;
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function rules(){
return array(
array('oldPass','required','message'=>Yii::app()->registry->get('form/changePass','errors/onOldPassEmpty')),
array('oldPass','isOldPass'),
array('newPass','required','message'=>Yii::app()->registry->get('form/changePass','errors/onNewPassEmpty')),
array('newPass','length','min'=>8,'max'=>25,
'tooShort'=>Yii::app()->registry->get('form/changePass','errors/onNewPassTooShort'),
'tooLong'=>Yii::app()->registry->get('form/changePass','errors/onNewPassTooLong'),
),
array('newPass2','required','message'=>Yii::app()->registry->get('form/changePass','errors/onNewPass2Empty')),
array('newPass2','compare','compareAttribute'=>'newPass',
'message'=>Yii::app()->registry->get('form/changePass','errors/onNewPass2NotEqual'),
),
);
}
public function isOldPass(){
if(md5($this->oldPass)!=$this->pass){
$this->addError('oldPass',Yii::app()->registry->get('form/changePass','errors/onOldPassInvalid'));
}
}
public function attributeLabels(){
return Yii::app()->registry->get('form/changePass','labels');
}
public function safeAttributes(){
return array(
'oldPass','newPass','newPass2',
);
}
public function beforeSave(){
$this->pass=md5($this->newPass);
return true;
}
//put your code here
}
?>
То есть получается имеем базовую AR-модель User и от неё наследуем модели всех форм служащих для операций с User.
Чтобы понять, что это целесообразно, нужно иметь глубокое представление понятия модель в контексте MVC. То, что предложил Ekstazi - оверкодинг и так делать уж точно не стоит. Модель класса ActiveRecord не ограничивается(!) полями БД, может иметь свойства, значения которых будут приходить из форм, правила валидации этих данных, а также методы связанные с обработкой этих данных. Это нормально, во всю используется в примерах и не нарушает идеологии моделей. Что вас смутило, непонятно…
А зачем тогда уже модель User? Что б от неё наследовать только tableName? Мне кажется не целесообразно. Покраней мере в том примере о котором говорит автор.
Делай AR и не заворачивайся. Модель-форм нафиг не надо в принципе ИМХО (ну или в очень редких случаях).