Problemas Seteando Atributos Al Modelo

Hola.Ojala me puedan ayudar.

Quiero generar un archivo csv (extencion eexcelview) con los filtros del usuario; el caso es que yo guardo los atributos en una variable de session que luego se los paso a mi modelo para que solo me regresé los datos con esos atributos pero a la hora de generar el archivo me sale todo completo sin los filtros especificados. Pongo un fragmento de mi código:




$modelClass = base64_decode($_GET['mc']); // paso por GET el nombre del modelo

$model = CActiveRecord::model($modelClass); // genero el modelo ActiveRecord


$attributes = Yii::app()->session['attributes']; //obtengo los atributos de los filtros

if (isset($attributes)) {

    $model->SetAttributes($attributes); //seteo los atributos al modelo

}


$columns=array();

foreach ($_GET as $field=>$value) {

	if ($value==='c') {

		$columns[$field]=$field; //coloco en un array las columnas especificadas en el CGridView

	}

}


$dataProvider = $model->search();

$this->toExcel($dataProvider,

	$columns,

	$modelClass,

	array( 'creator' => 'SIMPLE-ERP',),

	'CSV'

); //mando Generar el csv




Si se genera el csv pero completo y no con los filtros. Si hago un print_r de $attributes veo que si estan los filtros pero si lo hago print_r( $model->GetAttributes() ) veo que no hay nada seteado.

¿Por qué no se setean los atributos a mi modelo?

Muchas gracias por su ayuda.

Buenos días.

Yo la verdad no entiendo lo q haces. Creo q te lías bastante.

Dices q guardas los atributos en variables de sesión. Entiendo que no son atributos del modelo, sino criterios de búsqueda. Podrías imprimir lo que tienes en "$attributes"?

Supongo que estará mal construído tu array de sesión para q no te los establezca. De hecho, en mi opinión debería llamarse como el nombre de tu modelo, y no "attributes":




Yii::app()->session['nombreModelo']

// en lugar de

Yii::app()->session['attributes']



Igual no tienes los atributos marcados como "safe" en las rules de tu modelo. Muéstranos las rules de tu modelo.

Aunque creo q como te dije arriba, te lías mucho. Si tú ya tienes los criterios de búsqueda en tu variable de sesión, lo único q tienes q hacer es modificar el "search" para que en lugar de los datos del modelo te coga los de la variable de sesión. Por ejemplo crear una función en tu modelo llamada "searchBySession" que tendrá algo parecido a esto:




$criteria=new CDbCriteria;


if(isset(Yii::app()->session['attributes']))

{

$criteria->compare('nombreCampo', Yii::app()->session['attributes']['valorAtributo'], true);

}


return new CActiveDataProvider($this, array(

			'criteria'=>$criteria));



Y pasar este dataprovider a tu excel:




...

$this->toExcel($model->searchBySession(),

...

Yo en lugar de utilizar sesiones "globales", utilizo los estados (sesiones de usuario).




Yii::app()->user->hasState('nombreVariableSesion');

Yii::app()->user->getState('nombreVariableSesion');

Yii::app()->user->setState('nombreVariableSesion', 'valorVariableSesion');



La diferencia es Diferencia entre los 2

Un saludo.

Hola.

Resulto que necesitaba un esenario seguro (safe) para poder asignar masivamente los atributos. Mi código quedó de la siguiente forma:




$modelClass = base64_decode($_GET['mc']); // paso por GET el nombre del modelo

$model = new $modelClass('search')


$model->unsetAttributes();

$attributes = Yii::app()->session['attributes']; //obtengo los atributos de los filtros guardados en TbGridView extended

if (isset($attributes)) {

    $model->attributes=$attributes;

}


$dataProvider = $model->search();

$this->toExcel($dataProvider,

        Yii::app()->session['columns_values'], //columnas guardas (name, value) en el TbGridView

        $modelClass,

        array( 'creator' => 'SIMPLE-ERP',),

        'CSV'

); //mando Generar el csv



Ahora tengo el problema que con datos de mas de 20 mil registros se agota la memoria y si incremento la memoria el servidor (apache) devuelve un timeOut o un proxy error :(.

Muchas gracias por tu respuesta, colsultare las variables de sesion de usuario.

Para timeout:




set_time_limit(500);



Para memoria:




ini_set('memory_limit', '256M');



Claro está q pondrás tus límites. Yo te pongo 500 y 256M, pero seguramente tú querrás otros diferentes.

Bueno, esto lo colocas por ejemplo al principio del controlador q necesite esto.

Un saludo.