【问题标题】:Symfony form add field without prefixSymfony 表单添加不带前缀的字段
【发布时间】:2017-04-22 09:42:12
【问题描述】:

我想要一个不带前缀的 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-&gt;request-&gt;get('someValue') 访问它。因为我的表单名称是动态的,所以我无法访问数组。

这可能吗?

【问题讨论】:

  • 虽然大多数事情都是可能的,但这会让你扯掉你的头发。前缀用于通过handleRequest 映射发布的数据。你真的不能让它消失并期望表单组件能够工作。我没有完全遵循您的用例,但如果它是不需要由表单组件处理的只读值,您可能只是在您的 twig 模板中发出 html 代码。
  • @Cerad 如前所述,前端不是捆绑包的一部分,我不希望每个表单主题创建者每次创建表单时都需要添加此值。

标签: symfony symfony-forms symfony-2.8


【解决方案1】:

是的,你可以。看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"

但是,如果您找到更好的解决方案(最好是合适的解决方案),请告诉我们。

【讨论】:

  • 我不想集成一个 csrf 令牌,我只想要一个没有“前缀”的隐藏字段。使用$request-&gt;request-&gt;get('someValue') 访问它。将重命名该字段以使其更清晰。
【解决方案2】:

我不知道这是否可能(我猜不可能)。可以通过使用FormTypegetName() 方法解决您的问题吗?示例:

// Controller
$form = $this->createForm(YourType::class, $yourObject);
// Get all parameters related to the form
$data = $request->request->get($form->getName());
// Output 'someValue'
echo $data['someValue'];

【讨论】:

  • 表单是动态构建的,需要$request-&gt;request-&gt;get('someValue'); 才能创建。表单的名称未知,因为它也是动态的。
猜你喜欢
  • 2014-06-23
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2020-10-28
  • 1970-01-01
相关资源
最近更新 更多