2013-08-24 45 views
1

我是Symfony2的新手,現在我正在嘗試構建表單。我有一個類Message,表單中的數據應該創建一個Message對象。Symfony2:生成表單的HTML5屬性

我的問題是字段不是必需的,雖然我在調用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) }} 
    
+0

所以我只想澄清,你做你自己的表單域模板?它使用默認模板按需運行? – Cerad

+0

我不知道它是否可以使用默認模板 - 我需要一個自定義的模板,所以我甚至沒有嘗試過使用默認的 – Sam

+0

。我從來沒有太多的運氣搞亂字段模板。要好奇看到解決方案。正如@ mansoulx的答案所顯示的那樣,您詢問自定義字段模板並不明顯。我幾乎發佈了同樣的答案。可能考慮將事情縮減到一個領域,並明確實際問題是什麼。 – Cerad

回答

1

您的表單模板主題化有一個錯誤。該塊被稱爲widget_attributes

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

非常好,看到它做得很好!謝謝。 – Sam

1

required屬性在虛假所有非必需的列,並添加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(); 
+0

,沒有任何區別。提交表單時未檢測到必填字段,並且未顯示佔位符。 – Sam

+0

您使用兼容的HTML5瀏覽器嗎?你能告訴我你的瀏覽器檢查器顯示在html輸出中嗎?或者在你的瀏覽器中使用CTRL + U(顯示源代碼)! –

+0

最新版本的Chrome。就像我說的,電子郵件驗證器被觸發,但不是所需的驗證器。這是因爲'required'屬性不會被添加到HTML輸入中。 – Sam