我想在我的symfony表单中有一个没有前缀的隐藏字段。此字段存储我在侦听器中重新创建表单类型所需的一些信息。我不想迭代所有$request
参数来获得正确的表单,所以我想添加没有任何前缀的简单字段。这需要在表单构建器中处理,因为前端不是捆绑包的一部分。
当前的简化代码:
$builder->add('firstName'; TextType::class);
$builder->add('lastName'; TextType::class);
// ...
// field without prefix
$builder->add('someValue', HiddenType::class, ['mapped' => false]);
预期结果:
<input type="text" name="form_name[firstName]" />
<input type="text" name="form_name[lastName]" />
<!-- ... -->
<input type="hidden" name="someValue" /> <!-- without prefix -->
问题是我需要使用$request->request->get('someValue')
访问它。因为我的表单名称是动态的,我无法访问该数组。
这可能吗?
答案 0 :(得分:0)
是的,你可以。看here
示例:
use Symfony\Component\OptionsResolver\OptionsResolver;
class TaskType extends AbstractType
{
// buildForm() method: add your fields here
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Task',
'csrf_protection' => true,
'csrf_field_name' => 'formKey',
// a unique key to help generate the secret token
'csrf_token_id' => 'task_item',
));
}
// ...
}
<强> LE 强>
我稍微挖了一下,以了解更多关于这个问题的信息。而且我找不到仅覆盖特定表单字段的name
属性的正确方法。所以我最终得到了:
1。
为该字段添加新属性name
,但最终会有两个name
属性,我没有测试以查看将使用哪个属性。我猜第一个。
{{ form_row(form.someValue, { attr:{ name:'someValue' } } }}
//This will look like:
<input type="hidden" id="category_someValue" name="category[someValue]" name="someValue" />
如果您查看源页面,您会看到红色的最后一个name
属性。我猜不太好。
2。
在Type类中使用getBlockPrefix()
方法,该方法将覆盖整个表单前缀:
// AppBundle/Form/FormType.php
public function getBlockPrefix()
{
return ''; // return an empty string here
}
现在删除为您的字段添加的attr
,并将其放入:
{{ form_row(form.someValue) }}
但是现在所有表单字段都不再具有form_name[first_name]
名称属性,而只是name="first_name"
。因此,您的隐藏字段将包含:name="someValue"
。
但是,请告诉我们您是否找到了更好的解决方案(理想情况下是正确的解决方案)。
答案 1 :(得分:0)
我不知道这是否可行(我猜不是)。您可以使用getName()
的{{1}}方法解决问题吗?例如:
FormType