Cara menggabungkan string dalam ranting

447

Adakah yang tahu cara menggabungkan string dalam ranting? Saya ingin melakukan sesuatu seperti:

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

Jawaban:

872

Ini seharusnya bekerja dengan baik:

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

Untuk menambahkan filter - seperti 'trans' - dalam penggunaan tag yang sama

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

Seperti yang ditunjukkan oleh Adam Elsodaney , Anda juga dapat menggunakan interpolasi string , ini membutuhkan string yang dikutip ganda:

{{ "http://#{app.request.host}" }}
Alessandro Desantis
sumber
3
Terima kasih atas jawabannya. Tetapi tampaknya | filter trans tidak bekerja pada hal itu (mis .: {{'test_' ~ name | trans}} tidak akan menerjemahkan item saya. Apakah Anda punya ide bagaimana melakukannya? thx!
guillaumepotier
12
Ya, Anda harus membuat variabel untuk memegang string bersambung. Misalnya: {% set foo = 'http://' ~ app.request.host %}. Dan kemudian Anda bisa lakukan: {{ foo | trans }}.
Alessandro Desantis
75
Terjemahan dalam satu baris: {{('test_' ~ name) | trans}}
Johnny
6
Terima kasih. Jadi masalahnya adalah bahwa filter memiliki prioritas lebih tinggi daripada operator gabungan.
Alessandro Desantis
Ini berhasil bagi saya untuk merangkai string yang dialihkan ke fungsi sebagai satu argumen, dengan filter pada variabel dan fungsi token itu sendiri: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}Tidak perlu untuk variabel tambahan.
Wesley Murch
90

Fitur yang kurang dikenal di Twig adalah interpolasi string :

{{ "http://#{app.request.host}" }}
Adam Elsodaney
sumber
20
Fitur yang bagus. Berhati-hatilah, string yang hanya dikutip ganda!
bzeaman
26

Operator yang Anda cari adalah Tilde (~), seperti kata Alessandro, dan ini dia dalam dokumentasi:

~: Mengubah semua operan menjadi string dan menggabungkannya. {{"Hello" ~ name ~ "!" }} akan kembali (dengan asumsi nama adalah 'John') Halo John !. - http://twig.sensiolabs.org/doc/templates.html#other-operators

Dan berikut adalah contoh di tempat lain dalam dokumen :

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

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

{# use parenthesis to change precedence #}
{{ (greeting ~ name)|lower }} {# hello fabien #}
Nabil Kadimi
sumber
22

Dalam hal ini, di mana Anda ingin menampilkan teks biasa dan variabel, Anda bisa melakukannya seperti ini:

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

Jika Anda ingin menggabungkan beberapa variabel, solusi alessandro1997 akan jauh lebih baik.

alghimo
sumber
2
ini tidak berfungsi untuk saya, karena saya harus url_encode seluruh string dengan filter lain ...
stoefln
14
{{ ['foo', 'bar'|capitalize]|join }}

Seperti yang Anda lihat ini berfungsi dengan filter dan fungsi tanpa harus menggunakan setpada baris terpisah.

Simon Epskamp
sumber
11

Setiap kali Anda perlu menggunakan filter dengan string bersambung (atau operasi matematika dasar) Anda harus membungkusnya dengan (). Misalnya.:

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

lsouza
sumber
1
Terima kasih banyak. Saya perlu menyatukan variabel untuk digunakan sebagai kunci terjemahan.
afilina
6

Di Symfony Anda dapat menggunakan ini untuk protokol dan host:

{{ app.request.schemeAndHttpHost }}

Meskipun @ alessandro1997 memberikan jawaban yang sempurna tentang penggabungan.

Minra
sumber
6

Anda bisa menggunakan ~like{{ foo ~ 'inline string' ~ bar.fieldName }}

Tetapi Anda juga dapat membuat concatfungsi Anda sendiri untuk menggunakannya seperti dalam pertanyaan Anda
{{ concat('http://', app.request.host) }}::

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

Dalam app/config/services.yml:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }
luchaninov
sumber
Solusi yang sangat bagus
Daniel
3

Jawaban Cepat (TL; DR)

  • Penggabungan string ranting juga dapat dilakukan dengan format()filter

Jawaban terperinci

Konteks

  • Ranting 2.x
  • Membangun string dan penggabungan

Masalah

  • Skenario: DeveloperGailSim ingin melakukan penggabungan string di Twig
    • Jawaban lain di utas ini sudah ditujukan kepada operator concat
    • Jawaban ini berfokus pada formatfilter yang lebih ekspresif

Larutan

  • Pendekatan alternatif adalah dengan menggunakan formatfilter
  • The formatFilter bekerja seperti sprintffungsi dalam bahasa pemrograman lain
  • The formatFilter mungkin kurang rumit daripada operator ~ untuk string yang lebih kompleks

Contoh00

  • example00 string concat telanjang

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

Contoh01

  • example01 string concat dengan teks campur tangan

    {{"% S dalam% s terutama jatuh pada format% s!" ('Alpha', 'bravo', 'charlie')}}
    
    --- hasil -
    
    Alfa dalam bravo terutama jatuh pada charlie!
    
    

Contoh02

  • example02 string concat dengan pemformatan numerik
  • mengikuti sintaksis yang sama seperti sprintfdalam bahasa lain

    {{"% 04d dalam% 04d sebagian besar jatuh pada format% s!" | (2,3, 'pohon')}}
    
    --- hasil -
    
    0002 dalam 0003 jatuh terutama di pohon!
    
    

Lihat juga

dreftymac
sumber
1

Untuk memadukan string, variabel, dan terjemahan, saya cukup melakukan yang berikut:

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

Meskipun semuanya dicampuradukkan, itu bekerja seperti pesona.

Gingi
sumber
-1

"{{...}}" - pembatas juga dapat digunakan di dalam string:

"http://{{ app.request.host }}"
pengguna2345998
sumber