Як з'єднати пасма в гілочку


Відповіді:


872

Це має добре працювати:

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

Щоб додати фільтр, як-от "trans", використовуйте те ж тег

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

Як зазначає Адам Елсодані , ви також можете використовувати інтерполяцію рядків , для цього потрібні рядки з подвійним цитуванням:

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

3
Дякую за відповідь Але виявляється, що | Транс-фільтр не працює на цьому (наприклад: {{'test_' ~ ім'я | trans}} не перекладе мої предмети. Чи маєте ви уявлення, як це зробити? thx!
guillaumepotier

12
Так, ви повинні створити змінну, щоб утримувати з'єднаний рядок. Наприклад: {% set foo = 'http://' ~ app.request.host %}. І тоді ви можете зробити: {{ foo | trans }}.
Алессандро Десантіс

75
Переклад в один рядок: {{('test_' ~ ім'я) | переклад}}
Джонні

6
Дякую. Отже, проблема полягає в тому, що фільтри мають вищий пріоритет, ніж оператор конкатенації.
Алессандро Десантіс

Це працювало для мене, щоб концетні рядки переходили у функцію як один аргумент, з фільтрами на змінну та функцією самої лексеми: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}Не потрібно зайвої змінної.
Веслі Мерч


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 було б набагато краще.


2
це не працює для мене, тому що мені доведеться url_encode цілу рядок іншим фільтром ...
stoefln

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

Як бачите, це працює з фільтрами та функціями, не потребуючи використання setокремої лінії.


11

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

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


1
Дуже корисно, дякую. Мені потрібно було об'єднати змінні для використання в якості ключа перекладу.
afilina

6

У Symfony ви можете використовувати це для протоколу та хоста:

{{ app.request.schemeAndHttpHost }}

Хоча @ alessandro1997 дав ідеальну відповідь про конкатенацію.


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()фільтром

Детальний відповідь

Контекст

  • Гілочка 2.х
  • Створення струн і конкатенація

Проблема

  • Сценарій: DeveloperGailSim бажає зробити об'єднання рядків у Twig
    • Інші відповіді в цій темі вже стосуються оператора concat
    • Ця відповідь фокусується на formatфільтрі, який є більш виразним

Рішення

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

Приклад00

  • example00 string string concat gore

    {{"% s% s% s!" | формат ("альфа", "браво", "Чарлі")}}
    
    --- результат -
    
    альфабравочарлі!
    
    

Приклад01

  • example01 string concat with inter interting text

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

Приклад02

  • example02 string concat з числовим форматуванням
  • дотримується того ж синтаксису, що і sprintfв інших мовах

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

Дивись також


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

Незважаючи на те, що все переплутано, це працює як шарм.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.