Работа с формой

Из документации:

А как поступить если часть получаемых данных сохраняется в базу, а часть нет? Например при регистрации или смене пароля, где требуется продублировать пароль? Описывать правила валидации подтверждения пароля в AR мне кажется не целесообразно…

Покажу как я делаю.

Модель User


<?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.

Спасибо! Аналогичный вариант я использовал на Адепте, а существуют ли "фирменные" решения для ИИ?

Кстати, в классе User, не плохо бы все таки описать атрибуты связанные с БД, что бы не описывать их в каждом классе формы

Чтобы понять, что это целесообразно, нужно иметь глубокое представление понятия модель в контексте MVC. То, что предложил Ekstazi - оверкодинг и так делать уж точно не стоит. Модель класса ActiveRecord не ограничивается(!) полями БД, может иметь свойства, значения которых будут приходить из форм, правила валидации этих данных, а также методы связанные с обработкой этих данных. Это нормально, во всю используется в примерах и не нарушает идеологии моделей. Что вас смутило, непонятно…


То, что предложил Ekstazi - оверкодинг и так делать уж точно не стоит

согласен 2creocoder +1

А зачем тогда уже модель User? Что б от неё наследовать только tableName? Мне кажется не целесообразно. Покраней мере в том примере о котором говорит автор.

Делай AR и не заворачивайся. Модель-форм нафиг не надо в принципе ИМХО (ну или в очень редких случаях).

Я уже давно так не делаю, код неактуальный…