私のアプリは、多くのデバイスを持つことができるゾーンで構成されています。
ゾーンを表示する場合、ゾーン内の各デバイスのコントロールを表示する必要があります。
各デバイスは完全に独立しているため、デバイス フォームをゾーン フォームに埋め込む必要はないように思われます。一度に 1 つのデバイスへの変更のみを処理したいのです。
現在、各デバイスのフォームを作成し、ゾーン ビュー テンプレートに渡しています。
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 %}
しかし、これはテンプレートにロジックを入れすぎているように見えますか? レンダリングするテンプレートを何らかの方法でフォーム オブジェクトに割り当てたほうがよいのですが、これが可能かどうかわかりません。