2011-10-10 102 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