2012-11-09 12 views
6

Ich mag gerne wissen Wetter möglich ist und wie ein Filter für die Listenansicht konfigurieren, wie die folgenden mit SonataAdminBundle in Symfony 2Mit SonataAdminBundle. Konfigurieren Sie Filter auf einem zweistufigen verbundene Organisation

Say I Einheiten Auftrag haben, indem er auf Entitäten Benutzer, der auf Entitäten verweist. Ich möchte Filter sowohl für die Filterung durch den Benutzer als auch für die Filterung nach Firma (Firma des Benutzers) konfigurieren Die erste ist geradlinig. Der zweite ist, was ich versuche zu klären.

In der Klasse OrderAdmin ich configureDatagridFilters als überschreiben würde:

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 
    ; 
} 

Das Syntax für das Unternehmen Filter durch Sonta docs inpired ist: nicht http://sonata-project.org/bundles/doctrine-orm-admin/2-0/doc/reference/filter_field_definition.html

ist nicht beabsichtigt, für das, was ich versuche zu erledigenden, kann aber Finde wo du hinschauen kannst.

Hoffe jemand hat eine Ahnung davon.

Dank

Antwort

15

Schließlich fand ich eine Antwort von dieser anderen Frage geführt: How can I create a custom DataGrid filter in SonataAdmin und eine engere Lesen der Sonate Admin-docs verknüpfe ich in meiner Frage eingefügt.

Falls jemand dieses Problem haben und das vorherige Beispiel nehmen:

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()) 
; 
} 

, wo die Methode getCompanyChoices ruft ein assoziatives Array von Unternehmen ids => Firmennamen (zum Beispiel). Und die Methode callbackFilterCompany ist wie folgt

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

Das half mir mit einer geringfügigen Änderung: statt leer ($ value [ ‚value‘]) Ich würde es vorziehen, is_null ($ value ['value']), weil leer (int (0)) als wahr ausgewertet wird. Vielen Dank für Ihre Lösung. –

Verwandte Themen