我对symfony2很新,所以在处理表单时我可能不了解一些重要细节...... 如何在页面呈现后在客户端为表单设置实体?
在我的页面上,我有几种产品和表格。我需要通过点击选择我要编辑的产品。所以我需要修改客户端的表单数据。这是我的简化模板代码:
<div class="product" onclick="editFormProduct({
id: '{{ product1.id }}',
name: '{{ product1.name }}'
price: '{{ product1.price }}'
})">
<span>{{ product1.name }}</span>
<span>{{ product1.price }}</span>
</div>
<div class="product" onclick="editFormProduct({
id: '{{ product2.id }}',
name: '{{ product2.name }}'
price: '{{ product2.price }}'
})">
<span>{{ product2.name }}</span>
<span>{{ product2.price }}</span>
</div>
{{ form_start(form, {'attr': {'id': 'form-product'}}) }}
{{ form_widget(form.name) }}
{{ form_widget(form.price) }}
{{ form_end(form) }}
<script type="text/javascript">
function editFormProduct(product) {
$('#form-product').find('input[id=form_id]').val(product.id);
$('#form-product').find('div[name=name] input').val(product.name);
$('#form-product').find('div[name=price] input').val(product.price);
}
</script>
但是当我尝试提交时,我收到一个错误:&#34;属性&#34; id&#34;也不是其中一种方法&#34; addId()&#34; /&#34; removeId()&#34;,&#34; setId()&#34;,&#34; id()&# 34;,&#34; __ set()&#34;或&#34; __ call()&#34;在课堂上存在并拥有公共访问权限#34; AppBundle \ Entity \ Product&#34;
任何帮助将不胜感激。
答案 0 :(得分:0)
好吧,我至少找到了解决方案。不确定它是否是最干净的,但它确实有效。要在客户端选择动态编辑对象,您需要执行以下简单步骤:
表单提交后,使用此字段中的id从DB获取所需对象并对其应用更改。 这是一个控制器样本:
class DefaultController extends Controller
{
public function indexAction(Request $request)
{
$repository = $this->getDoctrine()->getRepository('AppBundle:Product');
//when the form is submitted, get edit_id
//probably there is a better way to get the form data
//before creating the $form object...
if ($request->request->get('form') != null)
$editedProduct = $repository->find($request->request->get('form')['edit_id'] - 1);
else
$editedProduct = new Product();
$form = $this->createFormBuilder($editedProduct)
->add('name', 'text')
->add('price', 'text')
//hidden field that will store the id of the edited object
//must not to be mapped, as it doesn't belong to the entity
->add('edit_id', 'hidden', array('mapped' => false));
$form->handleRequest($request);
...
}
}
相应的模板样本几乎等于原始样本:
<div class="product" onclick="editFormProduct({
id: '{{ product1.id }}',
name: '{{ product1.name }}'
price: '{{ product1.price }}'
})">
<span>{{ product1.name }}</span>
<span>{{ product1.price }}</span>
</div>
<div class="product" onclick="editFormProduct({
id: '{{ product2.id }}',
name: '{{ product2.name }}'
price: '{{ product2.price }}'
})">
<span>{{ product2.name }}</span>
<span>{{ product2.price }}</span>
</div>
{{ form_start(form, {'attr': {'id': 'form-product'}}) }}
{{ form_widget(form.name) }}
{{ form_widget(form.price) }}
{{ form_end(form) }}
<script type="text/javascript">
function editFormProduct(product) {
//fill the edit_id field with the chosen product id
$('#form-product').find('#form_edit_id').val(product.id);
$('#form-product').find('#form_name').val(product.name);
$('#form-product').find('#form_price').val(product.price);
}
</script>