我没有使用Doctrine的生成器,因为我觉得代码很难看,所以我试图让它工作我的editAction
并在我的edit.html.twig
页面中呈现表单,但是我无法做到工作。我试着按照其他答案给出的其他例子,但它们也没有用。
首先,我的editAction
。
public function editAction($id, Request $request)
{
$manager = $this->getDoctrine()->getManager();
$entity = $manager->getRepository('PanelBundle:Material')->find($id);
if (!$entity) {
throw $this->createNotFoundException('O material procurado não está cadastrado');
}
$form = $this->createForm(new MaterialType());
$form->handleRequest($request);
if ($request->getMethod() == 'POST') {
$form->submit($request);
if ($form->isValid()) {
$manager->merge($entity);
$manager->flush();
$this->addFlash('success', 'Material alterado');
return $this->redirect($this->generateUrl('panel_materials'));
}
}
return $this->render('PanelBundle:Material:edit.html.twig', array(
'entity' => $entity
));
}
现在,我的Twig
{% extends '::layout.html.twig' %}
{% block title %}Editar {{ entity.name }}{% endblock %}
{% block body %}
<div class="container">
<h1>Editar {{ entity.name }}</h1>
<form action="{{ path('panel_edit_material', { 'id': entity.id }) }}" method="POST">
<div class="form-group">
{{ form_row(entity.name) }}
</div>
<div class="form-group">
{{ form_row(entity.description) }}
</div>
<div class="form-group">
{{ form_row(entity.quantity) }}
</div>
<div class="form-group">
{{ form_row(entity.price) }}
</div>
{{ form_rest(form) }}
<button type="submit" class="btn btn-success">Alterar</button>
</form>
</div>
{% endblock %}
两件事:如果我删除了{ 'id': entity.id }
,则会显示一条错误,说明缺少必填字段,如果我现在就这样,它会显示searchAndRenderBlock() must be an instance of Symfony\Component\Form\FormView
,而不是返回{在控制器中{1}},并返回$entity
,错误显示为$form->createView()
答案 0 :(得分:0)
尝试将实体ID传递给FormView could not be converted to string
处的路径函数时,可能会导致{ 'id': entity.id }
错误。
对我来说最简单的解决方案似乎是将表单传递给视图(正如您所说的那样),但要从action="{{ path('panel_edit_material', { 'id': entity.id }) }}"
标记中删除整个form
属性。
如果缺少action
属性,它将默认为当前网址(如果我理解该示例,则应该有效)。
如果这不起作用,您仍然可以通过这种方式传递实体的ID:{{ path('panel_edit_material', { 'id': form.id.vars.value }) }}
。这还要求您将表单传递给视图而不是实体。
希望这会有所帮助:)
修改:重新阅读后,我注意到{{ entity.name}}
的使用。如果您将for传递给视图,则需要将其更改为{{ form.name.vars.value }}
,或者只需将entity
和form
传递给视图,这样您就可以选择显示原始值或新值
答案 1 :(得分:0)
由于布莱希特的启蒙,我设法解决了这个问题。
我的解决方案就是从页面中删除form_row(..)
,只留下这样:
<form action="{{ path('panel_edit_material', { 'id': entity.id }) }}" method="POST">
<div class="form-group">
{{ form_rest(form) }}
</div>
<button type="submit" class="btn btn-success">Alterar</button>
</form>
在控制器中:
$form = $this->createForm(new MaterialType(), $entity);
和
return $this->render('PanelBundle:Material:edit.html.twig', array(
'form' => $form->createView(),
'entity' => $entity
));
就是这样。