2016-10-18 2 views
0

Hier verwendet, ist irgendeine Form I zu erstellen:Wie Transformator verwenden, um mit Form Entitätstyp eine Querybuilder

$form_roles = $this->createFormBuilder($defaultData) 
    ->add('roles', 'entity', array(
     'class' => 'MyBundle:Role', 
     'query_builder' => function(EntityRepository $er) { 
       return $er->createQueryBuilder('r') 
        ->orderBy('r.description', 'ASC'); 
      }, 
      'choice_label' => 'description', 
      'label' => 'My roles' 
    ))   
    ->getForm(); 

Das Beschreibungsfeld in der Rolle Objekt angezeigt ist nicht gut genug, um es zu Benutzer der Anwendung angezeigt werden soll. Also wollte ich es transformieren. Ich habe bereits Transformer in einer AbstractType-Klasse verwendet, wenn ich den Querybuilder mit jeder Eigenschaft, die ich sehen möchte, aber niemals im Entitätstyp erstellt habe.

So habe ich eine RoleTransformer Klasse wie folgt:

class RoleTransformer implements DataTransformerInterface { 
    public function transform($entity) { 
    $substitution_value = null; 

    switch ($entity->getDescription()) { 
     case 'ROLE_INPUT': 
      $substitution_value = "the value I want to see for this role"; 
      break; 
     case 'ROLE_VALIDATION': 
      $substitution_value = "the value I want to see for this role"; 
      break; 
     case 'ROLE_ADMIN': 
      $substitution_value = "the value I want to see for this role"; 
      break; 
     default: 
      $substitution_value = "the value I want to see for this role"; 
    } 

    return $substitution_value; 
    } 

    public function reverseTransform($substitution_value) { 
    return substitution_value; //the form is not submitted, I have no interest in reverse transformation I think. 
    } 
} 

In der Steuerung, wo ich die Form baue ich hinzufügen:

$ role_transformer = new RoleTransfomer() // nicht sicher, ob ich etwas passieren oder wenn es durch den Rahmen

und ich füge hinzu auf dem Formular-Builder (vor dem -> getForm()) durchgeführt wird:

->addModelTransformer($role_transformer) 

Ich dachte, ich würde ein Role-Objekt an die Transform-Methode übergeben, aber es ist ein Array und leider ist es leer.

Ich denke, ich bin zu weit von der Lösung entfernt, kann mir jemand helfen?

Vielen Dank.

Antwort

0

Warum nicht diese Logik und injizieren sie direkt in die choice_label mit einer anonymen Funktion wie hier erklärt:

http://symfony.com/doc/current/reference/forms/types/choice.html#choice-label

'choice_label' => function ($value, $key, $index) { 
    switch ($value) { // This may actually be key depending on how you have it setup 
     case 'ROLE_INPUT': 
      $substitution_value = "the value I want to see for this role"; 
      break; 
     case 'ROLE_VALIDATION': 
      $substitution_value = "the value I want to see for this role"; 
      break; 
     case 'ROLE_ADMIN': 
      $substitution_value = "the value I want to see for this role"; 
      break; 
     default: 
      $substitution_value = "the value I want to see for this role"; 
    } 
    return $substitution_value; 
},