4

私のアプリは、多くのデバイスを持つことができるゾーンで構成されています。

ゾーンを表示する場合、ゾーン内の各デバイスのコントロールを表示する必要があります。

各デバイスは完全に独立しているため、デバイス フォームをゾーン フォームに埋め込む必要はないように思われます。一度に 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 %}

しかし、これはテンプレートにロジックを入れすぎているように見えますか? レンダリングするテンプレートを何らかの方法でフォーム オブジェクトに割り当てたほうがよいのですが、これが可能かどうかわかりません。

4

1 に答える 1