Кто-нибудь знает, как объединить строки в ветке? Я хочу сделать что-то вроде:
{{ concat('http://', app.request.host) }}
Кто-нибудь знает, как объединить строки в ветке? Я хочу сделать что-то вроде:
{{ concat('http://', app.request.host) }}
Это должно работать нормально:
{{ 'http://' ~ app.request.host }}
Чтобы добавить фильтр - например, «транс» - в тот же тег, используйте
{{ ('http://' ~ app.request.host) | trans }}
Как указывает Адам Элсодани, вы также можете использовать строковая интерполяция, для этого требуются строки в двойных кавычках:
{{ "http://#{app.request.host}" }}
{% set foo = 'http://' ~ app.request.host %}
. И тогда вы можете сделать: {{ foo | trans }}
.
- person Alessandro Desantis; 08.01.2012
{{ form_open('admin/files/?path='~file_path|urlencode)|raw }}
Нет необходимости в дополнительной переменной.
- person Wesley Murch; 09.03.2012
Также малоизвестной функцией Twig является строковая интерполяция. :
{{ "http://#{app.request.host}" }}
Оператор, который вы ищете, - это тильда (~), как сказал Алессандро, и вот он в документации:
~: Преобразует все операнды в строки и объединяет их. {{"Привет" ~ имя ~ "!" }} вернет (при условии, что имя - «Джон») Hello John !. http://twig.sensiolabs.org/doc/templates.html#other-operators
А вот пример где-то еще в документации:
{% set greeting = 'Hello' %}
{% set name = 'Fabien' %}
{{ greeting ~ name|lower }} {# Hello fabien #}
{# use parenthesis to change precedence #}
{{ (greeting ~ name)|lower }} {# hello fabien #}
В этом случае, когда вы хотите вывести простой текст и переменную, вы можете сделать это следующим образом:
http://{{ app.request.host }}
Если вы хотите объединить некоторые переменные, решение alessandro1997 было бы намного лучше.
{{ ['foo', 'bar'|capitalize]|join }}
Как видите, это работает с фильтрами и функциями без необходимости использовать set
в отдельной строке.
Всякий раз, когда вам нужно использовать фильтр с конкатенированной строкой (или простой математической операцией), вы должны заключить его в (). Например.:
{{ ('http://' ~ app.request.host) | url_encode }}
В Symfony вы можете использовать это для протокола и хоста:
{{ app.request.schemeAndHttpHost }}
Хотя @ alessandro1997 дал прекрасный ответ о конкатенации.
Вы можете использовать ~
как {{ foo ~ 'inline string' ~ bar.fieldName }}
Но вы также можете создать свою собственную concat
функцию, чтобы использовать ее, как в вашем вопросе: {{ concat('http://', app.request.host) }}
:
In 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';
}
}
In app/config/services.yml
:
services:
app.twig_extension:
class: AppBundle\Twig\AppExtension
public: false
tags:
- { name: twig.extension }
format()
format
, который более выразителен.format
format
работает так же, как функция sprintf
в других языках программирования.format
может быть менее громоздким, чем оператор ~ для более сложных строк.example00 строка concat голая
{{ "%s%s%s!"|format('alpha','bravo','charlie') }} --- result -- alphabravocharlie!
example01 строка concat с промежуточным текстом
{{ "The %s in %s falls mainly on the %s!"|format('alpha','bravo','charlie') }} --- result -- The alpha in bravo falls mainly on the charlie!
имеет тот же синтаксис, что и sprintf
на других языках
{{ "The %04d in %04d falls mainly on the %s!"|format(2,3,'tree') }} --- result -- The 0002 in 0003 falls mainly on the tree!
Чтобы смешивать строки, переменные и переводы, я просто делаю следующее:
{% 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>
' %}
Несмотря на то, что все перемешано, это работает как шарм.
Разделитель "{{...}}" также может использоваться внутри строк:
"http://{{ app.request.host }}"