2016-10-27 8 views
-1

In Symfony 2.x ich auf diese Weise verwendete Formular anzuzeigen mit benutzerdefinierten FeldernSymfony2.x zu 3.x Forms

Productformularklasse

public function __construct(array $aCustomFieldsList) 
{ 
    $this->aCustomFields = $aCustomFieldsList; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('name', TextType::class, [ "label" => "Name" ]) 
     ->add('price', MoneyType::class, [ "label" => "Price" ]); 


    foreach($this->aCustomFields as $n=>$sCustomField) 
    { 
     $builder->add($sCustomField, TextType::class, [ "label" => {$sCustomField}"]); 
    } 

    $builder->add('save', SubmitType::class, [ "label" => "Save" ]); 
} 

Und in der Steuerung

$form = $this->createForm(new ProductType($aCustomFields), $product); 

In Symfony 3.x erwartet das erste Argument der Methode createForm() jedoch nicht das instanzierte Objekt, sondern eine Zeichenfolge, die den Klassennamen mit Namespace darstellt:

$form = $this->createForm(ProductType::class, $product); 

Wie ist der gleiche Weg wie mit Symfony 3.x?

+0

Fahren Sie benutzerdefinierte Felder über den Optionen-Parameter. Und ja, die Migration von Forms 2 zu Form 3 kann sehr schmerzhaft sein. Sie werden wahrscheinlich auch auf mehr Probleme stoßen. – Cerad

Antwort

1

Wie von Cerad vorgeschlagen, können Sie diese Optionen im Optionsfeld übergeben. Dies wurde sogar in 2.x empfohlen. Sie definieren dann die Option Voraussetzungen dafür. Wenn Sie das Feld wie erforderlich benötigen, werden Fehler angezeigt, wenn Sie es beim Erstellen des Formulars nicht angeben.

// Form Type 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 

    $builder 
     ->add('name', TextType::class, [ "label" => "Name" ]) 
     ->add('price', MoneyType::class, [ "label" => "Price" ]); 


    foreach($options['custom_field_list'] as $n=>$sCustomField) 
    { 
     $builder->add($sCustomField, TextType::class, [ "label" => {$sCustomField}]); 
    } 

    $builder->add('save', SubmitType::class, [ "label" => "Save" ]); 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'custom_field_list' => [], 
    ]); 
    $resolver->setRequired([ 
     'custom_field_list' => true 
    ]); 
    $resolver->setAllowedTypes([ 
     'custom_field_list'=>'array' 
    ]); 
} 

Dann ist es in der Steuerung aufrufen:

//controller 

$form = $this->createForm(ProductType::class, $product, [ 
    'custom_field_list' => $aCustomFields 
]);