0

以下のフォームを送信すると、テキストエリアであるフィールド 'Body' $form->getData();が呼び出されたときに $message オブジェクトにマップされません。

$request.parameters には、次の 2 つの値があることがわかります。

-フォームの値を含む配列ですが、テキストエリアの値がありません。

-テキストエリアの値を含む文字列である本文。

Body が form object の一部ではないのはなぜですか?

  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('widget_attributes') }} value="{{ value }}" class="field-email   form_field">       
     {% endblock %}
    
      {% block text_widget %}
        <input type="text" {{ block('widget_attributes') }} value="{{ value }}" class="field-name form_field">
      {% endblock %}
    
      {% block textarea_widget %}
        <textarea name="field-message" {{ block('widget_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) }}
    
4

2 に答える 2

1

メソッドの最初parameterは、FormBuilder::add()そのフィールドの名前です。クラスのプロパティと一致するはずです。なぜそれがその部分でしか機能しないのか、よくわかりませんBody。フォーム タイプを次のように変更します。

  $form = $this->createFormBuilder($message)
    ->add('name', 'text', array('required' => true))
    ->add('email', 'email')
    ->add('subject', 'text')
    ->add('body', 'textarea')
    ->getForm();

エンティティに一致するように小文字に注意してください。フィールドのラベルを変更したい場合は、config配列に設定することができます:

    ->add('body', 'textarea', array(
         'attributes' => array(
              'label' => 'Body'
         )
      )
    )

または、テンプレートを正しく変更してください:

<label>Body</label>
{{ form_widget(form.Body, { 'attr': {'placeholder': 'message' }}) }}

より明確な説明については、ドキュメントを参照してください。

于 2013-08-24T17:13:42.387 に答える
1

これ:

{% block textarea_widget %}
    <textarea name="field-message" {{ block('widget_attributes') }}  cols="45" rows="5"  class="field-message form_field">{{ value }}</textarea>
{% endblock %}

次のようにする必要があります。

{% block textarea_widget %}
    <textarea {{ block('widget_attributes') }}  cols="45" rows="5"  class="field-message form_field">{{ value }}</textarea>
{% endblock %}

つまり、name 属性を削除します。これらのテンプレートの 1 つを正常にデバッグしたのは初めてです!

于 2013-08-24T18:43:50.180 に答える