[Risolto] Come Realizzare Una Combo Di Ricerca Stato : 'attivi','non Attivi', 'tutti' ?

Gli utenti hanno ora anche uno stato isActive, boolean

nella vista admin vorremmo mettere nel filtro di ricerca avanzato una dropdown con le tre opzioni

Stato: - mostra tutti

   - solo attivi


   - solo non attivi

Sono riuscito a fare una getOptions che da in pasto 0=>"non attivi", 1="attivi", "ALL","=>"tutti" … ma mi sopraggiunge il problema di fare capire a Yii che se quel campo vale ALL allora NON deve neppure essere considerato nella ricerca.

Nella search fai:


if ($model->isActive !=='ALL')

   $criteria->compare('isActive', $this->isActive);

cavolo, a questa non avevo pensato.

Ho scoperto che comunque passandogli "" => "Qualsiasi", la ricerca funziona benissimo,… incredibile !

ora viene la parte difficile:

c’è modo di estendere la ricerca tramite combo anche alla CGridView?

Attualmente devo cercare ‘1’ per Si, ‘0’ per ‘No’, ovviamente, e lasciare vuoto per ‘Tutti’.

Se io volessi, potrei metterci una combo li, nell colonna Attivo della CGridView ?

Certo, devi settare il parametro filter della colonna:


array(

  'campo1',

  'campo2',

  array(

    'name'=>'attivo',

    'filter'=>array(''=>'tutti', '1'=>'Si', '2'=>'No')

  ),

)

Se passi un array, CGridColumn capisce che vuoi una combo. Penso che puoi anche fare a meno di mettere ‘tutti’ e lasciare il prompt vuoto che mette di default.

1°: Sei un mito

Confermo che questa tecnica funziona ! : ;D

Anche senza mettere la prima coppia ‘’=>‘Tutti’, c’è una selezione vuota nella combo che sta per tutti. Ottimo ;)




 array (

            'name' => 'isActive',

            'filter' => array ('0'=> Yii::t('general','No'), '1' => Yii::t('general','Si') ),    

        ),




Dato che attualmente vedo nella colonna degli zeri e degli uno, come diavolo faccio a realizzare che mi converta in ‘si’ e ‘no’ il campo ?




 array (

        'name' => 'isActive',

        'value' => "if ($model->isActive) Yii::t('general','Si'); else  Yii::t('general','No');" ,

        'filter' => array ('0'=> Yii::t('general','No'), '1' => Yii::t('general','Si') ),    

        ),



Forse l’idea migliore è di aggiungere ai campi della select di Yii un secondo campo che l’IIF del mysql ? cosi avrà sia isActive che … che so … isActiveString ?

Se si, come si modica il search?




$criteria=new CDbCriteria;


		$criteria->compare('id',$this->id);

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

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

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

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

		$criteria->compare('companyId',$this->companyId);

		$criteria->compare('languageId',$this->languageId);

		

		$criteria->compare('isActive',$this->isActive);

		

		$criteria->compare('isNotified',$this->isNotified);

		$criteria->compare('defaultModulesId',$this->defaultModulesId);


				

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));



ho provato




'value' => CHtml::encode( $model->isActive ? Yii::t('general','Si'): Yii::t('general','No' ) ) ,



ma succede che

  • col filtro ‘si’, tutto ok, si vedono solo i si e compaiono scritti ‘si’ invece di 1

  • col filtro ‘no’, tutto ok, si vedono solo i no e compaiono scritti ‘no’ invece di 0

  • col filtro vuoto, seleziona tutti i record, ma a questo punto tutti compaiono come ‘No’ …

… non capisco …

RISOLTO !!!!

mi sono fatto un helper e gli ho passato una funzione… ci ho messo un po a capire che quella del value è in effetti una callback, e che tra l’altro per farla andare ci voglio gli apici e non i doppi apici, come mia abitudine, e che poi devo chiamare $data e non $model … fastidio …




  'value' => 'MyHelper::booleanToYesNo($data->isActive)' 



guarda che esiste il tipo boolean in Yii, ti basta fare:




 array (

            'name' => 'isActive',

            'type'=>'boolean',

            'filter' => array ('0'=> Yii::t('general','No'), '1' => Yii::t('general','Si') ),    

        ),

Vedi anche questo post

questo sistema è ok, ma non mi fa la traduzione automatica anche dei valori in colonna. Rimangono Yes/No anche se imposto la lingua su Italiano !

E’ vero, dovresti configurare il booleanFormat

Puoi farlo per esempio nel Controller (la masterclass in component), nella beforeAction:


Yii::app()->format->booleanFormat= array(Yii::t('general', 'No'), Yii::t('general', 'Yes'));

tu sei davvero un mito.

funziona benissimo, ti chiedo solo … non c’è un posto migliore dove inserire questa riga ?

che so… qualcosa che già di suo estenda App, così setto li dentro questa proprietà. definirla nel beforeAction funziona ma fa a botte con il concetto di limitazione di responsabilità dei singoli file

Aggiungo una finezza: si può usare direttamente questo come sorgente della combo per i filtri !

questa è l’admin view




array (

            'name' => 'isActive',

            'type' => 'boolean',

            'filter' => Yii::app()->format->booleanFormat,    

        ),



e questa la search view




 <?php echo $form->dropDownList($model,'isActive', Yii::app()->format->booleanFormat, array('prompt' => "")  ) ; ?>



Puoi fare un behavior per l’applicazione, vedi questo wiki.

si, capisco, ho già una




class BeginRequest extends CBehavior



ma mettendolo in handleBeginRequest non ha effetto

Se segui l’articolo dovrebbe funzionare, ricordati di configurarlo nel config/main.

Prova a fare una echo per essere sicuro che il codice venga eseguito sul serio.

Cambio di rotta … del cliente… non vanno piu bene i si/no nei boolean, deve essere tradotto in base al contesto: per esempio lo stato isActive diventa Attivo/Cancellato, per cui ho buttato via il boolean formatter e sono tornato così:

view admin




array ( 

		        'name'=> 'isActive',

		        'value'=> 'MyHelper::booleanFormatter($data->isActive, "Si","No")',

		        'filter' => MyHelper::booleanDropDown("Si","No"),

		),



view _search




<?php echo $form->dropDownList($model, 'isActive', 

			                                    MyHelper::booleanDropDown("Si", "No", "Tutti")

			                               ); ?>



Da notare: la combo in _search ha “si, no, tuti” (autotradotti come sempre), mentre il filtro di colonna in _admin ha Si,No, perchè il vuoto vale per ‘tutti’. (Adesso non pensate a si/no/tutti invece di attivo/cancellato/tutti, devo ancora fare le traduzioni in 5 lingue…)

Questa cosa funziona benissimo.

Ora … mi è stato chiesto, in tutti i posti dove c’è un concetto di isActive di preselezionare nel filtro la voce ‘Si’ quindi sia nella _search, sia nel filro _admin, sia come filtraggio predefinito della tabella…

Come faccio a mettere questa preselezione ? Non è che il caso utente<>root, che è permanente e l’utente non può modificarla, qui l’utente può modificare il filtro, ma è predefinito a true.

Ho provato a preselezionare la voce Attivi




<?php echo $form->dropDownList($model, 'isActive', 

    			                                    MyHelper::booleanDropDown("Attivo", "Cancellato", "Tutti"),

    			                                    array('options'=>array( 

    			                                                            1=>array('selected'=>'selected'),

    			                                                           )

    			                                         )   

    			                               ); ?>			                                         )   



ma così nell’html mi trovo sia la voce ‘tutti’ che la voce ‘attivo’ con l’attribuito selected … e questo non me lo spiego …

SOLUZIONE FACILISSIMA:

Nel controller specifico dell’oggetto ho inserito nella actionIndex un semplice else…





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

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

        else 

            $model->isActive = 1;   // imposta il filtro di default a '1'