2016-04-05 9 views
2

Ich habe eine Klasse mit einer Multiple-Choice-Eigenschaft:Symfony 2.7 Wahl Rückruf funktioniert nicht in Form

... 

/** 
* @ORM\Column(type="array", name="majority_types") 
* @Constraints\Choice(callback="getAvailableMajorityTypes", multiple="true") 
*/ 
private $majorityTypes; 

... 

public static function getAvailableMajorityTypes() 
{ 
    return array(
     self::SIMPLE_MAJORITY, 
     self::UNANIMITY_MAJORITY, 
     self::THREE_FIFTHS_MAJORITY, 
     self::ONE_THIRD_MAJORITY, 
     self::FOUR_FIFTHS_MAJORITY 
    ); 
} 

... 

ich auch eine Formularklasse für diese Klasse hat:

... 

/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ... 
     ->add('majorityTypes', ChoiceType::class, array(
      'multiple' => true, 
     )) 
     ... 
     ->getForm(); 
} 

/** 
* @param OptionsResolver $resolver 
*/ 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'MyClass', 
    )); 
} 

Aber die Entscheidungen von getAvailableMajorityTypes werden nicht gerendert.

Ich habe einfach die folgenden Schritte ausgeführt: http://symfony.com/doc/master/reference/constraints/Choice.html#supplying-the-choices-with-a-callback-function, aber aus irgendeinem Grund funktioniert es nicht.

Edit:

Ich sehe, dass unter Verwendung statischer Entscheidungen als Anmerkungen weder Werke (choices={"foo1", "foo2"}). Die einzige Methode, die es funktioniert, besteht darin, die Auswahlmöglichkeiten direkt in der Methode add beim Erstellen des Formulars zu übergeben. Ich habe das Problem noch nicht herausgefunden.

Antwort

2

Wenn ich beziehe mich auf Ihre Worte:

Aber die Auswahl von getAvailableMajorityTypes werden nicht gerendert.

Es scheint, dass Sie zwischen dem Rendern von Optionen im Auswahlfeld Ihres Formulars und dem Choice Constraint verwirrt sind.

Sie haben die Einschränkung nur in Ihrem Code implementiert, aber Sie müssen auch die Optionen zu Ihrer Auswahl hinzufügen. Gefällt mir:

/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ... 
     ->add('majorityTypes', ChoiceType::class, array(
      'multiple' => true, 
      'choices' => YourEntity::getAvailableMajorityTypes() 
     )) 
+0

Aus dem letzten Teil der Frage: * Die einzige Möglichkeit, die es funktioniert, besteht darin, die Auswahlmöglichkeiten direkt in der add-Methode beim Erstellen des Formulars * zu übergeben. Das ist es, was Sie vorschlagen. Ist es nicht? – Manolo

+0

Ja tatsächlich. Die anderen Dinge, die Sie versucht haben, beziehen sich auf die Validierung des übermittelten Formulars, nicht auf das Rendering des HTML-Formulars. – Guillaume

+0

Es macht Sinn. – Manolo

0

Ich habe noch nie diese Anmerkung jedoch in der Dokumentation verwendet wird, ist der Rückruf public static:

// src/AppBundle/Entity/Author.php 
namespace AppBundle\Entity; 

class Author 
{ 
    public static function getGenders() 
    { 
     return array('male', 'female'); 
    } 
} 

Wenn Sie die Dokumentation folgen und Ihre Methode statisch machen als auch die Anmerkung funktionieren soll.

+0

Ja, es war eine Ahnungslosigkeit. Wie auch immer, es funktioniert immer noch nicht. Es scheint, dass der Callback nie aufgerufen wird, als wenn ich den Callback zu einer nicht existierenden Methode umbenenne, wird kein Fehler geworfen. – Manolo

Verwandte Themen