Поведението на Yii модел в подкласа наследява класа на AR модела

Внедрих crypt клас на поведение, който може да бъде прикачен към AR модел, така че прикачените атрибути да се съхраняват като криптирани и да се извличат като декриптиран низ.

class User extends CActiveRecord 
{
    public function behaviors()
    {
        return array(
            'crypt' => array(
            // this assumes that the behavior is in the folder: protected/behaviors/
            'class' => 'application.behaviors.CryptBehavior',
            // this sets that the attributes to be encrypted/decrypted are encryptedfieldname of the model
            'attributes' => array('password'),
            'useAESMySql' => true
           )
        );
    }
}

Това работи добре. Също така имам персонализиран клас Myuser, който разширява User модела, за да пиша персонализираните си функции, така че ако направя някаква промяна в моята user таблица и регенерирам модел, няма да загубя собствените си функции.

Ако преместя функцията си behavior в клас MyUser, поведението не се прикачва и не работи според очакванията.

class MyUser extends User 
{
    public function behaviors()
    {
        return array(
            'crypt' => array(
            // this assumes that the behavior is in the folder: protected/behaviors/
            'class' => 'application.behaviors.CryptBehavior',
            // this sets that the attributes to be encrypted/decrypted are encryptedfieldname of the model
            'attributes' => array('password'),
            'useAESMySql' => true
           )
        );
    }

    public function customfn1()
    {
         //some code goes here...
    }
}

Всяка помощ ще бъде оценена. Връзка за справка: Поведение на криптата


person Suriya    schedule 26.10.2012    source източник
comment
не можах да намеря никъде разширение за cryptbehavior, това твоето собствено поведение ли е? може да постави грубо очертание на поведението, само кой клас разширява и кои функции изпълнява/има, ще бъде достатъчно.   -  person bool.dev    schedule 26.10.2012
comment
актуализира публикацията с референтна връзка!. Благодаря за проявения интерес.   -  person Suriya    schedule 26.10.2012
comment
няма проблем, нека да видя дали мога да помогна   -  person bool.dev    schedule 26.10.2012
comment
Мисля, че този блог ми дава някаква пътна карта за постигане на това, което искам. invisipunk.blogspot.in/2011/01/   -  person Suriya    schedule 26.10.2012
comment
коя версия на yii е твоята?   -  person bool.dev    schedule 26.10.2012


Отговори (2)


Ето и работещото решение. Трябва да тествам всички сценарии. Благодаря на @bool.dev за вашата функция.

class MyUser extends User 
{
    public static function model($className=__CLASS__)
    {
       return parent::model($className);
    }

    public function behaviors()
    {
        return array(
            'crypt' => array(
            // this assumes that the behavior is in the folder: protected/behaviors/
            'class' => 'application.behaviors.CryptBehavior',
           // this sets that the attributes to be encrypted/decrypted are encryptedfieldname of the model
            'attributes' => array('password'),
           'useAESMySql' => true
          )
       );
    }

   public static function getUserByID($id)
   {
      //validation of $id goes here..

      return MyUser::model()->findByPk($id);
   }
}

в моя контролер

$userModel = MyUser::getUserByID(1);

според мен

$userModel->password; //gives me the decrypted password; for easy understanding, i used password field here....
person Suriya    schedule 29.10.2012

Ще трябва също да добавите функцията static model на класа към подкласа. Само това трябва да работи:

public static function model($className=__CLASS__)
{
    return parent::model($className);
}
person bool.dev    schedule 26.10.2012
comment
всъщност връзката към блога, която дадохте, също е правилна, но някъде надолу във версиите на yii тази функционалност беше добавена. ще актуализирам отговора с кога е настъпила тази промяна и повече подробности по-късно, поне засега не би трябвало да получавате грешки с отговора. - person bool.dev; 26.10.2012
comment
опитвайки се да въведа някаква обща практика да не докосвате класа на базовия модел. Благодаря ви за отговора. Също така търся поведение на прикачване на ниво компонент на DB, за да мога да избегна този проблем. - person Suriya; 26.10.2012
comment
bool.dev тук ли живееш? да ти отговоря нещо! :P - person Asgaroth; 26.10.2012