Comment concaténer des chaînes dans une brindille


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

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


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

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.


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.


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


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.


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 }

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


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.


-1

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

"http://{{ app.request.host }}"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.