Как объединить строки в twig

Кто-нибудь знает, как объединить строки в ветке? Я хочу сделать что-то вроде:

{{ concat('http://', app.request.host) }}

person stoefln    schedule 09.10.2011    source источник


Ответы (11)


Это должно работать нормально:

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

Чтобы добавить фильтр - например, «транс» - в тот же тег, используйте

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

Как указывает Адам Элсодани, вы также можете использовать строковая интерполяция, для этого требуются строки в двойных кавычках:

{{ "http://#{app.request.host}" }}
person Alessandro Desantis    schedule 09.10.2011
comment
Спасибо за ответ. Но похоже, что | фильтр trans не работает с этим (например: {{'test_' ~ name | trans}} не переводит мои элементы. У вас есть идеи, как это сделать? thx! - person guillaumepotier; 08.01.2012
comment
Да, вам нужно создать переменную для хранения объединенной строки. Например: {% set foo = 'http://' ~ app.request.host %}. И тогда вы можете сделать: {{ foo | trans }}. - person Alessandro Desantis; 08.01.2012
comment
Перевод одной строкой: {{('test_' ~ name) | транс}} - person Johnny; 04.03.2012
comment
Спасибо. Таким образом, проблема в том, что фильтры имеют более высокий приоритет, чем оператор конкатенации. - person Alessandro Desantis; 04.03.2012
comment
Это помогло мне объединить строки, переданные в функцию как один аргумент, с фильтрами для переменной и самого токена функции: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }} Нет необходимости в дополнительной переменной. - person Wesley Murch; 09.03.2012
comment
Спасибо за ваш пост !! Это сэкономило мне много времени на решение этой проблемы. - person Calios; 18.06.2014
comment
Спасибо! Заключение конкатенации в круглые скобки помогло с trans. - person trickyzter; 26.04.2017
comment
Обратите внимание, что знак решетки должен стоять перед открытой фигурной скобкой для интерполяции. Также это должны быть двойные кавычки. - person Markus Zeller; 08.08.2017

Также малоизвестной функцией Twig является строковая интерполяция. :

{{ "http://#{app.request.host}" }}
person Adam Elsodaney    schedule 11.07.2014
comment
Приятная особенность. Помните, что только строки в двойных кавычках! - person bzeaman; 18.11.2014

Оператор, который вы ищете, - это тильда (~), как сказал Алессандро, и вот он в документации:

~: Преобразует все операнды в строки и объединяет их. {{"Привет" ~ имя ~ "!" }} вернет (при условии, что имя - «Джон») 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 #}
person Nabil Kadimi    schedule 01.02.2014

В этом случае, когда вы хотите вывести простой текст и переменную, вы можете сделать это следующим образом:

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

Если вы хотите объединить некоторые переменные, решение alessandro1997 было бы намного лучше.

person alghimo    schedule 09.10.2011
comment
это не работает для меня, потому что мне нужно url_encode всей строки с другим фильтром ... - person stoefln; 10.10.2011

{{ ['foo', 'bar'|capitalize]|join }}

Как видите, это работает с фильтрами и функциями без необходимости использовать set в отдельной строке.

person Simon Epskamp    schedule 11.06.2012

Всякий раз, когда вам нужно использовать фильтр с конкатенированной строкой (или простой математической операцией), вы должны заключить его в (). Например.:

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

person lsouza    schedule 28.07.2013
comment
Очень полезно, спасибо. Мне нужно было объединить переменные для использования в качестве ключа перевода. - person afilina; 15.01.2014

В Symfony вы можете использовать это для протокола и хоста:

{{ app.request.schemeAndHttpHost }}

Хотя @ alessandro1997 дал прекрасный ответ о конкатенации.

person Minras    schedule 07.05.2013

Вы можете использовать ~ как {{ 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 }
person luchaninov    schedule 10.11.2015

Быстрый ответ (TL; DR)

  • Объединение строк Twig также может быть выполнено с помощью фильтра format()

Подробный ответ

Контекст

  • Twig 2.x
  • Построение и конкатенация строк

Проблема

  • Scenario: DeveloperGailSim wishes to do string concatenation in Twig
    • Other answers in this thread already address the concat operator
    • В этом ответе основное внимание уделяется фильтру format, который более выразителен.

Решение

  • Альтернативный подход - использовать фильтр format
  • Фильтр format работает так же, как функция sprintf в других языках программирования.
  • Фильтр format может быть менее громоздким, чем оператор ~ для более сложных строк.

Пример00

  • example00 строка concat голая

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

Example01

  • 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!
    
    

Пример02

  • example02 string concat с числовым форматированием
  • имеет тот же синтаксис, что и sprintf на других языках

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

Смотрите также

person dreftymac    schedule 10.03.2017

Чтобы смешивать строки, переменные и переводы, я просто делаю следующее:

    {% 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>
    ' %}

Несмотря на то, что все перемешано, это работает как шарм.

person Gingi    schedule 10.01.2014

Разделитель "{{...}}" также может использоваться внутри строк:

"http://{{ app.request.host }}"
person user2345998    schedule 14.07.2015