我的应用程序由可以拥有许多设备的区域组成。
查看 Zone 时,需要为 Zone 中的每个 Device 显示一个控件。
每个设备都是完全独立的,因此将设备表单嵌入区域表单似乎没有必要——我只想一次处理对一个设备的更改。
目前我正在为每个设备创建一个表单并将它们传递给区域视图模板:
public function viewAction($zone_id)
{
$zone = $this->getZoneById($zone_id);
$forms = array();
foreach ($zone->getDevices() as $device) {
$forms[] = $this->createForm(new DeviceType(), $device)->createView();
}
return $this->render('AcmeBundle:Zones:view.html.twig', array('zone' => $zone, 'deviceForms' => $forms));
}
然后在视图模板中,我遍历表单:
{% for form in deviceForms %}
{% include 'AcmeBundle:Devices:control.html.twig'
with {'zone':zone, 'form':form}
%}
{% endfor %}
这似乎工作正常,但我真的需要根据设备的“类型”更改呈现的模板。最干净的方法是什么?我可以做类似的事情:
{% if form.vars.data.type == 'foo' %}
{% include 'AcmeBundle:Devices:control-foo.html.twig'
with {'zone':zone, 'form':form}
%}
{% elseif form.vars.data.type == 'bar' %}
{% include 'AcmeBundle:Devices:control-bar.html.twig'
with {'zone':zone, 'form':form}
%}
{% endif %}
但这似乎在模板中加入了太多逻辑?以某种方式将模板分配给表单对象会更好,但我不知道这是否可能?