【问题标题】:Symfony 3 - subform and element nameSymfony 3 - 子表单和元素名称
【发布时间】:2017-11-16 11:57:54
【问题描述】:

我想用这样的组合模式创建表单: https://symfony.com/doc/current/form/inherit_data_option.html

我使用 Symfony 3。

它正在工作。我有像单个对象一样的每个元素并添加它。

但最后我的表单元素名称具有类似的名称

form[subform][element]

如何在名称属性中制作没有子表单的扁平结构?

use AppBundle\Base\Form\NickType;
use AppBundle\Base\Form\MailType;
use AppBundle\Base\Form\PassType;
use AppBundle\Base\Form\UserType;


class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nick', NickType::class)
            ->add('mail', MailType::class)
            ->add('password', PassType::class)
            ->add('repeat_password', PassType::class)
(etc...)

单元素

class NickType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nick', TextType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'inherit_data' => true
        ));
    }

}

【问题讨论】:

  • 请出示您的FormType。
  • @StephanVierkant 我更新了代码。谢谢你的回复。

标签: symfony symfony-forms


【解决方案1】:

如果 NickType 仅继承 TextType,则无需定义它。可以删除NickType、MailType等。

你可以这样做:

class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nick', TextType::class)
        ;
(etc...)

如果你想复用一个表单域,你必须创建一个Custom Form Field Type:

class NickType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            //...
        ));
    }

    public function getParent()
    {
        return TextType::class;
    }
}

您可以从元素名称中删除form[],但实际上不建议删除它,因为当您阅读填充表单数据的请求时,您可以通过表单名称来识别表单。 (via)

您可以将根表单的名称设置为空,然后您的字段名称 将只是形式。这样做通过

// the first argument to createNamedBuilder() is the name
$form = $this->get('form.factory')->createNamedBuilder(null, 'form', $defaultData)
    ->add('from', 'date', array(
        'required' => false,
        'widget' => 'single_text',
        'format' => 'dd.MM.yyyy'
    ));

(via)

【讨论】:

  • 是的,但将来我会以多种形式使用 nick 元素。这就是为什么我希望每个字段都有一个对象。在一个地方,我将有验证规则等......
  • 好的,但我得到了:name="register[nick]" 最后我想得到 name="nick"。谢谢!
  • 您真的想要这个有什么具体原因吗?如果它只是为了美观或你的代码:如果这样,请离开。如果还有其他技术原因:请告诉我们,也许有更好的解决方案。如果您仍然想要这个:请参阅我的更新答案。
  • 在另一个项目中我们有很多子表单,后来我们应该使用多维数组来接收数据,这并不好。所以我认为,这是主要原因。我每天都使用 Zend 框架,平面数组很好用 $row->setFromArray($data);后来 $row->save();所以这就是为什么我想在 Symfony 中这样做的原因 :) 这可能是习惯。谢谢。
  • @taro 我的回答能解决你的问题吗?如果没有,请告诉我。否则,请考虑投票和/或接受我的回答。我看你还没有投票。请参阅stackoverflow.com/help/why-vote 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2020-06-25
  • 1970-01-01
  • 2012-12-24
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多