Entschuldigung für jeden Mangel an Klarheit in der Frage. Hier ist, wie ich es gelöst habe (ich würde immer noch an anderen/besseren Lösungen interessiert sein):
Ich habe einen separaten FormType (ReportConfirmType
) und Aktion (ConfirmAction
) für den zweiten Schritt erstellt. ReportConfirmType
hat den Typ der Datenklasse und im Wesentlichen alle die gleichen Felder wie der ursprüngliche FormType (ReportType
), aber mit ihnen alle markiert readonly
. Die Route ist sehr ähnlich. Ich habe auch eine private Methode erstellt, die als "Klebstoff" zwischen dem ersten und zweiten Schritt fungiert.
Wenn ich mit meinem ersten Schritt fertig bin, rufe ich die private Methode auf und übertrage die validierten Daten aus dem ersten Schritt (die unverändert verwendet werden können). Diese Methode richtet das zweite Formular ein und gibt die zweite Ansicht zurück. Die Aktion des Formulars muss auf die der zweiten Route geändert werden.
Alle nachfolgenden Eingaben gehen auf die neue Route, und wenn die zweite Form validiert ist, kann ich die letzten Aktivitäten des Prozesses ausführen.
Hier einige Beispiel-Code weiter zu veranschaulichen:
Report
class ReportType extends AbstractType{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('completedBy', 'text')
->add('comments', 'textarea', ['required' => false])
->add('format', 'choice', ['choices' => ['pdf' => 'PDF', 'word' => 'MS Word'] ])
->add('save', 'submit', ['label' => 'Submit', 'attr' => ['class' => 'btn btn-primary']])
->getForm();
}
...
ReportConfirmType
class ReportConfirmType extends AbstractType{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text', ['attr' => ['readonly' => 'readonly']])
->add('completedBy', 'text', ['attr' => ['readonly' => 'readonly']])
->add('comments', 'textarea', ['required' => false, 'attr' => ['readonly' => 'readonly']])
->add('format', 'choice', ['choices' => ['pdf' => 'PDF', 'word' => 'MS Word'], 'attr' => ['readonly' => 'readonly'] ])
->add('agree', 'checkbox', ['mapped' => false, 'label' => 'I agree', 'constraints' => [new IsTrue()]])
->add('save', 'submit', ['label' => 'Submit', 'attr' => ['class' => 'btn btn-primary']])
->getForm();
}
...
ReportController
class ReportController extends Controller
{
public function indexAction(Request $request, $id)
{
$form = $this->createForm(new ReportType(), new ReportDetails());
$form->handleRequest($request);
if ($form->isValid()) {
return $this->confirmPseudoAction($id, $form);
}
return $this->render('Bundle:Report:index.html.twig', ['form'=> $form->createView()]);
}
private function confirmPseudoAction($id, \Symfony\Component\Form\Form $form)
{
$action = $this->generateUrl('form_confirm_report', ['id' => $id]);
$confirmForm = $this->createForm(new ReportConfirmType(), $form->getData(), ['action' => $action]);
return $this->render('Bundle:Report:confirm.html.twig', ['form'=> $confirmForm->createView()]);
}
public function confirmAction(Request $request, $id)
{
$form = $this->createForm(new ReportConfirmType(), new ReportDetails());
$form->handleRequest($request);
if ($form->isValid()) {
return $this->generateReport($id, $form->getData());
}
return $this->render('Bundle:Report:confirm.html.twig', ['form'=> $form->createView()]);
}
...
routing.yml
form_report:
path: /form/{id}/report
defaults: { _controller: Bundle:Report:index }
requirements:
id: \d+
form_confirm_report:
path: /form/{id}/reportConfirm
defaults: { _controller: Bundle:Report:confirm }
requirements:
id: \d+
Und das tut, was ich will! Es kann einen einfacheren Weg geben, aber ich habe es jetzt getan ...
Wenn die erste Form 'isValid()' 'dann schreiben Sie eine Session-Variable, die Ihre gewünschten Werte enthält. Suchen Sie oben in der zweiten Aktion nach den erforderlichen Sitzungsvariablen, und wenn sie nicht vorhanden oder gültig sind, leiten Sie sie zurück an die erste Stelle. – craigh
Ich bekomme es nicht leise, aber ist das was du willst? [Weiterleiten einer Anfrage von einer Controller-Methode an eine andere Controller-Methode] (http://www.inanzzz.com/index.php/post/ci2p/forwarding-a-request-from-one-controller-method-to-another- Controller-Methode) – BentCoder
Danke für die Kommentare, ich denke, sie sind beide hilfreich und wenn Sie sie als Antworten posten werde ich upvote. Ich werde auch posten, was ich am Ende getan habe, was nicht dasselbe ist, aber keine Millionen Meilen entfernt ist. – frumious