Yii Framework Forum: override init de CActiveRecord - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

override init de CActiveRecord Rate Topic: -----

#1 User is offline   gallego123 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 11 March 2010 - 11:15 AM

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?
KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
0

#2 User is offline   PoL 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 506
  • Joined: 05-November 08
  • Location:Buenos Aires, Argentina

Posted 11 March 2010 - 11:43 AM

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).
Don't say what you think, think what you say
The problem is communication! Excess of communication!
0

#3 User is offline   gallego123 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 12 March 2010 - 05:32 AM

View PostPoL, on 11 March 2010 - 11:43 AM, said:

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:
KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
0

#4 User is offline   PoL 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 506
  • Joined: 05-November 08
  • Location:Buenos Aires, Argentina

Posted 12 March 2010 - 07:42 AM

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.

Don't say what you think, think what you say
The problem is communication! Excess of communication!
1

#5 User is offline   gallego123 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 12 March 2010 - 08:50 AM

View PostPoL, on 12 March 2010 - 07:42 AM, said:

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?

Quote


hi

i have a problem with init method in CActiveRecord class

the init method does not execute when I do a find(yes when i do a new)

the problem: public function __construct
when call a find method, the condition is true and return before call the init
		if($scenario===null) // internally used by populateRecord() and model()
			return;
...


why?

i'm defining the scenario in the init

// init in my model
public function init()
    {
      
      if($condition))
          $this->scenario='scenario1';
      else
          $this->scenario='scenario1';

      return parent::init();
    }



How can I do?

KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
0

#6 User is offline   PoL 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 506
  • Joined: 05-November 08
  • Location:Buenos Aires, Argentina

Posted 12 March 2010 - 08:57 AM

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?
Don't say what you think, think what you say
The problem is communication! Excess of communication!
0

#7 User is offline   PoL 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 506
  • Joined: 05-November 08
  • Location:Buenos Aires, Argentina

Posted 12 March 2010 - 08:59 AM

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.
Don't say what you think, think what you say
The problem is communication! Excess of communication!
0

#8 User is offline   gallego123 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 12 March 2010 - 06:30 PM

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
KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
0

#9 User is offline   gallego123 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 15 March 2010 - 05:58 AM

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)
KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users