web-dev-qa-db-fra.com

Mise à jour des propriétés d'un objet dans twig

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?

28
F21

Vous pouvez le faire en fusionnant des objets:

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

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;
    }

  }
4
New linux user

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 -%}
1
Emii Khaos

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';
0
DarkAiR