So verketten Sie Zeichenfolgen in Zweigen


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

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


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

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.


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.


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


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.


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 }

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


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.


-1

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

"http://{{ app.request.host }}"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.