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

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


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

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.


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.


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


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.


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 }

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


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.


-1

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

"http://{{ app.request.host }}"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.