A Volte I Filtri Sulla Griglia Si Bloccano

Ho realizzato nella view una griglia con filtri:





$this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'test-grid',

	'dataProvider'=>$model->search(),

	'filter'=>$model,

	'columns'=>array(

		'CAMPO_A',

		'CAMPO_B',

...

...



nella view c’è solo quanto scritto.

Sul browser:

  1. filtro per il CAMPO_B (ad esempio scrivo PIPPO),

  2. ordino per il CAMPO_B

  3. provo a cancellare il filtro, ma non accetta più la modifica

ritorna sempre PIPPO

Nel controller ho scritto:




$model=new Modello('search');

$model->unsetAttributes();  // clear any default values

if(isset($_GET['Modello']))

	$model->attributes=$_GET['Modello'];

$this->render('index',array('model'=>$model));



Sembra tutto corretto, eppure la griglia si pianta.

Vi risulta un comportamento così anomalo?

Di primo acchito sembra tutto ok (il codice, non il comportamento delle griglia), puoi copia/incollarci il metodo search del model ?

Prova ad eseguire il filtro con Firefox e firebug installato. Nella console clicca su ‘mantieni’, quindi prova a rieseguire i passi che ci hai elencato. Se c’è un errore javascript (non si sa mai), li si vede.

In alternativa, puoi, sembra da firebug, guardare il pannello ‘NET’ filtrandolo sugli oggetti XHR (le chiamate ajax) e guardare se nel response per caso c’è un errore PHP o my SQL.

Altra cosa: in runtime\application.log delle volte trovi delle informazioni (le ultime sono in fondo al file stesso)

Io anziché usare firebig, uso Chrome, ma il risultato non cambia.

Si vede negli header che il browser manda la richiesta di elaborazione (col filtro PIPPO sbiancato)

e si vede l’output ricevuto da YII della pagina HTML identica a quella con filtro

Il metodo search del model è il classico:




public function search()

{

	// Warning: Please modify the following code to remove attributes that

	// should not be searched.


	$criteria=new CDbCriteria;


	$criteria->compare('CAMPO_A',$this->CAMPO_A,true);

	$criteria->compare('CAMPO_B',$this->CAMPO_B,true);


	return new CActiveDataProvider($this, array('criteria'=>$criteria,));

}



Sull’application.log… BINGO! c’è un bell’errore che però non mi dice nulla:

2012/10/16 14:05:46 [warning] [application] Failed to set unsafe attribute "CAMPO_B" of "Modello".

in /var/www/blablabla.it/protected/controllers/TestController.php (37)

idee su causa e soluzione?

Qui

http://www.yiiframework.com/forum/index.php/topic/13496-unsafe-attribute/

dicono di impostare il CAMPO_B su safe, ma nel mio modello è dichiarato

CAMPO_A e CAMPO_B sono due nomi di campo reali?

Perchè se per personalizzare la vista nella CGridView hai usato dei ‘name’ che sono diversi dal nome del campo, è necessario creare una variabile globale nel model che si chiami nello stesso modo, quindi usare la stessa variabile nel compare.

Se questo NON è il tuo caso, ahimè ho finito le idee

di che tipo di dato stiamo parlando? testo, date, numeri…

CAMPO_A e CAMPO_B sono reali di tipo testo

e quello che non si capisce è perché inizialmente funzionino.

Il filtro s’impalla solo quando clicco su una colonna della grid per ordinare

filtro + order => sbam !