Подтвердить что ты не робот

Обновление свойств объекта в веточке

Есть ли способ обновить свойство объекта в twig?

Объект, подобный следующему, передается веточке:

object
   property1
   property2

Я хотел бы обновить свойство1 следующим образом:

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

Вышеприведенный код не работает, но возможно ли сделать что-то подобное в twig? Если нет, есть ли способ написать расширение или макрос для этого?

4b9b3361

Ответ 1

Вы можете сделать это, объединив объекты:

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

Ответ 2

Возможным способом установки свойства является создание метода в объекте, который фактически создает новые свойства:

class Get extends StdClass 
  {

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

  }

Ответ 3

У меня была такая же проблема в моем шаблоне меню 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 -%}

Ответ 4

Если ваше свойство является массивом (object- > property ['key']), вы можете сделать что-то вроде этого:

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

Это эквивалентно:

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

Ответ 5

Twig имеет тег do, который позволяет вам это делать.

{% do yourObject.setFoo(value) %}

Мне было полезно, чтобы пункт меню был актуальным из шаблона:

{% do tertiaryNav['photos'].setCurrent(true) %}

Ответ 6

{{ set(object, 'property', value) }}