Das Formular besteht aus einer Frage, die mehrere Antworten hat, so dass die Antworten für jede Frage dynamisch erstellt werden können. Dieses Zeug alles funktioniert gut:symfony2 Formular, Sammlung von Objekten, Ausgabe Aktualisierung vorhandener Objekteigenschaften
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('question','textarea')
->add('answers', 'collection', array(
'type'=>new AnswerType(),
'allow_add'=>true,
'allow_delete'=>true,
'label' => false
))
;
}
Hier Codeform für AnswerType:
$builder
->add('answer','text', array(
'attr'=>array(
'class'=>'form-control'
),
'label'=>false
))
->add('isGoodAnswer', 'checkbox', array(
'label'=>'Good?',
'required'=>false
))
;
I Prototyp template bin mit Container über jquery zu füllen.
Das Hinzufügen neuer Antwortobjekte zum Frageobjekt funktioniert einwandfrei. Löschen von Antworten ist auch kein Problem.
Wenn ich jedoch gehe, um vorhandene Eigenschaft auf einer der Sammelformulareingaben zu aktualisieren, wird das vorhandene Objekt nicht aktualisiert. Es bleibt jedoch das Frageobjekt bestehen, da es den Text der Frage selbst aktualisiert. Ich kann nur löschen und neu erstellen, um etwas aktuell zu ersetzen, und es fällt mir schwer, herauszufinden, warum.
Hier Code-Schnipsel aus der Schablonenform ist, die eingereicht wird:
<ul id="answer-fields-list" data-prototype="{{ form_widget(form.answers.vars.prototype)|e }}">
{% for answer in form.answers %}
<li>
<div class='col-md-12'>
{{ form_widget(answer) }}
<div>
<a href='#' class='btn btn-sm btn-danger delete-this'><span class='glyphicon glyphicon-trash'></span></a>
</div>
</div>
</li>
{% endfor %}
</ul>
<a href="#" id="add-answer" class='btn btn-sm btn-success'><span class='glyphicon glyphicon-plus-sign'></span> Add Answer</a>
bearbeiten, ist hier voll Controller-Code für dieses Update-Methode:
$question = $em->getRepository('ChecklistMainBundle:ChecklistQuestion')->findOneById($questionId);
if(!$question) throw new NotFoundHttpException('Question not found');
$form = $this->createForm(new QuestionAnswerType(), $question);
$form->handleRequest($request);
if($request->getMethod()=='POST' && $form->isValid())
{
if($form->get('attachment')->getData() != null) {
$question->uploadAttachment();
}
$em->persist($question);
$em->flush();
$this->get('session')->getFlashBag()->add('success', 'Question was modified successfully!');
return $this->redirect($this->generateUrl('admin_checklists_view', array('id'=>$id)));
}
Sie sollten Code-Snippet teilen, wo Sie behandeln Eingabe –
Hey Michal, ich mache nur '$ Form-> handleRequest ($ Anfrage);' dann persistent das $ -Frage-Objekt. Das Formular wird über symfony2 form builder erstellt: $ form = $ this-> createForm (new QuestionAnswerType(), $ question); ' – skrilled
Ok, nur um zu verdeutlichen, dass ich richtig verstanden habe: Ihre Änderungen werden in der Datenbank beibehalten, das Objekt jedoch nicht in PHP-Code geändert und Form wird mit alten Sachen gerendert, oder? Ihr Ansatz sieht gut aus (nach dem Buch). Ich frage nach Code-Snippet, weil es vielleicht einen kleinen Fehler gibt, das Objekt neu zu erstellen, es erneut zu rendern, es aus der Datenbank zu lesen, anstatt vom Formular etc. –