Cómo concatenar cadenas en ramita


¿Alguien sabe cómo concatenar cadenas en ramita? Quiero hacer algo como:

{{ concat('http://', app.request.host) }}
Author: dreftymac, 2011-10-09

11 answers

Esto debería funcionar bien:

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

Para añadir un filtro - como 'trans' - en la misma etiqueta use

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

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

{{ "http://#{app.request.host}" }}
 718
Author: Alessandro Desantis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:30

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

{{ "http://#{app.request.host}" }}
 70
Author: Adam Elsodaney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-11 08:44:15

En este caso, donde desea generar texto sin formato y una variable, podría hacerlo de la siguiente manera:

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

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

 21
Author: alghimo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-09 17:49:27

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. {{ "Saludar "~ nombre ~ "!"}} regresaría (asumiendo 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 #}
 19
Author: Nabil Kadimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-06 16:39:36
{{ ['foo', 'bar'|capitalize]|join }}

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

 11
Author: Simon Epskamp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-11 12:15:46

Siempre que necesites usar un filtro con una cadena concatenada (o una operación matemática básica) deberías envolverlo con ()'s. Eg. :

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

 10
Author: lsouza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-28 17:53:05

En Symfony puedes usar esto para el protocolo y el host:

{{ app.request.schemeAndHttpHost }}

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

 6
Author: Minras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 16:26:41

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

Pero también puedes crear tu propia función concat para usarla como en tu 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 }
 4
Author: luchaninov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-10 22:58:49

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 como un encanto.

 1
Author: Gingi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-10 15:40:48

Respuesta rápida (TL;DR)

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

Respuesta detallada

Contexto

  • Ramita 2.x
  • Construcción y concatenación de cadenas

Problema

  • Escenario: DeveloperGailSim desea hacer concatenación de cadenas en Ramita
    • Otras respuestas en este hilo ya se dirigen al operador concat
    • Esta respuesta se centra en la format filtro que es más expresivo

Solución

  • El enfoque alternativo es usar el filtro format
  • El filtro format funciona como la función sprintf en otros lenguajes de programación
  • El filtro format puede ser menos engorroso que el operador ~ para cadenas más complejas

Example00

  • Example00 cadena concat bare

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

Example01

  • Example01 cadena concat con texto intermedio

    
    {{ "The %s in %s falls mainly on the %s!"|format('alpha','bravo','charlie') }}
    
    --- result --
    
    The alpha in bravo falls mainly on the charlie!
    
    

Example02

  • example02 cadena concat con formato numérico
  • Sigue la misma sintaxis que sprintf en otros idiomas

    
    {{ "The %04d in %04d falls mainly on the %s!"|format(2,3,'tree') }}
    
    --- result --
    
    The 0002 in 0003 falls mainly on the tree!
    
    

Véase también

 0
Author: dreftymac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-07 19:12:53

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

"http://{{ app.request.host }}"
 -1
Author: user2345998,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-14 09:07:40