2011-10-10 108 views
22

有沒有更新樹枝中對象屬性的方法?更新樹枝中的對象屬性

象下面的對象傳遞給小枝:

object 
    property1 
    property2 

我想更新property1是這樣的:

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

上面的代碼不工作,但它是可以做到的像這樣的小枝?如果沒有,有沒有辦法寫一個擴展或宏來做到這一點?

+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

一種可能的方法來設置屬性是創建的對象的方法,實際上創造了新的屬性:

class Get extends StdClass 
    { 

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

    } 
+1

我不得不將這個方法公開,但它確實是一個很好的解決方案 –

+0

什麼?那麼你是如何將這個來自Twig的? –

+0

@BrunoSantos'object.setProperty(「propertyName」,3)'這將設置/創建'propertyName'爲'3' –

1

我有我的knp菜單模板中存在同樣的問題。我想用label塊渲染備用字段,而不復制它。當然,底層對象需要一個屬性的setter。

{%- block nav_label -%} 
    {%- set oldLabel = item.label %} 
    {%- set navLabel = item.getExtra('nav_label')|default(oldLabel) %} 
    {{- item.setLabel(navLabel) ? '' : '' }} 
    {{- block('label') -}} 
    {{- item.setLabel(oldLabel) ? '' : '' }} 
{%- endblock -%} 
-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