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

Ответы:

872

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

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

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

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

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

{{ "http://#{app.request.host}" }}
Алессандро Десантис
источник
3
Спасибо за ответ. Но похоже, что | Фильтр trans не работает с этим (например: {{'test_' ~ name | trans}} не будет переводить мои элементы. У вас есть идея, как это сделать? thx!
guillaumepotier
12
Да, вы должны создать переменную для хранения объединенной строки. Например: {% set foo = 'http://' ~ app.request.host %}. И тогда вы можете сделать: {{ foo | trans }}.
Алессандро Десантис
75
Перевод в одну строку: {{('test_' ~ name) | trans}}
Джонни
6
Спасибо. Таким образом, проблема в том, что фильтры имеют более высокий приоритет, чем оператор конкатенации.
Алессандро Десантис
Это помогло мне объединить строки, переданные в функцию как один аргумент, с фильтрами для переменной и самим токеном функции: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}нет необходимости в дополнительной переменной.
Уэсли Марч
90

Также малоизвестной особенностью в Twig является интерполяция строк :

{{ "http://#{app.request.host}" }}
Адам Элсодани
источник
20
Хорошая особенность. Знайте, только строки в двойных кавычках!
bzeaman
26

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

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

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

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

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

alghimo
источник
2
это не работает для меня, потому что я должен url_encode всю строку с другим фильтром ...
Stoefln
14
{{ ['foo', 'bar'|capitalize]|join }}

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

Саймон Эспкамп
источник
11

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

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

lsouza
источник
1
Очень полезно, спасибо. Мне нужно было объединить переменные для использования в качестве ключа перевода.
афилина
6

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

{{ app.request.schemeAndHttpHost }}

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

Minras
источник
6

Ты можешь использовать ~ как{{ foo ~ 'inline string' ~ bar.fieldName }}

Но вы также можете создать свою собственную concatфункцию, чтобы использовать ее, как в вашем вопросе:
{{ concat('http://', app.request.host) }} :

В 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';
    }
}

В app/config/services.yml:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }
Лучаниновыми
источник
Очень хорошее решение
Даниил
3

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

  • Конкатенация строк веток также может быть выполнена с помощью format()фильтра

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

контекст

  • Twig 2.x
  • Струнное строительство и конкатенация

проблема

  • Сценарий: DeveloperGailSim хочет сделать конкатенацию строк в Twig
    • Другие ответы в этой теме уже касаются оператора concat
    • Этот ответ фокусируется на formatфильтре, который является более выразительным

Решение

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

Example00

  • пример00 строка конкат голая

    {{"% s% s% s!" | format ('alpha', 'bravo', 'charlie')}}
    
    --- результат -
    
    alphabravocharlie!
    
    

Example01

  • строка example01, совпадающая с промежуточным текстом

    {{"% S в% s приходится в основном на формат% s!" | ("Альфа", "браво", "чарли")}}
    
    --- результат -
    
    Альфа в браво падает в основном на Чарли!
    
    

Example02

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

    {{"% 04d в% 04d в основном приходится на формат% s!" | | (2,3, 'tree')}}
    
    --- результат -
    
    0002 в 0003 падает в основном на дерево!
    
    

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

dreftymac
источник
1

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

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

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

Gingi
источник
-1

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

"http://{{ app.request.host }}"
user2345998
источник