我试图用creeformflowbundle建立一个多步骤表单。目前,我可以进入第一步(用户信息),但是当我点击"下一步"按钮时,我有一个错误。
我的第一步是基于我的User实体的表单数据类型,第二步是基于实体建立(另一个实体)的另一个表单数据类型。
有我的错误信息:
表单的视图数据应该是类AppBundleEntityEtablissement的一个实例,但是它是类AppBundleEntityUser的一个实例。你可以将"data_class"选项设置为null,或者添加一个视图转换器,将类AppBundleEntityUser的实例转换为AppBundleEntityEtablissement的实例,从而避免此错误。
文件配置步骤:
namespace AppBundleForm;
// AppBundle/Form/RegistrationEtablissementFlow.php
use CraueFormFlowBundleFormFormFlow;
use CraueFormFlowBundleFormFormFlowInterface;
use SymfonyComponentFormFormTypeInterface;
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',
),
);
}
}
In my controller:
/**
* @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,
));
}
我认为,当我要到第二步,表单等待一个用户类型,而不是一个建立类型,但我不知道如何解决这个…
据我所知:
CraueFormFlowBundle的目的是在多个步骤(即网页)上分发一个实体的表单。参见他们的示例代码:https://github.com/craue/CraueFormFlowBundle/blob/master/README.md#create-an-action -$flow->bind($formData);
表示实体绑定到整个流程。
可能的解决方案:
- 更改模型并合并实体:-)
- 从你的错误信息提示:看看视图变形-这是我发现与谷歌:http://symfony.com/doc/current/cookbook/form/data_transformers.html#about-model-and-view-transformers
- 删除CraueFormFlowBundle。如果您有两个实体,并且每个实体都有一个单独的表单,那么就没有必要将其设置为表单流。只需创建两个不同的表单,并在每个表单之后保存各自的实体。
- 看看这个例子:http://www.craue.de/sf2playground/en/CraueFormFlow/create-vehicle/也许用两个实体设置流是可能的。