Comment concaténer des chaînes dans une brindille

447

Quelqu'un sait comment concaténer des cordes en brindille? Je veux faire quelque chose comme:

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

Réponses:

872

Cela devrait fonctionner correctement:

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

Pour ajouter un filtre - comme «trans» - dans la même balise, utilisez

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

Comme le souligne Adam Elsodaney , vous pouvez également utiliser l' interpolation de chaînes , cela nécessite des chaînes entre guillemets doubles:

{{ "http://#{app.request.host}" }}
Alessandro Desantis
la source
3
Merci pour votre réponse. Mais il semble que | le filtre trans ne fonctionne pas sur cela (par exemple: {{'test_' ~ nom | trans}} ne traduira pas mes articles. Avez-vous une idée de comment faire cela? thx!
guillaumepotier
12
Oui, vous devez créer une variable pour contenir la chaîne concaténée. Par exemple: {% set foo = 'http://' ~ app.request.host %}. Et vous pouvez faire: {{ foo | trans }}.
Alessandro Desantis
75
Traduction en une seule ligne: {{('test_' ~ nom) | trans}}
Johnny
6
Je vous remercie. Le problème est donc que les filtres ont une priorité plus élevée que l'opérateur de concaténation.
Alessandro Desantis
Cela a fonctionné pour moi de concaténer les chaînes passées dans une fonction comme un argument, avec des filtres sur la variable et le jeton de fonction lui-même: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}pas besoin d'une variable supplémentaire.
Wesley Murch
90

L' interpolation de chaînes est également une caractéristique peu connue de Twig :

{{ "http://#{app.request.host}" }}
Adam Elsodaney
la source
20
Belle fonctionnalité. Attention, les chaînes entre guillemets doubles seulement!
bzeaman
26

L'opérateur que vous recherchez est Tilde (~), comme l'a dit Alessandro, et le voici dans la documentation:

~: Convertit tous les opérandes en chaînes et les concatène. {{"Bonjour" ~ nom ~ "!" }} retournerait (en supposant que le nom est 'John') Bonjour John !. - http://twig.sensiolabs.org/doc/templates.html#other-operators

Et voici un exemple ailleurs dans la documentation :

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

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

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

Dans ce cas, où vous voulez sortir du texte brut et une variable, vous pouvez le faire comme ceci:

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

Si vous souhaitez concaténer certaines variables, la solution d'alessandro1997 serait bien meilleure.

alghimo
la source
2
cela ne fonctionne pas pour moi, car je dois url_encode la chaîne entière avec un autre filtre ...
stoefln
14
{{ ['foo', 'bar'|capitalize]|join }}

Comme vous pouvez le voir, cela fonctionne avec des filtres et des fonctions sans avoir à utiliser setsur une ligne séparée.

Simon Epskamp
la source
11

Chaque fois que vous devez utiliser un filtre avec une chaîne concaténée (ou une opération mathématique de base), vous devez l'envelopper avec des (). Par exemple.:

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

lsouza
la source
1
Très utile, merci. J'avais besoin de concaténer des variables à utiliser comme clé de traduction.
afilina
6

Dans Symfony, vous pouvez l'utiliser pour le protocole et l'hôte:

{{ app.request.schemeAndHttpHost }}

Bien que @ alessandro1997 ait donné une réponse parfaite sur la concaténation.

Minras
la source
6

Vous pouvez utiliser ~comme{{ foo ~ 'inline string' ~ bar.fieldName }}

Mais vous pouvez également créer votre propre concatfonction pour l'utiliser comme dans votre question
{{ concat('http://', app.request.host) }}::

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

Dans app/config/services.yml:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }
luchaninov
la source
Une très bonne solution
Daniel
3

Réponse rapide (TL; DR)

  • La concaténation de chaîne de brindilles peut également être effectuée avec le format()filtre

Réponse détaillée

Le contexte

  • Twig 2.x
  • Construction et concaténation de cordes

Problème

  • Scénario: DeveloperGailSim souhaite effectuer la concaténation de chaînes dans Twig
    • Les autres réponses dans ce sujet concernent déjà l'opérateur de concaténation
    • Cette réponse se concentre sur le formatfiltre qui est plus expressif

Solution

  • L’approche alternative consiste à utiliser format filtre
  • Le formatfiltre fonctionne comme lesprintf fonction dans d'autres langages de programmation
  • Le formatfiltre peut être moins encombrant que l'opérateur ~ pour les chaînes plus complexes

Exemple00

  • example00 string concat bare

    {{"% s% s% s!" | format ('alpha', 'bravo', 'charlie')}}
    
    --- résultat --
    
    alphabravocharlie!
    
    

Exemple01

  • exemple01 concaténation de chaîne avec le texte intermédiaire

    {{"Le% s dans% s tombe principalement sur le format% s!" | ('Alpha', 'bravo', 'charlie')}}
    
    --- résultat --
    
    L'alpha en bravo tombe principalement sur la charlie!
    
    

Exemple02

  • exemple02 concaténation de chaîne avec formatage numérique
  • suit la même syntaxe que sprintfdans d'autres langues

    {{"Le% 04d dans% 04d tombe principalement sur le format% s!" | (2,3, 'arbre')}}
    
    --- résultat --
    
    Le 0002 en 0003 tombe principalement sur l'arbre!
    
    

Voir également

dreftymac
la source
1

Pour mélanger des chaînes, des variables et des traductions, je fais simplement ce qui suit:

    {% 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>
    ' %}

Malgré tout mélangé, cela fonctionne comme un charme.

Gingi
la source
-1

Le délimiteur "{{...}}" - peut également être utilisé dans les chaînes:

"http://{{ app.request.host }}"
user2345998
la source