提交下面的表单时,调用$form->getData();
时,作为textarea的字段'Body'不会映射到$ message对象。
我可以在$ request.parameters中看到有两个值:
-form,它是一个包含表单值的数组,但缺少textarea值。
-Body,这是一个包含textarea值的字符串。
为什么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) }}
答案 0 :(得分: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' }}) }}
有关更明确的解释,请参阅the docs。
答案 1 :(得分: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属性。我第一次成功调试了其中一个模板!