Cómo concatenar cadenas en ramita
¿Alguien sabe cómo concatenar cadenas en ramita? Quiero hacer algo como:
{{ concat('http://', app.request.host) }}
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}" }}
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}" }}
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.
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 #}
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.
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 }}
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.
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 }
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.
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ónsprintf
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
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 }}"
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