2016-09-08 5 views
0

Symfony Version: 3Symfony: Embeding Sammlung von Formularen Problem

Ich muss ein Formular erstellen, die Benutzerdaten in zwei Tabellen einfügen. Also ich folge this Methode im Symfony doc. Ich habe zwei Benutzer und Adresse und ich habe zwei Formular-Builder genannt Entitäten wie unten erstellt,

Address

class AddressType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('address'); 
     $builder->add('postCode'); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'PIE10Bundle\Entity\Address', 
     )); 
    } 
} 

Usertype

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('firstname'); 
     $builder->add('lastname'); 

     $builder->add('address', 
         CollectionType::class, 
         array(
          'entry_type' => AddressType::class 
     )); 

     $builder->add('Add User', SubmitType::class); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'PIE10Bundle\Entity\Users', 

     )); 
    } 
} 

und meine Contoller ,

public function addNewUserAction(Request $request) 
{ 
    $user = new Users; 
    $address = new Address; 

    $form = $this->createForm(UserType::class, $user); 

    $form->handleRequest($request); 

    return $this->render('PIE10Bundle:Form:newuser.html.twig', 
         array(
           'title' => 'Add New User', 
           'form' => $form->createView() 
    )); 
} 

und ja schließlich die Ansicht PIE10Bundle:Form:newuser.html.twig

{% extends "PIE10Bundle::layout.html.twig" %} 
{% block cmi_body %} 
<div class="row"> 
    <div class="col-md-2"> 

    </div> 
    <div class="col-md-6"> 
     {{form_start(form)}} 
      {{form_widget(form)}} 
     {{form_end(form)}} 
    </div> 
</div> 
<div class="row"> 
    {{ dump(form) }} 
</div> 
{% endblock %} 

Und ich bin immer so etwas wie die unten. enter image description here

in Form ich immer bin nicht die Textfelder für folgende

$builder->add('address'); 
$builder->add('postCode'); 

Ich muss wissen, wenn ich etwas in meinem Code oder den Grund fehle für die beiden Textfelder nicht immer und wie man behebe dieses Problem.

Vielen Dank im Voraus.

+0

Ist das eine 1 zu 1 Beziehung zwischen Benutzer und Adresse? Vielleicht möchten Sie Ihr Mapping zeigen. Wie Sie Ihre Beziehung zwischen diesen beiden Entitäten eingerichtet haben, würde bestimmen, welcher Formularfeldertyp verwendet werden soll. –

+0

ja dies ist 1 zu 1 Beziehung – mapmalith

Antwort

1

In Ihrer Benutzerklasse:

Änderung:

$builder->add('address', 
    CollectionType::class, 
    array(
      'entry_type' => AddressType::class,array('label' => false) 
    )); 

zu:

$builder->add('address', AddressType::class); 

Collection wird verwendet, wenn Ihre Beziehung Eins-zu-vielen oder many-to-many ist. Wenn Ihr Benutzer also mehrere Adressen haben könnte, würden Sie CollectionType verwenden (aber mit einigen Änderungen an Ihrem Code).

UPDATE mit mehreren Etiketten behandeln:
Sie haben zwei Adressetiketten, weil, wenn Sie den Formulartyp Address in Ihrem Benutzerformular fügen Sie es standardmäßig auf dem Etikett „Adresse“ nimmt. Auch in Ihrem AddressType haben Sie ein Feld für "Address", das standardmäßig die Bezeichnung "Address" trägt, daher die beiden Labels. Schau dir den obigen Code an. Ich habe array('label' => false) dem AddressType hinzugefügt, der die erste Instanz entfernt und das Etikett auf dem tatsächlichen Feld belässt.

+0

Ich denke, er möchte AddressType Formularfelder in der Ansicht sehen. Ihre Möglichkeit, nur eine Adressdaten zu speichern. –

+0

Siehe seine Kommentare. Es handelt sich um eine 1: 1-Beziehung, daher sollte er CollectionType nicht verwenden. Wenn Sie den benutzerdefinierten Formulartyp verwenden, wird er in die Ansicht eingefügt, da er das gesamte Formular rendert. Wenn Sie CollectionType verwenden, müssen Sie 'allow_add', 'allow_delete' einrichten, um Objekte aus der Sammlung hinzufügen/entfernen zu können. –

+0

Sie haben Recht bei CollectionType, aber er möchte andere Type-Felder in derselben Form sehen. Er sollte den AddressType von UserType erweitern. –

1

Sie müssen erweitern Address von Usertype

ändern Address so;

class AddressType extends UserType 
    { 
     public function buildForm(FormBuilderInterface $builder, array   $options) 
     { 
      parent::buildForm($builder, $options); 
      $builder->add('address'); 
      $builder->add('postCode'); 
     } 

     public function configureOptions(OptionsResolver $resolver) 
     { 
      $resolver->setDefaults(array(
       'data_class' => 'PIE10Bundle\Entity\Address', 
      )); 
     } 
    } 

Diesen Teil löschen;

 $builder->add('address', 
        CollectionType::class, 
        array(
         'entry_type' => AddressType::class 
    )); 
1

Im Inneren des __construct Ihrer Benutzer, fügen Sie eine neue Adresse Instanz

public function __construct() 
{ 
    $this->address = new Address(); 
} 

Damit Sie die fehlenden Formularfelder sehen

+0

Meinst du in der 'Users Entity' (was ist die Entität) oder' UserType' (was ist der FormType für Benutzer Entity) – mapmalith

+0

ja die Benutzer Entity –

Verwandte Themen