【问题标题】:Symfony render required on TextField trueTextField 需要 Symfony 渲染 true
【发布时间】:2017-04-08 12:53:52
【问题描述】:

我不明白为什么这个子表单的渲染没有在我的TextType firstName 上渲染required 标签;

我的表单基于 Order 实体
OrderFormType 的 CollectionType 为 Tent,基于 TentFormType
TentFormType 的 CollectionType 为 Camper,基于 @987654329 @

所以订购 > 帐篷 > 露营者

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
//...

class CamperFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('firstName', TextType::class, [
            'required' => true, //Should even not been usefull since SF2.8
            'label'    => 'First name',
            'attr'     => [
                'placeholder' => 'First name'
            ],
        ]);

        //...
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class'      => 'AppBundle\Entity\Camper',
            'csrf_protection' => true,
            'error_bubbling'  => true,
            'csrf_field_name' => '_token',
            //...
        ]);
    }
}

这些字段只是使用 form_widget 呈现:

{{ form_widget(form.firstName) }}
{{ form_widget(form.lastName) }}

但那不添加required字段:

<input id="app_order_form_type_tents_0_campers_0_firstName" name="app_order_form_type[tents][0][campers][0][firstName]" placeholder="First name" class="form-control" type="text">
<input id="app_order_form_type_tents_0_campers_0_lastName" name="app_order_form_type[tents][0][campers][0][lastName]" placeholder="Last name" class="form-control" type="text">

我可以的

{{ form_widget(form.firstName, {'attr': {'required': 'required'}}) }}
{{ form_widget(form.lastName, {'attr': {'required': 'required'}}) }}

但我的 FormType 不需要它...

有人知道为什么吗?

--编辑--

我的Camper 实体

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Camper.
 *
 * @ORM\Table(name="camper")
 * @ORM\Entity()
 */
class Camper
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     * @Assert\NotBlank()
     *
     * @ORM\Column(name="firstName", type="string", length=255, nullable=false)
     */
    private $firstName;

    // ...

}

【问题讨论】:

  • 你可以在这里粘贴你的实体吗?
  • 刚刚做到了:)!

标签: symfony


【解决方案1】:

对不起,我不能使用 cmets 所以我在这里提出一个建议...... 试试:

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

【讨论】:

  • 我已经有form_startform_end form_widget(form) 会将我的所有字段呈现在同一个地方,这不是我想要的。
  • 占位符需要在 attr 中?
  • 由于您的实体中有 @Assert\NotBlank(),也许您可​​以省略 required 。
  • 确实如此,但用户可以提交表单而不填写它而且这对用户不友好 要求是 HTML5 验证。 Assert\NotBlank 是我想同时获得的后端验证。问题不在于如何获取必填字段,我可以使用{{ form_widget(form.firstName, {'attr': {'required': 'required'}}) }} 获得它,问题是“为什么它没有默认呈现而应该呈现?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2014-11-25
  • 2017-10-25
  • 1970-01-01
相关资源
最近更新 更多