提交以下表单时,当调用$form->getData();
时,作为文本区域的字段"Body"不会映射到$message对象。
我可以在$request.parameters中看到有两个值:
-表单,这是一个包含表单值的数组,但缺少textarea值。
-Body,它是一个包含文本区域值的字符串。
为什么Body不是表单对象的一部分?
-
控制器动作:
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())); } }
-
消息类别:
class Message { protected $name; protected $subject; protected $body; protected $email; + setters and getters here }
-
表单模板
{# 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 %}
-
表单视图
<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) }}
这:
{% 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属性。我第一次成功调试这些模板!
FormBuilder::add()
方法的第一个parameter
是该字段的名称。它应该与类的属性相匹配。我不太清楚为什么它只对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' }}) }}
请参阅文档以获得更清晰的解释。