[Risolto] Come Realizzare Una Combo Di Ricerca Stato : 'attivi','non Attivi', 'tutti' ?
#1
Posted 08 October 2012 - 08:51 AM
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.
Ricordalo quando fai il debug
#2
Posted 08 October 2012 - 09:03 AM
if ($model->isActive !=='ALL')
$criteria->compare('isActive', $this->isActive);
#3
Posted 08 October 2012 - 09:12 AM
Ho scoperto che comunque passandogli "" => "Qualsiasi", la ricerca funziona benissimo,.... incredibile !
Ricordalo quando fai il debug
#4
Posted 08 October 2012 - 09:26 AM
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 ?
Ricordalo quando fai il debug
#5
Posted 09 October 2012 - 12:34 AM
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.
#6
Posted 09 October 2012 - 06:30 AM
Confermo che questa tecnica funziona ! :
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,
));
Ricordalo quando fai il debug
#7
Posted 09 October 2012 - 06:41 AM
'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 ...
Ricordalo quando fai il debug
#8
Posted 09 October 2012 - 06:57 AM
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)'
Ricordalo quando fai il debug
#9
Posted 10 October 2012 - 01:05 AM
array (
'name' => 'isActive',
'type'=>'boolean',
'filter' => array ('0'=> Yii::t('general','No'), '1' => Yii::t('general','Si') ),
),
#11
Posted 10 October 2012 - 02:07 AM
zaccaria, on 10 October 2012 - 01:05 AM, said:
array (
'name' => 'isActive',
'type'=>'boolean',
'filter' => array ('0'=> Yii::t('general','No'), '1' => Yii::t('general','Si') ),
),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 !
Ricordalo quando fai il debug
#12
Posted 10 October 2012 - 02:25 AM
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'));
#13
Posted 10 October 2012 - 06:44 AM
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' => "") ) ; ?>
Ricordalo quando fai il debug
#15
Posted 10 October 2012 - 07:02 AM
class BeginRequest extends CBehavior
ma mettendolo in handleBeginRequest non ha effetto
Ricordalo quando fai il debug
#16
Posted 11 October 2012 - 12:47 AM
Prova a fare una echo per essere sicuro che il codice venga eseguito sul serio.
#17
Posted 12 October 2012 - 03:00 AM
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 ..
Ricordalo quando fai il debug
#18
Posted 12 October 2012 - 04:36 AM
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'
Ricordalo quando fai il debug

Help













