2016-01-06 127 views
0

我正在尝试编辑窗体中的实体。如果实体的名称是“我的实体”,则表单看起来与常规不同,名称字段被禁用,并且没有“删除”按钮。当我提交常规实体编辑表单时,它工作正常。但是,当我尝试提交更改为“我的实体”,它返回的形式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()); 
} 
+0

你是什么意思与“它返回表单”?那部分的代码是怎样的? – xabbuh

+0

请向您的控制器提交您的表格。 – DerStoffel

回答

0

只是加法令牌,它现在的作品

{% if entity.name == 'My entity' %} 
    {{ form_row(form.name, { 'attr':{'disabled':'disabled'} }) }} 
{% else %} 
    {{ form_row(form.name) }} 
{% endif %} 
{{ form_row(form._token) }} 
2

浏览器不提交禁用的表单元素。所以你的$ form-> isValid()失败了,因为它期望并且没有得到一个。您可以在浏览器上按F12并确认实际提交的内容。因此,您的控制器代码只是通过并重新呈现窗体,而不是像通常那样重定向。

而不是禁用,你可以使用只读。这会让用户更改价值并使其变得更加困难(尽管绝不可能)。

最好的方法是在Symfony中定义表单时设置disabled属性。通过这样做,symfony将为您处理事情。根本不需要额外的逻辑。但是,由于您希望根据实体中的值完成此操作,因此您需要使用表单事件系统来实现此功能。我不会尝试,因为我怀疑只读会为你工作在这里透露细节,但你可以找到更多的信息:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html