Cara menggabungkan string dalam ranting


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}" }}

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


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 #}

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.


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.


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


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.


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 }

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


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.


-1

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

"http://{{ app.request.host }}"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.