2017-01-20 5 views
1

Я пытаюсь создать многоступенчатую форму с помощью CraueFormFlow. CraueForm нужен класс гидрата, но у меня есть несколько объектов, поэтому я DIT класса addChildWizard, где все у меня есть мои необходимые объекты как свойства, как это:CraueFormBundle: создать поток формы из нескольких объектов

<?php 

    namespace VS\CrmBundle\Entity; 

    use Doctrine\Common\Collections\ArrayCollection; 
    use VS\CrmBundle\Entity\MedicalRecord; 
    use VS\CrmBundle\Entity\Person; 
    use VS\CrmBundle\Entity\Relationship; 
    use Doctrine\ORM\Mapping as ORM; 

    /** 
    * 
    * Class AddChildWizard 
    * @package VS\CrmBundle\Entity 
    */ 
    class AddChildWizard 
    { 
     /** 
     * Step 1 
     * 
     * @var Relationship 
     */ 
     protected $currenUserChildRelationship; 

     /** 
     * Step 1 
     * 
     * @var Person 
     */ 
     protected $child; 

     /** 
     * Step 2 
     * 
     * @var MedicalRecord 
     */ 
     protected $childsMedicalRecord; 

     /** 
     * Step 3 
     * 
     * This is a collection of Relationship entities 
     * 
     * @var ArrayCollection 
     */ 
     protected $childsFamily; 

     public function __construct() 
     { 
      $this->childsFamily = new ArrayCollection(); 
     } 
+ getters and setters 

Тогда у меня есть мой класс потока:

<?php 

namespace VS\CrmBundle\Form\Wizard\AddChild; 

use Craue\FormFlowBundle\Form\FormFlow; 
use Craue\FormFlowBundle\Form\FormFlowInterface; 


class AddChildFlow extends FormFlow { 
    protected function loadStepsConfig() 
    { 
     return array(
      array(
       'label' => 'ChildData', 
       'form_type' => 'VS\CrmBundle\Form\Wizard\AddChild\AddChildStep1' 
      ), 
      array(
       'label' => 'ChildMedicalRecord', 
       'form_type' => 'VS\CrmBundle\Form\Wizard\AddChild\AddChildStep2' 
      ), 
      array(
       'label' => 'ChildFamily', 
       'form_type' => 'VS\CrmBundle\Form\Wizard\AddChild\AddChildStep3' 
      ), 
      array(
       'label' => 'confirmation', 
      ), 
     ); 
    } 
} 

С одной формой для каждого шага. Например шаг 1:

<?php 

namespace VS\CrmBundle\Form\Wizard\AddChild; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use VS\CrmBundle\Entity\Person; 
use VS\CrmBundle\Entity\Relationship; 
use VS\CrmBundle\Form\PersonChildType; 
use VS\CrmBundle\Form\RelationshipFromCurrentUserType; 

class AddChildStep1 extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('currenUserChildRelationship', RelationshipFromCurrentUserType::class, array(
       'data_class' => Relationship::class 
      )) 
      ->add('child', PersonChildType::class, array(
       'data_class' => Person::class 
      )); 
    } 

    public function getBlockPrefix() 
    { 
     return 'AddChildStep1'; 
    } 
} 

И действие:

public function addChildAction() 
    { 

     // Our form data class 
     $formData = new AddChildWizard(); 

     // We call service (craue form flow) 
     $flow = $this->get('vs_crm.form.flow.add_child'); 
     $flow->bind($formData); 

     $form = $flow->createForm(); 



     if($flow->isValid($form)) 
     { 
      $flow->saveCurrentStepData($form); 

      if($flow->nextStep()) 
      { 
       $form = $flow->createForm(); 
      } 
      else 
      { 
       $child = $formData->getChild(); 
       $curentUserRel = $formData->getCurrenUserChildRelationship(); 
       $currentUser = $this->get('security.token_storage')->getToken()->getUser(); 
       $medicalRecord = $formData->getChildsMedicalRecord(); 
       $family = $formData->getChildsFamily(); 

       $curentUserRel->setSourceId($child); 
       $curentUserRel->setDestinationId($currentUser); 
       $medicalRecord->setPerson($child); 

       foreach($family as $member) 
       { 
        $member->setSourceId($child); 
       } 

       //return new JsonResponse(array($formData->getId())); 

       // flow finished 

       $em = $this->getDoctrine()->getManager(); 
       $em->persist($formData); 
       $em->flush(); 

       $flow->reset(); 

       $this->addFlash('success', 'Your child has been saved.'); 
       return $this->redirectToRoute('vs_crm_parent_dashboard'); 

      } 
     } 

     return $this->render('VSCrmBundle:Parent:add-child.html.twig', array(
      'form' => $form->createView(), 
      'flow' => $flow 
     )); 
    } 

Это прекрасно работает, но в конце концов у меня есть эта ошибка:

Класс «VS \ CrmBundle \ Entity \ AddChildWizard "не является допустимым объектом или сопоставлен суперклассом.

Так доктрина хочет сущность с @Entity аннотацией и идентификатором и наш друг Доктриной хочет сохранить идентификатор в базе данных ....

Есть ли другой способ сделать этот материал без сохранения id в базе данных, или я должен послушать нашу Другую Доктрину?

ответ

1

Хорошо, если это может помочь кому-то ...

В конце концов, я был $em->persist($formData); и вот почему Доктрина хотел, чтобы мой класс addChildWizard ($formData = new AddChildWizard();), чтобы быть объектом. Что я сделал:

$em->persist($child); 
$em->persist($curentUserRel); 
$em->persist($medicalRecord); 

foreach($family as $familyMember) 
{ 
    $em->persist($familyMember); 
} 

И теперь эта многоступенчатая форма отлично работает!