Ответ 1
Вы можете сделать это, объединив объекты:
{% set object = object|merge({'property1': 'somenewvalue'}) %}
Есть ли способ обновить свойство объекта в 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';
Twig имеет тег do, который позволяет вам это делать.
{% do yourObject.setFoo(value) %}
Мне было полезно, чтобы пункт меню был актуальным из шаблона:
{% do tertiaryNav['photos'].setCurrent(true) %}
{{ set(object, 'property', value) }}