2016-07-10 7 views
0

Ich hatte Mühe, auszudrücken, was ich im Titel der Frage meine! Ich werde mein Bestes tun, um hier mehr Sinn zu machen ...Kann eine Symfony 2 Action zunächst nur von einer anderen Action aus zugänglich gemacht werden?

Symfony 2.7

ich ein Formular habe, das, wenn sie vorgelegt und validiert erfolgreich würde Ich mag in ein zweites, unabhängiges Formular ernähren, für weitere Benutzeraktivität Ich möchte, dass Anfangswerte in der zweiten Form von der ersten bereitgestellt werden, aber diese zweite Form dann unabhängig ist, z. Es kann eigene separate Eingabe-/Validierungsschritte durchlaufen.

Ich will nicht:

  • es möglich sein, dass ein Benutzer gerade in die zweite Form gehen
  • auf Werte für die zweite Form als Abfragezeichenfolgeflag Parameter
  • passieren zu müssen Javascript verwenden diese
  • zu erreichen Daten an eine DB in der ersten Form bestehen bleiben und nach oben in den zweiten

Konzeptionell holen, Ich möchte in der Lage sein, das erste Formular zu validieren und dann im Controller die empfangenen Daten an eine andere Aktion zu übergeben, die dem Benutzer das neue Formular zeigen würde. Weitere Benutzereingaben würden dann von der neuen Aktion bearbeitet. Ich denke, das sollte möglich sein, ich bin mir nicht sicher, wie ich das erreichen kann! In gewisser Weise möchte ich, dass die zweite Aktion privat ist, aber sie muss öffentlich sein, damit das zweite Formular eingereicht werden kann. Ich möchte in der Lage sein, Daten mit einem Objekt direkt an die zweite Aktion zu übergeben, aber ich möchte diesen Einstiegspunkt nicht als Standardroute verfügbar machen.

Vielen Dank im Voraus.

+1

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

+1

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

+0

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

Antwort

0

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 ...