Symfony2:表单提交返回表单

时间:2016-01-06 13:03:09

标签: php forms symfony

我正在尝试在表单中编辑实体。如果实体的名称是“我的实体”表单看起来与常规不同,则名称字段将被禁用,并且没有“删除”按钮。当我提交常规实体编辑表单时,它工作正常。但是当我尝试向“我的实体”提交更改时,它会返回表单

这是我的编辑树枝:

<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());
}

2 个答案:

答案 0 :(得分:2)

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

您可以使用readonly而不是禁用。这将使用户更难(但绝不是不可能)更改值,但仍然会发布。

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

答案 1 :(得分:0)

刚刚添加了令牌,现在可以正常使用

this.AddInterceptor(new NVarcharInterceptor());