2016-03-22 8 views
4

Mit Sonata Admin Bundle, das ein großartiges Add-On für Symfony ist, habe ich das Problem wie folgt beschrieben.Listenansicht in Sonata Admin nach verwandten Entity-Feldern sortieren

Sagen wir, wir haben 3 Entitäten: Stadt, Staat und Land. Sie alle haben die Eigenschaften id und name. Die Stadt steht in einem Verhältnis von Staat zu Staat, und der Staat hat ein Verhältnis von Land zu Land. Sie müssen alle Methoden angeben, die den Wert des Eigenschaftsnamens anzeigen.

Wir können eine Listenansicht für die Einheit der Stadt in Sonata Admin wie folgt erstellen:

geschützte Funktion configureListFields (ListMapper $ listMapper) { $ listMapper -> addIdentifier ('id') -> hinzufügen ('name') -> hinzufügen ('state') -> hinzufügen ('state.country') ;

|-----||--------------------||--------------------||--------------------| 
| Id ^|| Name^   || State    || State Country  | 
|-----||--------------------||--------------------||--------------------|  
| 1 || New York   || New York   || USA    | 
| 2 || Acapulco   || Guerrero   || Mexico    | 
| 3 || Calgary   || Alberta   || Canada    | 
| 4 || Tijuana   || Baja California || Mexico    | 
| 5 || Vancouver   || British Columbia || Canada    | 
| 6 || Los Angeles  || California   || USA    | 
|-----||--------------------||--------------------||--------------------| 

Per Default ist die Liste durch die Spalten Id und Namen, das Zeichen^sollte zeigen, dass sortierbar: }

Zur Veranschaulichung der Ansicht wie folgt aussehen könnte. Ich möchte in der Lage sein, die Liste nach den verwandten Entitätsfeldern zu sortieren und einen Link zu haben, der auf die show-Aktion für die verbundene Entität zeigt.

Hier ist, wie ich die Sortierung von Staat erreicht haben:

//... 
->add('state', null, array(
    'route' => array('name' => 'show'), 
    'sortable' => true, 
    'sort_field_mapping' => array('fieldName' => 'name'), // property name of entity State 
    'sort_parent_association_mappings' => array(array('fieldName' => 'state')) // property state of entity City 
)) 
//... 

Nun ist die Listenansicht ist sortierbar von der Unterkunft Name des Unternehmens Staat und alle Felder in der Spalte Staat Punkt auf der Show-Seite für den aktuellen Zustand:

|-----||--------------------||--------------------||--------------------| 
| Id ^|| Name^   || State^   || State Country  | 
|-----||--------------------||--------------------||--------------------|  
| 3 || Calgary   || Alberta   || Canada    | 
| 4 || Tijuana   || Baja California || Mexico    | 
| 5 || Vancouver   || British Columbia || Canada    | 
| 6 || Los Angeles  || California   || USA    | 
| 2 || Acapulco   || Guerrero   || Mexico    | 
| 1 || New York   || New York   || USA    | 
|-----||--------------------||--------------------||--------------------| 

Wie kann ich sortieren Sie die Listenansicht nach dem Land (Stadt-> Bundesland-> Land)? Etwas wie folgt aus:

|-----||--------------------||--------------------||--------------------| 
| Id ^|| Name^   || State^   || State Country  | 
|-----||--------------------||--------------------||--------------------|  
| 3 || Calgary   || Alberta   || Canada    | 
| 5 || Vancouver   || British Columbia || Canada    | 
| 2 || Acapulco   || Guerrero   || Mexico    | 
| 4 || Tijuana   || Baja California || Mexico    | 
| 6 || Los Angeles  || California   || USA    | 
| 1 || New York   || New York   || USA    | 
|-----||--------------------||--------------------||--------------------| 

Wenn ich versuche, so etwas wie die oben genannten Code-Schnipsel:

//... 
->add('state.country', null, array(
    'route' => array('name' => 'show'), 
    'sortable' => true, 
    'sort_field_mapping' => array('fieldName' => 'country.name'), // property name of entity Country 
    'sort_parent_association_mappings' => array(array('fieldName' => 'state.country')) // property country of entity State 
)) 
//... 

dann ein Ausnahmefehler ausgelöst. Ich habe verschiedene Kombinationen ausprobiert, aber alles ohne Erfolg.

ich tun konnte:

protected function configureListFields(ListMapper $listMapper) 
{ 
    $listMapper 
     ->addIdentifier('id') 
     ->add('name') 
     ->add('state.name') 
     ->add('state.country.name') 
    ; 
} 

und das Sortier Problem gelöst, aber dann gibt es keine Links zu den Einheiten.

Die offizielle Dokumentation ist sehr gut, aber dieses Thema fehlt. Also, wie sortiere ich eine Listenansicht nach hierarchischen Entitäten?

Antwort

8

Am nächsten Tag nach dem Posten der Frage habe ich den Quellcode von SonataAdminBundle und Symfony untersucht und die Lösung gefunden. Es ist eigentlich sehr einfach.Hier geht es:

//... 
->add(
    'state.country', 
    null, 
    array(
     'associated_property' => 'name', // property name of entity Country 
     'sortable' => true, // IMPORTANT! make the column sortable 
     'sort_field_mapping' => array(
      'fieldName' => 'name' // property name of entity Country 
     ), 
     'sort_parent_association_mappings' => array(
      array('fieldName' => 'state') // property state of entity City 
      array('fieldName' => 'country') // property country of entity State 
     ) 
    ) 
) 
//... 

Mit associated_property setzen wir die Eigenschaft, die angezeigt werden sollen. Dies kann entfallen, wenn in der Entität eine __toString Methode definiert wurde. In diesem Fall wird der Name des Landes in der Spalte angezeigt. Die Option sort_field_mapping erfordert ein Array mit dem Schlüssel fieldName, der die Eigenschaft enthält, nach der sortiert wird. Hier sortieren wir nach dem Namen des Landes. Wir könnten jedoch nach Bevölkerung sortieren, vorausgesetzt, dass wir diese Eigenschaft in der Entität Land haben, obwohl wir den Wert für den Namen anzeigen.

Und sort_parent_association_mappings ist der interessanteste Teil. Hier definieren wir die Eigenschaften, nach denen die Join-Abfrage erstellt werden soll: Stadt hat einen Eigenschaftsstatus, der das Entity-State ist, das selbst das Property-Land hat, das die Entität Country ist.

Ich hoffe meine Erklärung ist verständlich und kann anderen Menschen auch helfen.

+1

HI! Wären Sie bereit, dies als Kochbuchartikel in den Sonata-Dokumenten beizutragen? – greg0ire

+0

Das wäre wirklich nett! – OskarStark

+0

Vielen Dank für das Angebot. Es wird mir eine Ehre sein, das zu tun. – cezar