Как соединить строки в ветке - PullRequest
396 голосов
/ 09 октября 2011

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

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

Ответы [ 11 ]

784 голосов
/ 09 октября 2011

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

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

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

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

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

{{ "http://#{app.request.host}" }}
79 голосов
/ 11 июля 2014

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

{{ "http://#{app.request.host}" }}
23 голосов
/ 01 февраля 2014

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

~: преобразует все операнды в строки и объединяет их. {{ "Привет «~ name ~»! »}} вернется (при условии, что имя« Джон »). Привет, Джон! & ndash; 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 #}
21 голосов
/ 09 октября 2011

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

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

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

12 голосов
/ 11 июня 2012
{{ ['foo', 'bar'|capitalize]|join }}

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

11 голосов
/ 28 июля 2013

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

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

6 голосов
/ 07 мая 2013

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

{{ app.request.schemeAndHttpHost }}

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

5 голосов
/ 11 ноября 2015

Вы можете использовать ~ как {{ 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 }
1 голос
/ 11 марта 2017

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

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

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

Контекст

  • Веточка 2.x
  • Построение и объединение строк

Задача

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

Решение

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

Example00

  • example00 string concat bare

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

Example01

  • example01 string concat with промежуточный текст

    
    {{ "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 Строка 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!
    
    

См. также

1 голос
/ 10 января 2014

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

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

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

...