web-dev-qa-db-ja.com

twigのオブジェクトプロパティを更新する

小枝でオブジェクトのプロパティを更新する方法はありますか?

次のようなオブジェクトがtwigに渡されます。

object
   property1
   property2

私はこのようにproperty1を更新したいと思います:

{% set object.property1 = 'somenewvalue' %}

上記のコードは機能しませんが、小枝でこのようなことをすることは可能ですか?そうでない場合、これを行うための拡張機能またはマクロを作成する方法はありますか?

37
F21

オブジェクトをマージすることでそれを行うことができます:

{% set object = object|merge({'property1': 'somenewvalue'}) %}
48
isqua

プロパティを設定するための可能な方法は、実際に新しいプロパティを作成するオブジェクトにメソッドを作成することです:

class Get extends StdClass 
  {

    protected function setProperty($name,$value = null)
    {
    $this->$name = $value;
    }

  }
4
New linux user

Twigには do タグがあり、これを行うことができます。

{% do foo.setBar(value) %}

テンプレートから最新のメニュー項目を強制するのに便利でした。

{% do tertiaryNav.photos.setCurrent(true) %}
4
Baishu

私のknpメニューテンプレートにも同じ問題がありました。重複することなく、labelブロックを使用して代替フィールドをレンダリングする必要がありました。もちろん、基になるオブジェクトにはプロパティのセッターが必要です。

{%- block nav_label -%}
    {%- set oldLabel = item.label %}
    {%- set navLabel = item.getExtra('nav_label')|default(oldLabel) %}
    {{- item.setLabel(navLabel) ? '' : '' }}
    {{- block('label') -}}
    {{- item.setLabel(oldLabel) ? '' : '' }}
{%- endblock -%}
1
Emii Khaos

プロパティが配列(object-> property ['key'])の場合、次のようなことができます:

{% set arr = object.property|merge({"key":['some value']}) %}
{{ set(object, 'property', arr) }}

これは以下と同等です。

this->property['key'][] = 'some value';
0
DarkAiR