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

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

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

#1 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 08 October 2012 - 08:51 AM

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.
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#2 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 08 October 2012 - 09:03 AM

Nella search fai:

if ($model->isActive !=='ALL')
   $criteria->compare('isActive', $this->isActive);

0

#3 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 08 October 2012 - 09:12 AM

cavolo, a questa non avevo pensato.

Ho scoperto che comunque passandogli "" => "Qualsiasi", la ricerca funziona benissimo,.... incredibile !
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#4 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 08 October 2012 - 09:26 AM

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 ?
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#5 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 09 October 2012 - 12:34 AM

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.
0

#6 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 09 October 2012 - 06:30 AM

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,
		));

Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#7 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 09 October 2012 - 06:41 AM

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 ...
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#8 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 09 October 2012 - 06:57 AM

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)' 

Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#9 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 10 October 2012 - 01:05 AM

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') ),    
        ),

0

#10 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 10 October 2012 - 01:10 AM

Vedi anche questo post
0

#11 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 10 October 2012 - 02:07 AM

View Postzaccaria, on 10 October 2012 - 01:05 AM, said:

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') ),    
        ),




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 !
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#12 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 10 October 2012 - 02:25 AM

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'));

0

#13 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 10 October 2012 - 06:44 AM

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' => "")  ) ; ?>

Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#14 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 10 October 2012 - 06:54 AM

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

#15 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 10 October 2012 - 07:02 AM

si, capisco, ho già una

class BeginRequest extends CBehavior


ma mettendolo in handleBeginRequest non ha effetto
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#16 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 11 October 2012 - 12:47 AM

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.
0

#17 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 12 October 2012 - 03:00 AM

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 ..
Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

#18 User is offline   realtebo 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 700
  • Joined: 03-October 12
  • Location:Ferrara

Posted 12 October 2012 - 04:36 AM

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'

Il computer non ragiona, ma ha sempre ragione.
Ricordalo quando fai il debug
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users