Est-il possible de mettre à jour la propriété d'un objet dans twig?
Un objet comme celui-ci est passé à twig:
object
property1
property2
Je voudrais mettre à jour property1 comme ceci:
{% set object.property1 = 'somenewvalue' %}
Le code ci-dessus ne fonctionne pas, mais est-il possible de faire quelque chose comme ça dans twig? Sinon, existe-t-il un moyen d'écrire une extension ou une macro pour le faire?
Vous pouvez le faire en fusionnant des objets:
{% set object = object|merge({'property1': 'somenewvalue'}) %}
Un moyen possible de définir une propriété est de créer une méthode dans l'objet qui crée de nouvelles propriétés:
class Get extends StdClass
{
protected function setProperty($name,$value = null)
{
$this->$name = $value;
}
}
J'ai eu le même problème dans mon modèle de menu knp. Je voulais rendre un champ alternatif avec le bloc label
, sans le dupliquer. Bien entendu, l’objet sous-jacent a besoin d’un setter pour la propriété.
{%- block nav_label -%}
{%- set oldLabel = item.label %}
{%- set navLabel = item.getExtra('nav_label')|default(oldLabel) %}
{{- item.setLabel(navLabel) ? '' : '' }}
{{- block('label') -}}
{{- item.setLabel(oldLabel) ? '' : '' }}
{%- endblock -%}
Si votre propriété est un tableau (objet-> propriété ['clé']), vous pouvez faire quelque chose comme ceci:
{% set arr = object.property|merge({"key":['some value']}) %}
{{ set(object, 'property', arr) }}
Cela équivaut à:
this->property['key'][] = 'some value';