1

CraueFormFlow で複数ステップのフォームを作成しようとしています。CraueForm にはハイドレートするためのクラスが必要ですが、いくつかのエンティティがあるため、次のようなプロパティとして必要なエンティティがすべて含まれる addChildWizard クラスを削除します。

    <?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 つのフォームを使用。たとえば、ステップ 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" は、有効なエンティティまたはマップされたスーパー クラスではありません。

doctrine は @Entity アノテーションと Identifier を持つエンティティを必要とし、友人の Doctrine は識別子をデータベースに保存したいと考えています ....

データベースにIDを保存せずにこれを行う別の方法はありますか、それとも友人の Doctrine に耳を傾ける必要がありますか?

4

1 に答える 1