57 votes

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

Existe-t-il un moyen de mettre à jour la propriété d'un objet dans twig ?

Un objet du type suivant est transmis à twig :

object
   property1
   property2

Je voudrais mettre à jour property1 comme suit :

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

Le code ci-dessus ne fonctionne pas, mais est-il possible de faire quelque chose comme ça dans twig ? Si non, existe-t-il un moyen d'écrire une extension ou une macro pour faire cela ?

0 votes

Veuillez ignorer ma réponse ci-dessous, elle est très obsolète et ne devrait plus être la réponse acceptée. Malheureusement, je ne peux pas la supprimer car elle est la réponse acceptée.

0 votes

@rdjs Merci de me le faire savoir ! J'ai échangé la réponse acceptée !

0 votes

La réponse acceptée ne fonctionne que pour les tableaux et les hachages, pas pour les objets.

75voto

isqua Points 1264

Vous pouvez le faire en fusionnant des objets :

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

1 votes

+1 grande manière autochtone de le faire. Parfait pour un scénario d'utilisation unique.

3 votes

Pourquoi cette réponse est-elle acceptée ? Cela ne fonctionne-t-il que sous certaines versions de Twig ?

2 votes

Cette réponse ne devrait pas être acceptée car elle ne répond pas à la question "comment mettre à jour les propriétés d'un objet".

11voto

Baishu Points 1047

Twig dispose d'un faire qui vous permet de le faire.

{% do foo.setBar(value) %}

4voto

New linux user Points 51

Pour définir une propriété, il est possible 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;
    }

  }

1 votes

J'ai dû rendre cette méthode publique, mais c'est une bonne solution.

0 votes

Quoi ? Et comment diable appelez-vous cela de Twig ?

0 votes

@BrunoSantos object.setProperty("propertyName", 3) Cela permet de définir/créer propertyName à 3

1voto

Emii Khaos Points 8933

J'ai eu le même problème avec mon modèle de menu knp. Je voulais rendre un champ alternatif avec la balise 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 votes

Au lieu de {{- xx.f() ? '' : '' }} utiliser ceci : {% do xx.f() %} mais il n'imprime jamais rien. twig.symfony.com/doc/2.x/tags/do.html

1voto

DarkAiR Points 45

Si votre propriété est un tableau (object->property['key']), 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 votes

Vous m'avez fait gagner du temps :)

2 votes

Encore une fois, seulement yii2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X