解:
我的问题的解决方案是在控制器中创建一些额外的功能,以解决我希望能够从用户的选择中“动态”更改实体和形式的问题.
public function indexAction(Request $request)
{
$form = $this->getForm($request);
$form->handleRequest($request);
return array(
'form' => $form->createView(),
'request' => $request->request,
);
}
getForm检索表单的位置(例如,车辆的AdvertVehicleType或“默认”广告的AdvertType).
getForm方法如下所示:
private function getForm(Request $request)
{
$categoryTitle = 'NONE';
$categoryId = $request->request->get('advert', false)['category'];
if ($categoryId) {
$categoryTitle = $this->getDoctrine()->getRepository('Bundle:Category')->find($categoryId)->getTitle();
}
return $this->createForm($this->getFormType($categoryTitle), $this->getEntity($categoryTitle));
}
在这里,我检索categoryID(在请求中的表单中选择),并使用getFormType和具有getEntity的实体检索formType.
private function getEntity($categoryTitle)
{
$entity = new Advert();
switch ($categoryTitle) {
case Category::CARS:
$entity = new AdvertCar();
}
return $entity;
}
private function getFormType($categoryTitle)
{
switch ($categoryTitle) {
case Category::CARS:
return new AdvertCarType();
default:
return new AdvertType();
}
}
为了能够使用ajax“动态”更新这个(但是如果用户尝试提交表单,它也可以工作)我在控制器中创建了另一个动作.
这个动作呈现了我想要更新的表单部分(在ajax调用上),我通过实际选择表单中使用twig设置表单对象来呈现我不需要的内容,如下所示:
{% do form.title.setRendered %}
(这只是一个例子,我实际上是为所有我不想渲染的表单对象执行此操作.
然后我只是打电话:
{{ form_rest(form) }}
这将检索表单的“休息”,这对于不同的类别是不同的.
现在让我们说你有州和城镇可供选择.首先选择状态,然后在树枝中渲染该状态的城镇(但实际上你可以只渲染你需要的部分,例如{{form_row(form.towns)}},然后将这个渲染的模板作为json响应返回用jquery把它放在你想要的div中.
$html = $this->renderView('@Bundle/NewAddPage/filter_area.twig', array('form' => $form->createView()));
然后在响应中返回$html变量.
我希望这会有所帮助,并且解释是足够好的,如果不是只是发表评论,我会用我的答案更新这个!