Cómo concatenar cuerdas en ramita

Respuestas:

872

Esto debería funcionar bien:

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

Para agregar un filtro, como 'trans', en la misma etiqueta, use

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

Como señala Adam Elsodaney , también puede usar la interpolación de cadenas , esto requiere cadenas con comillas dobles:

{{ "http://#{app.request.host}" }}
Alessandro Desantis
fuente
3
Gracias por tu respuesta. Pero parece que | Filtro trans no funciona en ese (por ejemplo: {{ 'test_' ~ nombre | trans}} no va a traducir mis artículos ¿Tiene una idea de cómo hacer eso THX.?!
guillaumepotier
12
Sí, debe crear una variable para contener la cadena concatenada. Por ejemplo: {% set foo = 'http://' ~ app.request.host %}. Y entonces usted puede hacer: {{ foo | trans }}.
Alessandro Desantis
75
Traducción en una línea: {{('test_' ~ nombre) | trans}}
Johnny
66
Gracias. Entonces, el problema es que los filtros tienen mayor prioridad que el operador de concatenación.
Alessandro Desantis
Esto me funcionó para concatenar cadenas pasadas a una función como un argumento, con filtros en la variable y el token de la función en sí: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}no es necesaria una variable adicional.
Wesley Murch
90

También una característica poco conocida en Twig es la interpolación de cadenas :

{{ "http://#{app.request.host}" }}
Adam Elsodaney
fuente
20
Buena característica ¡Tenga en cuenta, solo las cadenas entre comillas dobles!
bzeaman
26

El operador que está buscando es Tilde (~), como dijo Alessandro, y aquí está en la documentación:

~: Convierte todos los operandos en cadenas y los concatena. {{"Hola" ~ nombre ~ "!" }} volvería (suponiendo que el nombre es 'John') ¡Hola John !. - http://twig.sensiolabs.org/doc/templates.html#other-operators

Y aquí hay un ejemplo en otro lugar de los documentos :

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

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

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

En este caso, donde desea generar texto plano y una variable, puede hacerlo así:

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

Si desea concatenar algunas variables, la solución de alessandro1997 sería mucho mejor.

alghimo
fuente
2
esto no funciona para mí, porque tengo que url_encode toda la cadena con otro filtro ...
stoefln
14
{{ ['foo', 'bar'|capitalize]|join }}

Como puede ver, esto funciona con filtros y funciones sin necesidad de usar seten una línea separada.

Simon Epskamp
fuente
11

Siempre que necesite usar un filtro con una cadena concatenada (o una operación matemática básica) debe envolverlo con (). P.ej.:

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

lsouza
fuente
1
Muy servicial, gracias. Necesitaba concatenar variables para usarlas como clave de traducción.
afilina
6

En Symfony puede usar esto para protocolo y host:

{{ app.request.schemeAndHttpHost }}

Aunque @ alessandro1997 dio una respuesta perfecta sobre la concatenación.

Minras
fuente
6

Puedes usar ~como{{ foo ~ 'inline string' ~ bar.fieldName }}

Pero también puede crear su propia concatfunción para usarla como en su pregunta
{{ concat('http://', app.request.host) }}:

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

En app/config/services.yml:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }
luchaninov
fuente
Una muy buena solución
Daniel
3

Respuesta rápida (TL; DR)

  • La concatenación de cadenas de ramitas también se puede hacer con el format()filtro

Respuesta detallada

Contexto

  • Ramita 2.x
  • Cadena de construcción y concatenación

Problema

  • Escenario: DeveloperGailSim desea hacer la concatenación de cadenas en Twig
    • Otras respuestas en este hilo ya abordan el operador concat
    • Esta respuesta se centra en el formatfiltro que es más expresivo.

Solución

  • Enfoque alternativo es usar el formatfiltro
  • El formatfiltro funciona como la sprintffunción en otros lenguajes de programación.
  • El formatfiltro puede ser menos engorroso que el operador ~ para cadenas más complejas

Ejemplo00

  • ejemplo00 cuerda concat desnuda

    Formato {{"% s% s% s!" | ('alpha', 'bravo', 'charlie')}}
    
    --- resultado -
    
    alphabravocharlie!
    
    

Ejemplo01

  • ejemplo01 cadena concat con texto intermedio

    {{"¡El% s en% s cae principalmente en el formato% s!" | ('Alpha', 'bravo', 'charlie')}}
    
    --- resultado -
    
    ¡El alfa en bravo cae principalmente en el charlie!
    
    

Ejemplo02

  • ejemplo02 cadena concat con formato numérico
  • sigue la misma sintaxis que sprintfen otros idiomas

    {{"El% 04d en% 04d cae principalmente en el formato% s!" | (2,3, 'árbol')}}
    
    --- resultado -
    
    ¡El 0002 en 0003 cae principalmente en el árbol!
    
    

Ver también

dreftymac
fuente
1

Para mezclar cadenas, variables y traducciones, simplemente hago lo siguiente:

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

A pesar de que todo está mezclado, funciona a las mil maravillas.

Gingi
fuente
-1

El delimitador "{{...}}" también se puede usar dentro de cadenas:

"http://{{ app.request.host }}"
usuario2345998
fuente