Quelqu'un sait comment concaténer des chaînes dans twig? Je veux faire quelque chose comme:
{{ concat('http://', app.request.Host) }}
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}" }}
Une autre fonctionnalité peu connue dans Twig est interpolation de chaîne :
{{ "http://#{app.request.Host}" }}
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 #}
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.
{{ ['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.
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 }}
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.
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 }
format()
format
qui est plus expressifformat
format
fonctionne comme la fonction sprintf
dans d'autres langages de programmationformat
peut être moins lourd que l'opérateur ~ pour les chaînes plus complexesexample00 chaîne concat nue
{{"% s% s% s!" | format ('alpha', 'bravo', 'charlie')}} - - résultat - alphabravocharlie!
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!
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!
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.