小枝でオブジェクトのプロパティを更新する方法はありますか?
次のようなオブジェクトがtwigに渡されます。
object
property1
property2
私はこのようにproperty1を更新したいと思います:
{% set object.property1 = 'somenewvalue' %}
上記のコードは機能しませんが、小枝でこのようなことをすることは可能ですか?そうでない場合、これを行うための拡張機能またはマクロを作成する方法はありますか?
オブジェクトをマージすることでそれを行うことができます:
{% set object = object|merge({'property1': 'somenewvalue'}) %}
プロパティを設定するための可能な方法は、実際に新しいプロパティを作成するオブジェクトにメソッドを作成することです:
class Get extends StdClass
{
protected function setProperty($name,$value = null)
{
$this->$name = $value;
}
}
Twigには do タグがあり、これを行うことができます。
{% do foo.setBar(value) %}
テンプレートから最新のメニュー項目を強制するのに便利でした。
{% do tertiaryNav.photos.setCurrent(true) %}
私の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 -%}
プロパティが配列(object-> property ['key'])の場合、次のようなことができます:
{% set arr = object.property|merge({"key":['some value']}) %}
{{ set(object, 'property', arr) }}
これは以下と同等です。
this->property['key'][] = 'some value';