更新树枝中的对象属性

发布于 2024-12-09 12:56:17 字数 273 浏览 0 评论 0原文

有没有办法更新树枝中对象的属性?

像下面这样的对象被传递给 twig:

object
   property1
   property2

我想像这样更新 property1:

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

上面的代码不起作用,但是可以在 twig 中做这样的事情吗?如果没有,有没有办法编写扩展或宏来做到这一点?

Is there a way to update an object's property in twig?

An object like the following is passed to twig:

object
   property1
   property2

I would like to update property1 like this:

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

The above code does not work, but is it possible to do something like this in twig? If not, is there a way to write an extension or macro to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

南街九尾狐 2024-12-16 12:56:17

2013 年的答案

您可以通过合并对象来实现:

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

2023 年的更新

我不知道该解决方案从哪个版本的 twig 不再起作用。现在你只能创建一个具有新名称的对象:

{% set data = {foo:1} %}
{% set updated = data|merge({ bar: 2 }) %}

foo: {{ updated.foo }} {# Produces “foo: 1” #}
bar: {{ updated.bar }} {# Produces “bar: 2” #}

Answer from 2013

You can do it by merging objects:

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

Update from 2023

I don’t know from which version of twig this solution does not work anymore. Now you can only create an object with a new name:

{% set data = {foo:1} %}
{% set updated = data|merge({ bar: 2 }) %}

foo: {{ updated.foo }} {# Produces “foo: 1” #}
bar: {{ updated.bar }} {# Produces “bar: 2” #}
相思碎 2024-12-16 12:56:17

Twig 有一个 do 标签,允许您执行此操作。

{% do foo.setBar(value) %}

Twig has a do tag that allows you to do that.

{% do foo.setBar(value) %}
幸福还没到 2024-12-16 12:56:17

设置属性的一种可能方法是在对象中创建一个实际创建新属性的方法:

class Get extends StdClass 
  {

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

  }

A possible way to set a property is to create a method in the object which actually creates new properties:

class Get extends StdClass 
  {

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

  }
无人问我粥可暖 2024-12-16 12:56:17

我的 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 -%}

I had the same problem in my knp menu template. I wanted to render an alternate field with the label block, without duplicating it. Of course the underlying object needs an setter for the property.

{%- block nav_label -%}
    {%- set oldLabel = item.label %}
    {%- set navLabel = item.getExtra('nav_label')|default(oldLabel) %}
    {{- item.setLabel(navLabel) ? '' : '' }}
    {{- block('label') -}}
    {{- item.setLabel(oldLabel) ? '' : '' }}
{%- endblock -%}
小巷里的女流氓 2024-12-16 12:56:17

如果您的属性是数组 (object->property['key']) 您可以执行以下操作:

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

相当于:

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

If your property is array (object->property['key']) you can do something like this:

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

That equivalent to:

this->property['key'][] = 'some value';
像你 2024-12-16 12:56:17
{{ set(object, 'property', value) }}
{{ set(object, 'property', value) }}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文