Есть ли способ обновить свойство объекта в twig?
Объект, подобный следующему, передается веточке:
object property1 property2
Я хотел бы обновить свойство1 следующим образом:
{% set object.property1 = 'somenewvalue' %}
Вышеприведенный код не работает, но возможно ли сделать что-то подобное в twig? Если нет, есть ли способ написать расширение или макрос для этого?
Вы можете сделать это, объединив объекты:
{% set object = object|merge({'property1': 'somenewvalue'}) %}
Возможным способом установки свойства является создание метода в объекте, который фактически создает новые свойства:
class Get extends StdClass { protected function setProperty($name,$value = null) { $this->$name = $value; } }
У меня была та же проблема в моем шаблоне меню 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 -%}
Если ваше свойство является массивом (object-> property ['key']), вы можете сделать что-то вроде этого:
{% set arr = object.property|merge({"key":['some value']}) %} {{ set(object, 'property', arr) }}
Это эквивалентно:
this->property['key'][] = 'some value';
{{ set(object, 'property', value) }}