web-dev-qa-db-fra.com

Comment concaténer des chaînes dans twig

Quelqu'un sait comment concaténer des chaînes dans twig? Je veux faire quelque chose comme:

{{ concat('http://', app.request.Host) }}
409
stoefln

Cela devrait bien fonctionner:

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

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

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

Comme indique Adam Elsodaney , vous pouvez également utiliser interpolation de chaîne , cela nécessite des chaînes entre guillemets:

{{ "http://#{app.request.Host}" }}
801

Une autre fonctionnalité peu connue dans Twig est interpolation de chaîne :

{{ "http://#{app.request.Host}" }}
81
Adam Elsodaney

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 #}
24
Nabil Kadimi

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

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

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

22
alghimo
{{ ['foo', 'bar'|capitalize]|join }}

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

13
Simon Epskamp

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

11
lsouza

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 à la concaténation.

6
Minras

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

Mais vous pouvez également créer votre propre fonction concat 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 }
5
luchaninov

Réponse rapide (TL; DR)

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

Réponse détaillée

Le contexte

  • Rameau 2.x
  • Création de cordes et concaténation

Problème

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

Solution

  • Une autre approche consiste à utiliser le filtre format
  • Le filtre format fonctionne comme la fonction sprintf dans d'autres langages de programmation
  • Le filtre format peut être moins lourd que l'opérateur ~ pour les chaînes plus complexes

Example00

  • example00 chaîne concat nue

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

Exemple01

  • example01 chaîne concat avec le texte intervenant

     
     {{"Le% s dans% s tombe principalement sur le% s!" | Format ('alpha', 'bravo', 'charlie')}} 
     
     --- résultat - 
     
     L’alpha en bravo incombe principalement à Charlie! 
     
    

Exemple02

  • example02 chaîne concat avec formatage numérique
  • suit la même syntaxe que sprintf dans d'autres langues

     
     {{"Le% 04d de% 04d tombe principalement au format% s!" | Format (2,3, 'arbre')}} 
     
     --- Résultat - 
     
     Le 0002 sur 0003 tombe principalement sur l'arbre! 
     
    

Voir également

2
dreftymac

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

Bien que tout soit mélangé, cela fonctionne comme un charme.

1
Gingi