【问题标题】:Symfony2: HTML5 attributes for generated formSymfony2:生成表单的 HTML5 属性
【发布时间】:2013-08-24 11:46:31
【问题描述】:

我是 Symfony2 的新手,我现在正在尝试构建一个表单。我有一个 Message 类,表单中的数据应该创建一个 Message 对象。

我的问题是字段不是必需的,尽管我在调用 createFormBuilder 时在控制器下面明确指定了它。

然而,电子邮件的 HTML5 验证器被触发。

第二个问题是占位符属性不起作用。它只是没有添加到字段中,虽然我已经在视图中设置了它。

  1. 控制器动作:

    class ContactController extends Controller {
    
    public function indexAction(Request $request) {
      $message = new Message();
    
      $form = $this->createFormBuilder($message)
            ->add('Name', 'text', array('required' => true))
            ->add('Email', 'email')
            ->add('Subject', 'text')
            ->add('Body', 'textarea')
            ->getForm();
    
      $form->handleRequest($request);
    
       if ($form->isValid()) {
        // data is an array with "name", "email", and "message" keys
        $data = $form->getData();
       }
    
       return $this->render('PhotographPhotoBundle:Contact:index.html.twig', array('form' => $form->createView()));
     }
    }
    
  2. 消息类:

    class Message
    {
       protected $name;
       protected $subject;
       protected $body;
       protected $email;
       + setters and getters here
    }
    
  3. 表单模板

     {# src/Photograph/PhotoBundle/Resources/views/Form/fields.html.twig #}
    
      {% block field_row %}
       {% spaceless %}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
       {% endspaceless %}
      {% endblock field_row %}
    
     {% block email_widget %}
        <input type="email" {{ block('attributes') }} value="{{ value }}" class="field-email   form_field">       
     {% endblock %}
    
      {% block text_widget %}
        <input type="text" {{ block('attributes') }} value="{{ value }}" class="field-name form_field">
      {% endblock %}
    
      {% block textarea_widget %}
        <textarea name="field-message" {{ block('attributes') }}  cols="45" rows="5"  class="field-message form_field">{{ value }}</textarea>
      {% endblock %}
    
  4. 表单视图

         <form action="{{ path('PhotographPhotoBundle_contact') }}" method="post" class="feedback_form" >
    
                                    {{ form_errors(form) }}                                       
    
                                    {{ form_widget(form.Name) }}
                                            <div class="clear"></div>
                                    {{ form_widget(form.Email, { 'attr': {'placeholder': 'email' }}) }}
                                            <div class="clear"></div>
                                    {{ form_widget(form.Subject, { 'attr': {'placeholder': 'sujet' }}) }}
                                            <div class="clear"></div>
                                    {{ form_widget(form.Body, { 'attr': {'placeholder': 'message' }}) }}
                                            <div class="clear"></div>    
                                    <input value="envoyer votre message" type="submit"  class="feedback_go" />
                                            <div class="ajaxanswer"></div>
                                       {{ form_end(form) }}
    

【问题讨论】:

  • 所以为了澄清,您制作了自己的表单字段模板?使用默认模板,这一切都可以正常工作吗?
  • 我不知道它是否可以使用默认模板 - 我需要一个自定义模板,所以我什至没有尝试使用默认模板
  • 很公平。我从来没有太多运气弄乱字段模板。好奇地看到解决方案。正如@mansoulx 的回答所示,您询问自定义字段模板并不是很明显。我几乎发布了相同的答案。可能会考虑将事情减少到一个领域并明确实际问题是什么。

标签: php html forms symfony


【解决方案1】:

您的表单主题模板中有错误。该块被称为widget_attributes

{% block text_widget %}
    <input type="text" {{ block('widget_attributes') }} value="{{ value }}" class="field-name form_field">
{% endblock %}

【讨论】:

    【解决方案2】:

    将所有非必需列的 required 属性设置为 false,并添加 attr 属性以添加占位符

    $form = $this->createFormBuilder($message)
        ->add('Name', 'text', array('required' => false))
        ->add('Email', 'email', array('required' => false, 'attr' => array('placeholder' => 'some text here')))
        ->add('Subject', 'text')
        ->add('Body', 'textarea')
        ->getForm();
    

    【讨论】:

    • 那没有任何区别。提交表单时未检测到必填字段且未显示占位符。
    • 您使用的是兼容的 HTML5 浏览器吗?你能告诉我browser inspector 在 html 输出中显示了什么吗?或 CTRL + U (show source) 在您的浏览器中!
    • 最新版本的 Chrome。就像我说的,电子邮件验证器被触发,但不是必需的验证器。那是因为 'required' 属性没有被添加到 HTML 输入中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多