override init de CActiveRecord

Buenas

les hago una consulta

yo sobreescribi el metodo init de CActiveRecord en un modelo

pero al parecer no se ejecuta (no deja log)

este es el codigo




public function init()

    {

     yii::log('init'.$this->scenario, 'info');


     parent::init();

      if( isset($_GET[Yii::app()->user->getState('nombre_variable_scenario_default')]))

          $this->scenario=$_GET[Yii::app()->user->getState('nombre_variable_scenario_default')];


      else

          $this->scenario=Yii::app()->params['default_scenario'];


      

    }




que estoy haciendo mal?

Te tira algun error?

No es Yii::log(…)? // Con mayusculas. O solo lo escribiste con m¡inusculas en el foro?

Por otro lado, te recomiendo que el parent::init() lo pongas al final de tu init, con un return…

Asi:




public function init()

{

   Yii::log('init'.$this->scenario, 'info');

   

   if( isset($_GET[Yii::app()->user->getState('nombre_variable_scenario_default')]))

       $this->scenario=$_GET[Yii::app()->user->getState('nombre_variable_scenario_default')];

   else

       $this->scenario=Yii::app()->params['default_scenario'];

   

   return parent::init();

}



Esto es porque si el dia de mañana el parent::init() hace algo mas y devuelve algun valor lo estarias perdiendo (ya que como esta ahora no guardas el resultado en ningun lado).

no, no me da error, solo que el el init estoy seteando el escenario y como no se ejecuta, no lo setea…por ende no me valida un campo

puede ser que el init solo se ejecute cuando hago un "new" y no con un find?

porque si creo un registro nuevo funciona, pero si hago un update no

yii::log anda igual :mellow:

Ahhhh… estuve mirando un poco el core… parece ser que cuando haces un find la ejecucion del __construct se corta antes de que este llame al init(). Usa una condicion que retorna antes. (El __construct es un metodo que se ejecuta cada vez que creas una instancia de un AR, el metodo esta definido en CActiveRecord).

Para que lo veas mas o menos (por lo menos lo que entendi)




$tuAR->find(...) // Este metodo internamente llama a $this->query(...) <<-- Esta definido en CActiveRecord.

$this->query(...) // Este llama a $this->populateRecord(...) <<-- Tambien definido en CActiveRecord. 

$this->populateRecord(...) // Este llama a un metodo que se llama instantiate(...) <<-- Tambien definido en CActiveRecord. 

$this->instantiate(...) // Este crea un nuevo objeto, pero le pasa como parametro null.

__construct() // Como recibio como parametro null retorna antes de llamar a init().


 // No se por qué hace eso, pero Master Qiang debe tener sus razones.



groso!

gracias PoL, ahora le pego un reto al master, jajaja

pero primero, tendría que escribir en ingles mi problema :(

el siguiente texto se entiende? lo pongo un bugs?

Hi

I have a problem redefining the init method in one of my models extending CActiveRecord class

The init method does not execute when I do a find (but it executes when I do a new)

The problem: public function __construct

When I call a find method, this condition is true and return before call the init()




                if($scenario===null) // internally used by populateRecord() and model()

                        return;

...

Why?

I’m redefining the scenario in the init




// init in my model

public function init()

    {

      

      if($condition))

          $this->scenario='scenario1';

      else

          $this->scenario='scenario2';


      return parent::init();

    }



What can I do?

Le cambien un par de palabras. Pero en general esta muy bien escrito. Postealo nomas a ver que nos dice Obi Qiang Kenobi.

Ponelo en el foro del 1.1 en general.

Para mi caso

podría usar el afterFind para hacer el seteo del escenario

estaba mirando que en el populateRecord, hace el seteo a ‘update’

el lunes pruebo y comento

Solucionado por el maestro en 1.1.1

  • Chg #949: The init() method will be invoked after an AR instance is created by the find methods (Qiang)