Jak połączyć łańcuchy w gałązkę

Odpowiedzi:

872

To powinno działać dobrze:

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

Aby dodać filtr - na przykład „trans” - użyj tego samego znacznika

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

Jak zauważa Adam Elsodaney , można również użyć interpolacji ciągów , wymaga to ciągów podwójnych:

{{ "http://#{app.request.host}" }}
Alessandro Desantis
źródło
3
Dziękuję za odpowiedź. Ale wydaje się, że | filtr trans nie działa w tym przypadku (np. {{'' test_ '~ name | trans}} nie tłumaczy moich przedmiotów. Czy masz pomysł jak to zrobić? thx!
guillaumepotier
12
Tak, musisz utworzyć zmienną do przechowywania połączonego łańcucha. Np {% set foo = 'http://' ~ app.request.host %}. : A potem można zrobić: {{ foo | trans }}.
Alessandro Desantis
75
Tłumaczenie w jednym wierszu: {{('test_' ~ name) | trans}}
Johnny
6
Dziękuję Ci. Problem polega na tym, że filtry mają wyższy priorytet niż operator konkatenacji.
Alessandro Desantis
Pomogło mi to połączyć łańcuchy przekazane do funkcji jako jeden argument, z filtrami w zmiennej i samym tokenie funkcji: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}Nie potrzeba dodatkowej zmiennej.
Wesley Murch,
90

Również mało znaną funkcją w Twig jest interpolacja łańcuchów :

{{ "http://#{app.request.host}" }}
Adam Elsodaney
źródło
20
Fajna funkcja. Uważaj tylko na ciągi cudzysłowów!
bzeaman
26

Operatorem, którego szukasz, jest Tilde (~), jak powiedział Alessandro, a oto dokumentacja:

~: Konwertuje wszystkie operandy na ciągi i łączy je. {{„„ Hello ”~ name ~”! ” }} wróci (zakładając, że nazywa się „John”) Witaj John! - http://twig.sensiolabs.org/doc/templates.html#other-operators

A oto przykład gdzieś w dokumentach :

{% set greeting = 'Hello' %}
{% set name = 'Fabien' %}

{{ greeting ~ name|lower }}   {# Hello fabien #}

{# use parenthesis to change precedence #}
{{ (greeting ~ name)|lower }} {# hello fabien #}
Nabil Kadimi
źródło
22

W tym przypadku, gdy chcesz wyprowadzić zwykły tekst i zmienną, możesz to zrobić w następujący sposób:

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

Jeśli chcesz połączyć niektóre zmienne, rozwiązanie alessandro1997 byłoby znacznie lepsze.

alghimo
źródło
2
to nie działa dla mnie, ponieważ muszę url_encode cały łańcuch z innym filtrem ...
stoefln 10.10.11
14
{{ ['foo', 'bar'|capitalize]|join }}

Jak widać, działa to z filtrami i funkcjami bez konieczności używania setosobnej linii.

Simon Epskamp
źródło
11

Ilekroć musisz użyć filtru z połączonym łańcuchem (lub podstawową operacją matematyczną), powinieneś owinąć go za pomocą (). Na przykład.:

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

lsouza
źródło
1
Bardzo pomocny, dzięki. Musiałem połączyć zmienne do użycia jako klucz tłumaczenia.
afilina
6

W Symfony możesz użyć tego dla protokołu i hosta:

{{ app.request.schemeAndHttpHost }}

Chociaż @ alessandro1997 udzielił doskonałej odpowiedzi na temat konkatenacji.

Minras
źródło
6

Możesz użyć ~jak{{ foo ~ 'inline string' ~ bar.fieldName }}

Ale możesz także utworzyć własną concatfunkcję, aby używać jej tak jak w pytaniu
{{ concat('http://', app.request.host) }}:

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

W app/config/services.yml:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }
Luchaninov
źródło
Bardzo dobre rozwiązanie
Daniel
3

Szybka odpowiedź (TL; DR)

  • Łączenie łańcuchów gałązek można również wykonać za pomocą format()filtra

Szczegółowa odpowiedź

Kontekst

  • Gałązka 2.x
  • Budowanie i łączenie strun

Problem

  • Scenariusz: DeveloperGailSim chce dokonać łączenia łańcuchów w Twig
    • Inne odpowiedzi w tym wątku dotyczą już operatora konkat
    • Ta odpowiedź koncentruje się na formatfiltrze, który jest bardziej ekspresyjny

Rozwiązanie

  • Alternatywnym podejściem jest użycie formatfiltra
  • formatFiltr działa jak sprintffunkcja w innych językach programowania
  • formatFiltr może być mniej uciążliwe niż operator ~ o bardziej złożonych łańcuchów

Przykład 00

  • przykład00 ciąg konkat gołe

    {{"% s% s% s!" | format („alpha”, „bravo”, „charlie”)}}
    
    --- wynik -
    
    alphabravocharlie!
    
    

Przykład 01

  • przykład01 łańcuch łączący z interweniującym tekstem

    {{"% S w% s przypada głównie na format% s!" | („Alpha”, „bravo”, „charlie”)}}
    
    --- wynik -
    
    Alfa w brawo spada głównie na Charliego!
    
    

Przykład 02

  • przykład02 łańcuch konkat z formatowaniem numerycznym
  • podlega tej samej składni, co sprintfw innych językach

    {{"% 04d w% 04d przypada głównie na format% s!" | (2,3, „drzewo”)}}
    
    --- wynik -
    
    0002 w 0003 spada głównie na drzewo!
    
    

Zobacz też

dreftymac
źródło
1

Aby mieszać ciągi, zmienne i tłumaczenia, po prostu wykonuję następujące czynności:

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

Mimo wszystko pomieszane, działa jak urok.

Gingi
źródło
-1

Separator „{{...}}” może być również używany w ciągach znaków:

"http://{{ app.request.host }}"
użytkownik2345998
źródło