guardar un estado por request

Hola

les cuento lo que necesito y uds sabran interpretar que es lo que tengo que hacer

tengo un behaviors que me audita los cambios en la base

ActiveRecordLogablebehavior

lo que hace es guardar los datos al momento de buscarlos y luego los compara con los que graba

lo cual hace que cuando quiero hacer un reporte de muchas filas o una migracion me de error de memoria (128Mb)

hay un post en bugs sobre esto http://www.yiiframew…mory-consuming/

lo que quiero es, en determinadas acciones de un controlador, poder deshabilitar la auditoria

pero que sea solo para ese request (no para la sesion)

para deshabilitar la auditoria uso este codigo en cada modelo





$auditoria_habilitada = ......<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/huh.gif' class='bbc_emoticon' alt='???' />?<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/huh.gif' class='bbc_emoticon' alt='???' />


public function behaviors()

{

    if ($auditoria_habilitada)

    return array(

        'ActiveRecordLogableBehavior'=>

            'application.behaviors.ActiveRecordLogableBehavior',

    );

    else

      return array();

}



estube mirando esto http://www.yiiframew…ession-objects/

pero me modifica el valor a la sesion

como puedo hacer para guardar un estado o configuracion solo por la accion actual

si me exprese mal, pregunten

saludos y gracias

Si el problema es conseguir el valor de $auditoria_habilitada podes hacerlo a traves de get o post

Suponete que la accion la haces a traves de un link. en esa pagina podes poner un checkbox que se llame auditar (por ejemplo)

luego en la accion que dispara el link preguntas por el valor de ese checkbox…

Es una buena idea?

perfecto! gracias PoL

no es necesario poner el checkbox

al menos para lo que lo quiero yo

la accion XXXXX seria mi reporte, que es solo una consulta




    public function actionXXXXXXXXX()

    {

        $_GET['auditoria_habilitada']='N';

....



y en el model





public function behaviors()

{

    if  (isset($_GET['auditoria_habilitada']) and $_GET['auditoria_habilitada']=='N')

        return array();

    else

        return array(

        // Classname => path to Class

        'ActiveRecordLogableBehavior'=>

            'application.behaviors.ActiveRecordLogableBehavior',

    );

    

      

}




vuelvo al tema

en este caso particular, si hago lo que hice

tengo un problema de seguridad grave

cualquiera que sepa como se llama la variable, puede enviarla en la url y deshabilitarme la auditoria

para otra acción (por ejemplo delete create o update)

tengo que poner en cada acción de cada controlador $_GET[‘auditoria_habilitada’]=‘S’;???????

alguien hace auditoria de datos?

como la hace?

con triggers en la base?

saludos

por que en lugar de $_GET no usas setState()?

De la guia definitiva

Hay podrias setear eso para ciertos usuarios (admin por ejemplo)

Que se yo es una idea.

Otra es tener alguna variable del controlador que almacene ese valor y pedir el valor de esa variable en el behavior (supongo que con $this->controller->tu_variable) o algo asi

setState() me parece que setea en forma global y yo necesito que sea solo por ese request

osea, si en forma simultanea dos usuarios están haciendo uno reporte y otro una modificación

el usuario que esta haciendo el reporte deberia tener auditoria deshabilitada y el otro habilitada

la variable en el controlador me parece que va a funcionar

por cada request esa variable es local al request no?

si es asi, gracias PoL!!!!!

saludos

La variable si el local al request… lo que no se muy bien es como accederla desdel el behavior (ya que no me meti mucho con eso), pero es cuestion de investigar un poco…

Exitos!!!

en realidad no se accede desde el behavior

se accede desde cada model




public function behaviors()

{

    if  (isset($_GET['auditoria_habilitada']) and $_GET['auditoria_habilitada']=='N')

        return array();

    else

        return array(

        // Classname => path to Class

        'ActiveRecordLogablebehavior'=>

            'application.behaviors.ActiveRecordLogablebehavior',

    );

    

      

}



si hago $this->variable, accedo al controller del model que estoy modificando

no al controller de la accion que estoy ejecutando

(en mi caso estoy modificando varios models desde un solo controller)

sigo investigando

por ahora le pongo a cada acción el seteo

[edit]

agregue el siguiente codigo en la clase UserIdentity




    $this->setState('nombre_variable_habililita_auditoria', mt_rand());



en cada accion que no quiero auditar




$_GET[Yii::app()->user->getState('nombre_variable_habililita_auditoria')]='N';



y en cada model




public function behaviors()

{

    if  (isset($_GET[Yii::app()->user->getState('nombre_variable_habililita_auditoria')]) and $_GET[Yii::app()->user->getState('nombre_variable_habililita_auditoria')]!="S")

        return array();

    else

    return array(

        // Classname => path to Class

        'ActiveRecordLogableBehavior'=>

            'application.behaviors.ActiveRecordLogableBehavior',

    );

}