syntax - programacion - Cómo concatenar cadenas en ramita.
que es concatenar en excel (11)
¿Alguien sabe cómo concatenar cadenas en ramita? Quiero hacer algo como:
{{ concat(''http://'', app.request.host) }}
Respuesta rápida (TL; DR)
- La concatenación de cadenas de ramitas también se puede hacer con el filtro de
format()
Respuesta detallada
Contexto
- Ramita 2.x
- Construcción de cuerdas y concatenación.
Problema
- Escenario: DeveloperGailSim desea hacer concatenación de cadenas en Twig
- Otras respuestas en este hilo ya están dirigidas al operador concat
- Esta respuesta se centra en el filtro de
format
que es más expresivo.
Solución
- Enfoque alternativo es utilizar el filtro de
format
- El filtro de
format
funciona como la funciónsprintf
en otros lenguajes de programación - El filtro de
format
puede ser menos engorroso que el operador ~ para cadenas más complejas
Example00
example00 string concat bare
{{ "%s%s%s!"|format(''alpha'',''bravo'',''charlie'') }} --- result -- alphabravocharlie!
Example01
ejemplo01 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!
Ejemplo02
- Ejemplo de concat. de cadena 02 con formato numérico
sigue la misma sintaxis de
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!
Ver también
- http://twig.sensiolabs.org/doc/2.x/filters/format.html
- https://.com/tags/printf/info
El delimitador "{{...}}" también se puede usar dentro de las cadenas:
"http://{{ app.request.host }}"
El operador que busca es Tilde (~), como dijo Alessandro, y aquí está en la documentación:
~: Convierte todos los operandos en cadenas y los concatena. {{"Hola" ~ 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 en la documentación :
{% set greeting = ''Hello'' %}
{% set name = ''Fabien'' %}
{{ greeting ~ name|lower }} {# Hello fabien #}
{# use parenthesis to change precedence #}
{{ (greeting ~ name)|lower }} {# hello fabien #}
En Symfony puedes usar esto para protocolo y host:
{{ app.request.schemeAndHttpHost }}
Aunque @ alessandro1997 dio una respuesta perfecta sobre la concatenación.
En este caso, donde desea generar texto sin formato y una variable, puede hacerlo de la siguiente manera:
http://{{ app.request.host }}
Si desea concatenar algunas variables, la solución de alessandro1997 sería mucho mejor.
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 entre comillas dobles:
{{ "http://#{app.request.host}" }}
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 se mezcla, funciona como un encanto.
Puedes usar ~
like {{ 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 }
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 }}
También una característica poco conocida en Twig es la interpolación de cadenas :
{{ "http://#{app.request.host}" }}
{{ [''foo'', ''bar''|capitalize]|join }}
Como puede ver, esto funciona con filtros y funciones sin necesidad de usar el set
en una línea separada.