2013-04-25 10 views
9

Ho un elenco di elementi di tipo Veicolo e mostro questi elementi con Sonata Admin. Consentono di filtrare questi elementi dal campo "status", ma voglio che, quando viene visualizzata la lista, vengano mostrati solo i veicoli attivi e se qualcuno vuole vedere i veicoli inattivi, usa il filtro e seleziona lo stato inattivo. Vorrei sapere se qualcuno conosce il modo di applicare i filtri per impostazione predefinita per un elenco di elementi utilizzando Sonata Admin.Symfony2 - Fornisce un filtro predefinito in un elenco di elementi di Sonata Admin

Ecco il mio codice:

public function configureListFields(ListMapper $listMapper) 
{ 
    $listMapper 
     ->addIdentifier('name') 
     ->add('status') 
    ; 
} 

protected function configureDatagridFilters(DatagridMapper $mapper) 
{ 
    $mapper 
     ->add('name') 
     ->add('status') 
    ; 
} 

C'è qualche opzione che può essere aggiunto al campo di stato in configureDatagridFilters() per raggiungere questo obiettivo? Altre opzioni?

Grazie in anticipo.

risposta

21

si deve ignorare $ proprietà datagridValues ​​come segue (per lo stato> 0 se si tratta di un numero intero):

/** 
    * Default Datagrid values 
    * 
    * @var array 
    */ 
    protected $datagridValues = array (
      'status' => array ('type' => 2, 'value' => 0), // type 2 : > 
      '_page' => 1, // Display the first page (default = 1) 
      '_sort_order' => 'DESC', // Descendant ordering (default = 'ASC') 
      '_sort_by' => 'id' // name of the ordered field (default = the model id field, if any) 
     // the '_sort_by' key can be of the form 'mySubModel.mySubSubModel.myField'. 
    ); 

fonte: Configure the default page and ordering in the list view

+0

Grazie mille PéCé !! Ho cercato informazioni su Internet diverse ore. Non posso votare la tua risposta perché non ho abbastanza reputazione, ma voterò la tua risposta il prima possibile. – Airam

+0

Prego! Ho trovato le informazioni di configurazione su https://github.com/sonata-project/SonataAdminBundle/blob/master/Resources/doc/reference/advance.rst#configure-the-default-page-and-ordering-in-the -list-view – AlterPHP

+0

Lei, signore, mi hai salvato il mal di testa! – Matheno

8

È inoltre possibile utilizzare questo metodo

public function getFilterParameters() 
    { 
     $this->datagridValues = array_merge(
      array(
       'status' => array (
        'type' => 1, 
        'value' => 0 
       ), 
       // exemple with date range 
       'updatedAt' => array(
        'type' => 1, 
        'value' => array(
         'start' => array(
          'day' => date('j'), 
          'month' => date('m'), 
          'year' => date('Y') 
          ), 
         'end' => array(
          'day' => date('j'), 
          'month' => date('m'), 
          'year' => date('Y') 
          ) 
         ), 
        ) 
       ), 
      $this->datagridValues 
      ); 

     return parent::getFilterParameters(); 
    } 
5

L'utilizzo di entrambi gli approcci suggeriti sopra interromperà il comportamento dei "reset" dei filtri poiché forziamo sempre il filtro a filtrare in base a un valore predefinito. Per me, penso che l'approccio migliore è quello di utilizzare la funzione getFilterParameters (dal momento che siamo in grado di aggiungere la logica in là, invece di staticamente aggiungere il valore) e verificare se l'utente ha cliccato il tasto "Reset"

/** 
* {@inheritdoc} 
*/ 
public function getFilterParameters() 
{ 
    // build the values array 
    if ($this->hasRequest()) { 
     $reset = $this->request->query->get('filters') === 'reset'; 

     if (!$reset) { 
      $this->datagridValues = array_merge(array(
       'status' => array (
        'type' => 1, 
        'value' => 0 
       ), 
      ), 
       $this->datagridValues 
      ); 
     } 
    } 

    return parent::getFilterParameters(); 
} 
+0

Questo non vuole funzionare. Il valore è nel mio filtro, ma il filtro non è applicato. Se clicco su 'Filter' non succede nulla, ma quando resetto il filtro e poi scelgo il valore, funziona –

+0

Ho dovuto rimuovere' 'type' => EqualType :: TYPE_IS_EQUAL' nel mio caso –

Problemi correlati