So verketten Sie Zeichenfolgen in Zweigen

447

Weiß jemand, wie man Strings in Zweigen verkettet? Ich möchte so etwas tun wie:

{{ concat('http://', app.request.host) }}
stoefln
quelle

Antworten:

872

Dies sollte gut funktionieren:

{{ 'http://' ~ app.request.host }}

Um einen Filter - wie 'trans' - im selben Tag hinzuzufügen, verwenden Sie

{{ ('http://' ~ app.request.host) | trans }}

Wie Adam Elsodaney betont, können Sie auch die Zeichenfolgeninterpolation verwenden . Dies erfordert Zeichenfolgen in doppelten Anführungszeichen:

{{ "http://#{app.request.host}" }}
Alessandro Desantis
quelle
3
Danke für deine Antwort. Aber es scheint, dass | Der Trans-Filter funktioniert nicht (zB: {{'test_' ~ name | trans}} übersetzt meine Artikel nicht. Haben Sie eine Idee, wie das geht? Danke!
Guillaumepotier
12
Ja, Sie müssen eine Variable erstellen, um die verkettete Zeichenfolge aufzunehmen. ZB : {% set foo = 'http://' ~ app.request.host %}. Und dann können Sie tun : {{ foo | trans }}.
Alessandro Desantis
75
Übersetzung in einer Zeile: {{('test_' ~ name) | trans}}
Johnny
6
Vielen Dank. Das Problem ist also, dass Filter eine höhere Priorität haben als der Verkettungsoperator.
Alessandro Desantis
Dies funktionierte für mich, um Zeichenfolgen, die als ein Argument an eine Funktion übergeben wurden, mit Filtern für die Variable und das Funktionstoken selbst zu verknüpfen: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}Keine zusätzliche Variable erforderlich.
Wesley Murch
90

Ein wenig bekanntes Merkmal in Twig ist auch die String-Interpolation :

{{ "http://#{app.request.host}" }}
Adam Elsodaney
quelle
20
Nettes Feature. Beachten Sie, dass nur Zeichenfolgen in doppelten Anführungszeichen stehen!
Bzeaman
26

Der Operator, den Sie suchen, ist Tilde (~), wie Alessandro sagte, und hier ist es in der Dokumentation:

~: Konvertiert alle Operanden in Zeichenfolgen und verkettet sie. {{"Hallo" ~ Name ~ "!" }} würde zurückkehren (vorausgesetzt der Name ist 'John') Hallo John!. - http://twig.sensiolabs.org/doc/templates.html#other-operators

Und hier ist ein Beispiel irgendwo anders in den Dokumenten :

{% set greeting = 'Hello' %}
{% set name = 'Fabien' %}

{{ greeting ~ name|lower }}   {# Hello fabien #}

{# use parenthesis to change precedence #}
{{ (greeting ~ name)|lower }} {# hello fabien #}
Nabil Kadimi
quelle
22

In diesem Fall, in dem Sie einfachen Text und eine Variable ausgeben möchten, können Sie dies folgendermaßen tun:

http://{{ app.request.host }}

Wenn Sie einige Variablen verketten möchten, ist die Lösung von alessandro1997 viel besser.

Alghimo
quelle
2
Das funktioniert bei mir nicht, weil ich den gesamten String mit einem anderen Filter
url_encode muss
14
{{ ['foo', 'bar'|capitalize]|join }}

Wie Sie sehen, funktioniert dies mit Filtern und Funktionen, ohne dass seteine separate Zeile verwendet werden muss.

Simon Epskamp
quelle
11

Wann immer Sie einen Filter mit einer verketteten Zeichenfolge (oder einer grundlegenden mathematischen Operation) verwenden müssen, sollten Sie ihn mit () umschließen. Z.B.:

{{ ('http://' ~ app.request.host) | url_encode }}

lsouza
quelle
1
Sehr hilfreich, danke. Ich musste Variablen zur Verwendung als Übersetzungsschlüssel verketten.
Afilina
6

In Symfony können Sie dies für Protokoll und Host verwenden:

{{ app.request.schemeAndHttpHost }}

Obwohl @ alessandro1997 eine perfekte Antwort zur Verkettung gab.

Minras
quelle
6

Sie können ~wie verwenden{{ foo ~ 'inline string' ~ bar.fieldName }}

Sie können aber auch eigene erstellen concatFunktion , es zu benutzen , wie in Ihrer Frage:
{{ concat('http://', app.request.host) }}:

Im src/AppBundle/Twig/AppExtension.php

<?php

namespace AppBundle\Twig;

class AppExtension extends \Twig_Extension
{
    /**
     * {@inheritdoc}
     */
    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('concat', [$this, 'concat'], ['is_safe' => ['html']]),
        ];
    }

    public function concat()
    {
        return implode('', func_get_args())
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'app_extension';
    }
}

In app/config/services.yml:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }
Luchaninov
quelle
Eine sehr gute Lösung
Daniel
3

Schnelle Antwort (TL; DR)

  • Die Verkettung von Zweigzeichenfolgen kann auch mit dem format()Filter erfolgen

Detaillierte Antwort

Kontext

  • Zweig 2.x.
  • Stringbildung und Verkettung

Problem

  • Szenario: DeveloperGailSim möchte die Verkettung von Zeichenfolgen in Twig durchführen
    • Andere Antworten in diesem Thread richten sich bereits an den Concat-Operator
    • Diese Antwort konzentriert sich auf den formatFilter, der aussagekräftiger ist

Lösung

  • Ein alternativer Ansatz ist die Verwendung des formatFilters
  • Der formatFilter funktioniert wie die sprintfFunktion in anderen Programmiersprachen
  • Der formatFilter ist für komplexere Zeichenfolgen möglicherweise weniger umständlich als der Operator ~

Beispiel00

  • example00 string concat bare

    {{"% s% s% s!" | Format ('alpha', 'bravo', 'charlie')}}
    
    --- Ergebnis -
    
    alphabravocharlie!
    
    

Beispiel01

  • example01 string concat mit dazwischenliegendem text

    {{"Das% s in% s fällt hauptsächlich auf das Format% s!" | ('Alpha', 'bravo', 'charlie')}}
    
    --- Ergebnis -
    
    Das Alpha in Bravo fällt hauptsächlich auf die Charlie!
    
    

Beispiel 02

  • Beispiel02 String Concat mit numerischer Formatierung
  • folgt der gleichen Syntax wie sprintfin anderen Sprachen

    {{"% 04d in% 04d fällt hauptsächlich auf das Format% s!" | (2,3, 'tree')}}
    
    --- Ergebnis -
    
    Die 0002 in 0003 fällt hauptsächlich auf den Baum!
    
    

Siehe auch

dreftymac
quelle
1

Um Strings, Variablen und Übersetzungen zu mischen, mache ich einfach Folgendes:

    {% set add_link = '
    <a class="btn btn-xs btn-icon-only" 
       title="' ~ 'string.to_be_translated'|trans ~ '" 
       href="' ~ path('acme_myBundle_link',{'link':link.id})  ~ '">
    </a>
    ' %}

Obwohl alles durcheinander ist, funktioniert es wie ein Zauber.

Gingi
quelle
-1

Das Trennzeichen "{{...}}" kann auch in Zeichenfolgen verwendet werden:

"http://{{ app.request.host }}"
user2345998
quelle