2012-11-09 14 views
6

Mi piacerebbe sapere il tempo è possibile e come configurare un filtro per la visualizzazione elenco come la seguente con SonataAdminBundle in Symfony 2Con SonataAdminBundle. Configurare filtro su un'entità correlata in due fasi

Dire che ho entità dell'Ordine, indicando entità Utente, che punta alle entità Società. Voglio configurare i filtri sia per il filtraggio per utente che per il filtraggio per azienda (società per utente) Il primo è semplice. Il secondo è ciò che cerco di chiarire.

Nella classe OrderAdmin avrei sovrascrivere configureDatagridFilters come:

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $datagridMapper 
     ->add('created_at') 
     //... some other filters on Order fields, as usual 

     // the filter on User, provided 'user', no ploblem 
     ->add('user') 

     // and the filter by Company 
     ->add('user.company') // this doesn't work, of course 
    ; 
} 

Che sintassi per il filtro società è ispirate ai lunghi capelli dai documenti Sonta: http://sonata-project.org/bundles/doctrine-orm-admin/2-0/doc/reference/filter_field_definition.html

non è indicato per quello che cerco di compire, ma non può trova dove guardare

Spero che qualcuno abbia un indizio su questo.

Grazie

risposta

15

Finalmente ho trovato una risposta guidata da quest'altra domanda: How can I create a custom DataGrid filter in SonataAdmin e una lettura più approfondita dei documenti sonata di admin link che ho incollato nella mia interrogazione.

Nel caso in cui qualcuno ha questo problema e prendendo l'esempio precedente:

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $datagridMapper 

     //... whatever filter 

     // and the filter by Company 

     ->add('company', 'doctrine_orm_callback', array(
      'callback' => array($this, 'callbackFilterCompany'), 
      'field_type' => 'checkbox' 
      ), 
    'choice', 
    array('choices' => $this -> getCompanyChoices()) 
; 
} 

dove i getCompanyChoices metodo recupera un array associativo di ID società => nomi di società (per esempio). E il metodo callbackFilterCompany è la seguente

public function callbackFilterCompany ($queryBuilder, $alias, $field, $value) 
{ 
    if(!is_array($value) or !array_key_exists('value', $value) 
     or empty($value['value'])){ 

     return; 

    } 

    $queryBuilder 
    ->leftJoin(sprintf('%s.user', $alias), 'u') 
    ->leftJoin('u.company', 'c') 
    ->andWhere('c.id = :id') 
    ->setParameter('id', $value['value']) 
    ; 

    return true; 
} 
+0

Questo mi ha aiutato con una piccola modifica: al posto del vuoto (valore di $ [ 'valore']) preferirei is_null ($ value ['value']) perché empty (int (0)) viene valutato su true. Grazie mille per la tua soluzione. –

Problemi correlati