Php 在Symfony2中编辑表单
我没有使用Doctrine的生成器,因为我认为代码很难看,因此我试图让它在我的Php 在Symfony2中编辑表单,php,forms,symfony,doctrine-orm,twig,Php,Forms,Symfony,Doctrine Orm,Twig,我没有使用Doctrine的生成器,因为我认为代码很难看,因此我试图让它在我的editAction中工作,并在我的edit.html.twig页面中呈现表单,但我无法让它工作。我试图效仿其他答案给出的其他例子,但它们也不起作用 首先,我的editAction public function editAction($id, Request $request) { $manager = $this->getDoctrine()->getManager(); $entity
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
));
}
现在,我的小树枝
{% 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 %}
{%extends'::layout.html.twig%}
{%block title%}Editar{{entity.name}{%endblock%}
{%block body%}
Editar{{entity.name}
{{form_row(entity.name)}}
{{form_row(entity.description)}}
{{form_row(entity.quantity)}}
{{form_row(entity.price)}
{{form_rest(form)}
奥特拉尔
{%endblock%}
两件事:如果我删除
{'id':entity.id}
,会显示一个错误,表示缺少一个必填字段,如果我现在这样做,它会说searchandenderblock()必须是Symfony\Component\Form\FormView
,如果不是在controller中返回$entity
,而是返回$Form->createView()
,错误表示FormView无法转换为字符串
FormView无法转换为字符串
错误可能是在尝试将实体id传递到位于{'id':entity.id}
的路径函数时引起的
对我来说,最简单的解决方案似乎是将表单传递给视图(正如您所说的那样),但要从表单
标记中删除整个操作=“{{path('panel_edit_material',{'id':entity.id}}}”
属性
如果缺少操作
属性,它将默认为当前url(如果我理解示例,这应该可以工作)
如果这不起作用,您仍然可以这样传递实体的id:{{path('panel_edit_material',{'id':form.id.vars.value}}}
。这还需要将表单传递给视图,而不是实体
希望这有帮助:)
编辑:重读时,我注意到使用了
{{entity.name}
。如果将for传递给视图,则需要将其更改为{{form.name.vars.value}
,或者只需将实体
和表单
传递给视图,这样就可以选择显示原始值或新值多亏了布莱希特的启发,我已经设法解决了这个问题
在我的例子中,解决方案是从页面中删除表单行(..)
,只留下如下内容:
<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
));