0

我正在尝试使用CraueFormFlowBundle构建多步骤表单。目前,我可以进入第一步(用户信息),但是当我点击“NEXT”按钮时出现错误。

我的第一步是基于我的User实体的表单数据类型,第二步是基于实体Etablissement(另一个实体)的另一种表单数据类型。

有我的错误信息:

表单的视图数据应该是 AppBundle\Entity\Etablissement 类的一个实例,但它是 AppBundle\Entity\User 类的一个实例。您可以通过将“data_class”选项设置为 null 或添加将 AppBundle\Entity\User 类的实例转换为 AppBundle\Entity\Etablissement 实例的视图转换器来避免此错误。

文件配置步骤:

namespace AppBundle\Form;

// AppBundle/Form/RegistrationEtablissementFlow.php
use Craue\FormFlowBundle\Form\FormFlow;
use Craue\FormFlowBundle\Form\FormFlowInterface;
use Symfony\Component\Form\FormTypeInterface;

class EnregistrementCompletFlow extends FormFlow {

    /**
     * @var FormTypeInterface
     */
    protected $formType;

    public function setFormType(FormTypeInterface $formType) {
        $this->formType = $formType;
    }

    public function getName() {
        return 'enregistrementComplet';
    }

    protected function loadStepsConfig() {
        return array(
            array(
                    'label' => 'Infos personnelles',
                    'form_type' => 'homes_user_registration', // the user's form registered as sevice
            ),
            array(
                    'label' => 'Infos établissement',
                    'form_type' => 'likabee_form_etablissement', // the etablissement's form registered as sevice
                    //'form_type' => $this->formType,
            ),
            array(
                    'label' => 'confirmation',
            ),
        );
    }
}

在我的控制器中:

/**
     * @Route("/registration-etablissement", name="registrationEtablissement")
     */
    public function registrtationEtablissementAction()
    {
        $formData = new User();
        $formData->setEtablissement( new Etablissement());

        $flow = $this->get('likabee.form.flow.enregistrementComplet'); // must match the flow's service id
        $flow->bind($formData);

        // form of the current step
        $form = $flow->createForm();
        if ($flow->isValid($form))
        {
            $flow->saveCurrentStepData($form);

            if ($flow->nextStep())
            {

                // form for the next step
                $form = $flow->createForm();
            }
            else
            {
                // flow finished

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

                $flow->reset(); // remove step data from the session

                return $this->redirect($this->generateUrl('index')); // redirect when done
            }
        }

        return $this->render('registrationEtablissement.html.twig', array(
                'form' => $form->createView(),
                'flow' => $flow,
        ));
    }

我认为当我进入第二步时,表单等待用户类型,而不是 Etablissement 类型,但我不知道如何解决这个问题......

提前致谢 ...

4

1 回答 1

2

据我了解:

CraueFormFlowBundle 的目的是将一个实体的表单分发到多个步骤(即网页)。在此处查看他们的示例代码:https ://github.com/craue/CraueFormFlowBundle/blob/master/README.md#create-an-action -$flow->bind($formData);表示实体绑定到整个流程。

为您提供可能的解决方案:

  • 更改您的模型并组合实体:-)
  • 根据您的错误消息中的提示:查看视图转换器 - 这是我在 Google 中发现的:http: //symfony.com/doc/current/cookbook/form/data_transformers.html#about-model-and-view-变压器
  • 完全放弃 CraueFormFlowBundle。如果您有两个实体和一个单独的表单,则无需将其设置为表单流。只需创建两个不同的表单并在每个表单之后保留相应的实体。
  • 看一下这个例子:http ://www.craue.de/sf2playground/en/CraueFormFlow/create-vehicle/也许用两个实体设置流毕竟是可能的。
于 2015-11-14T17:10:50.083 回答