Aktualisieren von Objekteigenschaften in Twig

Lesezeit: 3 Minuten

Gibt es eine Möglichkeit, die Eigenschaft eines Objekts in Twig zu aktualisieren?

Ein Objekt wie das folgende wird an twig übergeben:

object
   property1
   property2

Ich möchte Property1 wie folgt aktualisieren:

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

Der obige Code funktioniert nicht, aber ist es möglich, so etwas in Twig zu tun? Wenn nicht, gibt es eine Möglichkeit, eine Erweiterung oder ein Makro dafür zu schreiben?

  • Bitte ignorieren Sie meine Antwort unten, sie ist sehr veraltet und sollte nicht mehr die akzeptierte Antwort sein. Leider kann ich es nicht löschen, da es die akzeptierte Antwort ist.

    – rdjs

    19. Oktober 2015 um 15:14 Uhr

  • @rdjs Danke, dass du mich informiert hast! Ich habe die akzeptierte Antwort ausgetauscht!

    – F21

    19. Oktober 2015 um 21:10 Uhr

  • Die akzeptierte Antwort funktioniert nur für Arrays und Hashes, nicht für Objekte.

    – Duane

    23. März 2016 um 5:50 Uhr

  • Ich habe dazu ein Problem erstellt: github.com/twigphp/Twig/issues/2768

    – simohe

    26. Oktober 2018 um 10:49 Uhr

  • Laut der Symfony-Crew ist der Versuch, dies zu tun, “Geschäftslogik im Zweig”, was vermieden werden sollte. Sehen github.com/twigphp/Twig/issues/2768#issuecomment-442368654

    – simohe

    13. November 2019 um 9:46 Uhr

Sie können dies tun, indem Sie Objekte zusammenführen:

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

  • +1 großartige native Möglichkeit, dies zu tun. Perfekt für Einzelnutzungsszenarien.

    – Fritzi

    7. November 2013 um 11:11 Uhr

  • Warum ist dies die akzeptierte Antwort? Funktioniert das nur unter einigen Twig-Versionen?

    – Sylbru

    8. November 2017 um 11:02 Uhr

  • Dies sollte nicht die akzeptierte Antwort sein, da sie nicht auf die Frage „Wie werden Eigenschaften eines Objekts aktualisiert?“ reagiert.

    – Tim Tim

    3. Oktober 2018 um 11:09 Uhr

  • Dies sollte in der Tat nicht die akzeptierte Antwort sein – gemäß Twig-Fehlerausgabe: Der Zusammenführungsfilter funktioniert nur mit Arrays oder “Traversable”, hat “object” als erstes Argument. Die Antwort von @Baishu unten funktioniert für meinen Objekt-Anwendungsfall

    – Ludo

    12. November 2021 um 14:26 Uhr

Benutzer-Avatar
Baishu

Zweig hat eine tun Tag, mit dem Sie dies tun können.

{% do foo.setBar(value) %}

Eine Möglichkeit, eine Eigenschaft festzulegen, besteht darin, eine Methode im Objekt zu erstellen, die tatsächlich neue Eigenschaften erstellt:

class Get extends StdClass 
  {

    protected function setProperty($name,$value = null)
    {
    $this->$name = $value;
    }

  }

  • Ich musste diese Methode öffentlich machen, aber es ist in der Tat eine nette Lösung

    – Nikolaus BADIA

    29. November 2017 um 17:39 Uhr

  • Was? Und wie um alles in der Welt nennt man das von Twig?

    – Bruno Santos

    29. Januar 2018 um 13:17 Uhr

  • @BrunoSantos object.setProperty("propertyName", 3) dies wird gesetzt/erstellt propertyName zu 3

    – Pavel Kostenko

    27. Februar 2018 um 8:40 Uhr


  • im Zweig: {% do object.setProperty("propertyName", 3) %}

    – simohe

    26. Oktober 2018 um 8:12 Uhr

Ich hatte das gleiche Problem in meiner Knp-Menüvorlage. Ich wollte ein alternatives Feld mit dem rendern label blockieren, ohne sie zu duplizieren. Natürlich benötigt das zugrunde liegende Objekt einen Setter für die Eigenschaft.

{%- block nav_label -%}
    {%- set oldLabel = item.label %}
    {%- set navLabel = item.getExtra('nav_label')|default(oldLabel) %}
    {{- item.setLabel(navLabel) ? '' : '' }}
    {{- block('label') -}}
    {{- item.setLabel(oldLabel) ? '' : '' }}
{%- endblock -%}

Benutzer-Avatar
DarkAir

Wenn Ihre Eigenschaft ein Array ist (object->property[‘key’]) können Sie so etwas tun:

{% set arr = object.property|merge({"key":['some value']}) %}
{{ set(object, 'property', arr) }}

Das entspricht:

this->property['key'][] = 'some value';

  • Du hast meine Zeit gespart 🙂

    – andrzej1_1

    4. März 2017 um 18:10 Uhr


  • wieder nur yii2

    – sicherlich akey

    22. August 2017 um 11:02 Uhr

Benutzer-Avatar
Eminem

{{ set(object, 'property', value) }}

  • Du hast meine Zeit gespart 🙂

    – andrzej1_1

    4. März 2017 um 18:10 Uhr


  • wieder nur yii2

    – sicherlich akey

    22. August 2017 um 11:02 Uhr

1311920cookie-checkAktualisieren von Objekteigenschaften in Twig

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy