2011-10-10 15 views
22

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

次が小枝に渡されるようなオブジェクト:

object 
    property1 
    property2 

私はこのようなプロパティ1を更新したいと思います:上記のコードは動作しません

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

が、それは行うことが可能です枝の中でこれのようなもの?そうでない場合は、これを行うための拡張機能やマクロを書く方法がありますか?

class Get extends StdClass 
    { 

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

    } 
+0

下の私の答えを無視してください、それは非常に時代遅れであり、もはや受け入れられた答えではありません。残念ながら、それは受け入れられた答えであるので、私はそれを削除することはできません。 – rdjs

+0

@rdjs私に知らせてくれてありがとう!私は受け入れられた答えを交換しました! – F21

+0

受け入れられる答えは、オブジェクトではなく配列とハッシュに対してのみ有効です。 – Duane

答えて

40

あなたはマージするオブジェクトによってそれを行うことができます:

{% set object = object|merge({'property1': 'somenewvalue'}) %} 
+0

+1これを行うための素晴らしいネイティブな方法です。単一使用シナリオに最適です。 – Frizi

+25

'マージフィルタは配列やハッシュでしか機能しません。 ' – gondo

+0

http://twig.sensiolabs.org/doc/filters/merge.html – Jekis

4

プロパティを設定することが可能な方法は、実際に新しいプロパティを作成し、オブジェクトのメソッドを作成することです私の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

私はこのメソッドをpublicに設定しなければなりませんでしたが、実際には素晴らしい解決策です –

+0

何ですか?そして、世界でどのようにあなたはそれをTwigから呼びますか? –

+0

@BrunoSantos 'object.setProperty(" propertyName "、3)'これは 'propertyName'を' 3'に設定/作成します –

1

私が持っていた

-3
{{ set(object, 'property', value) }} 
+0

はyii2のためだけに機能します – Ros

0

あなたの財産は、配列(オブジェクト - >プロパティ[ 'キー'])である場合は、このような何かすることができますに

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

同等のことを:

​​
+0

私の時間を保存しました:) –

+1

、yii2のみ – certainlyakey

関連する問題