我有一个控制器动作,提示用户输入一些自由文本。提交时,文本被解析为一些我希望在另一个表单上放置的对象,以便用户确认初始解析是否正确完成。
通常在处理对表单提交的响应之后,我们会调用$this->redirectToRoute()
去其他路径,但是我将所有这些对象放在我想要使用的地方。如果我从其他地方重定向,我会失去它们。
我该如何保留它们?我尝试在控制器操作方法中构建我的新表单但是它的提交似乎没有得到正确处理。
/**
* @Route( "/my_stuff/{id}/text_to_objects", name="text_to_objects" )
*/
public function textToObjects( Request $request, Category $category ) {
$form = $this->createForm( TextToObjectsFormType::class, [
'category' => $category,
]);
$form->handleRequest( $request );
if( $form->isSubmitted() && $form->isValid() ) {
$formData = $form->getData();
$allTheStuff = textParserForStuff( $formData['objectText'] );
$nextForm = $this->createForm( StuffConfirmationFormType::class, $allTheStuff );
return $this->render( 'my_stuff/confirmation.html.twig', [
'form' => $nextForm->createView(),
'category' => $category,
] );
}
return $this->render( 'my_stuff/text.html.twig', [
'form' => $form->createView(),
'category' => $category,
] );
}
这样可以很好地显示确认表单,但是当我提交该表单时,我最终会显示原始的 TextToObjects 表单?
要回答albert的问题, TextToObjectsFormType 只有三个字段,一种设置日期和方式的方法。生成对象组的时间,选择对象原点的方法和文本描述的文本区域。我没有设置data_class,所以我得到了一个带有提交信息的关联数组。
class TextToObjectsFormType extends AbstractType {
public function buildForm( FormBuilderInterface $builder, array $options ) {
$builder
->add( 'textSourceDateTime', DateTimeType::class, [
'widget' => 'single_text',
'invalid_message' => 'Not a valid date and time',
'attr' => [ 'placeholder' => 'mm/dd/yyyy hh:mm',
'class' => 'js-datetimepicker', ],
])
->add( 'objectsOrigin', EntityType::class, [
'class' => ObjectSourcesClass::class,
])
->add( 'objectText', TextareaType::class, [
'label' => 'Copy and paste object description text here',
]);
}
}
如何将已确认的,可能已修订的对象恢复到数据库中?
感谢。
答案 0 :(得分:0)
使用您当前的架构
$nextForm = $this->createForm( StuffConfirmationFormType::class, $allTheStuff );
没有足够的信息。它应该包含action参数,以告知提交到post请求的路由。
在StuffConfirmationFormType中添加隐藏的“objectText”字段。
confirmation_stuff
路径TextToObjectsFormType
text_to_objects
请注意,使用此技术不会阻止用户通过手动编辑隐藏字段来输入非功能数据。
希望这有帮助