Symfony表单添加字段,不带前缀

时间:2016-12-07 12:32:47

标签: symfony symfony-forms symfony-2.8

我想在我的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')访问它。因为我的表单名称是动态的,我无法访问该数组。

这可能吗?

2 个答案:

答案 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