Symfony2:表单提交返回表格
问题描述:
我正在尝试编辑窗体中的实体。如果实体的名称是“我的实体”,则表单看起来与常规不同,名称字段被禁用,并且没有“删除”按钮。当我提交常规实体编辑表单时,它工作正常。但是,当我尝试提交更改为“我的实体”,它返回的形式Symfony2:表单提交返回表格
这是我的编辑形式树枝:
<div class="collection-create">
<h3>Edit a collection</h3>
<form id="edit-form" method='POST' action="{{ path('edit_entity', {'id': entity.id}) }}">
{% if entity.name == 'My entity' %}
{{ form_row(form.name, { 'attr':{'disabled':'disabled'} }) }}
{% else %}
{{ form_row(form.name) }}
{% endif %}
{% if entity.name != 'Saved for later' %}
<a class="button">Delete</a>
{% endif %}
<button type="submit"onclick="editCollection('{{ entity.id }}')">Save</button>
</form>
控制器
/**
* @Route("/edit/{id}", name="edit_entity")
* @Template()
*/
public function editAction(Entity $entity, Request $request)
{
$form = $this->createForm(new EntityType(), $entity, array(
'action' => $this->generateUrl('edit_entity',['id' => $entity->getId()]),
'method' => 'POST'));
$form->handleRequest($request);
if ($form->isValid() && $form->isSubmitted()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->render('@Entity/Entity/submit.html.twig', array(
'entity' => $entity));
}
return array('entity'=>$entity, 'form' => $form->createView());
}
答
只是加法令牌,它现在的作品
{% if entity.name == 'My entity' %}
{{ form_row(form.name, { 'attr':{'disabled':'disabled'} }) }}
{% else %}
{{ form_row(form.name) }}
{% endif %}
{{ form_row(form._token) }}
答
浏览器不提交禁用的表单元素。所以你的$ form-> isValid()失败了,因为它期望并且没有得到一个。您可以在浏览器上按F12并确认实际提交的内容。因此,您的控制器代码只是通过并重新呈现窗体,而不是像通常那样重定向。
而不是禁用,你可以使用只读。这会让用户更改价值并使其变得更加困难(尽管绝不可能)。
最好的方法是在Symfony中定义表单时设置disabled属性。通过这样做,symfony将为您处理事情。根本不需要额外的逻辑。但是,由于您希望根据实体中的值完成此操作,因此您需要使用表单事件系统来实现此功能。我不会尝试,因为我怀疑只读会为你工作在这里透露细节,但你可以找到更多的信息:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html
你是什么意思与“它返回表单”?那部分的代码是怎样的? – xabbuh
请向您的控制器提交您的表格。 – DerStoffel