Làm thế nào để nối chuỗi trong twig


Câu trả lời:


872

Điều này sẽ hoạt động tốt:

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

Để thêm bộ lọc - như 'trans' - trong cùng một thẻ, hãy sử dụng

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

Như Adam Elsodaney chỉ ra , bạn cũng có thể sử dụng phép nội suy chuỗi , điều này không yêu cầu chuỗi trích dẫn kép:

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

3
Cảm ơn bạn đã trả lời. Nhưng có vẻ như | xuyên lọc không làm việc trên đó (ví dụ: {{ 'test_' ~ name | xuyên}} sẽ không dịch các mặt hàng của tôi Bạn có một ý tưởng làm thế nào để làm điều đó thx.?!
guillaumepotier

12
Có, bạn phải tạo một biến để giữ chuỗi nối. Vd : {% set foo = 'http://' ~ app.request.host %}. Và sau đó bạn có thể làm : {{ foo | trans }}.
Alessandro Desantis

75
Dịch trong một dòng: {{('test_' ~ name) | trans}}
Johnny

6
Cảm ơn bạn. Vì vậy, vấn đề là các bộ lọc có độ ưu tiên cao hơn toán tử ghép.
Alessandro Desantis

Điều này làm việc cho tôi để nối các chuỗi được truyền vào một hàm dưới dạng một đối số, với các bộ lọc trên biến và mã thông báo hàm: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}Không cần thêm biến.
Wesley Murch

90

Ngoài ra một tính năng ít được biết đến trong Twig là nội suy chuỗi :

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

20
Tính năng tốt đẹp. Hãy nhận biết, chỉ trích dẫn hai chuỗi!
bzeaman

26

Toán tử mà bạn đang tìm kiếm là Tilde (~), như Alessandro đã nói, và đây là trong tài liệu:

~: Chuyển đổi tất cả các toán hạng thành chuỗi và nối chúng. {{"Xin chào" ~ tên ~ "!" }} sẽ trở lại (giả sử tên là 'John') Xin chào John!. - http://twig.sensiolabs.org/doc/temsheet.html#other-operators

Và đây là một ví dụ ở một nơi khác trong các tài liệu :

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

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

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

22

Trong trường hợp này, nơi bạn muốn xuất văn bản đơn giản và một biến, bạn có thể làm như thế này:

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

Nếu bạn muốn nối một số biến, giải pháp của alessandro1997 sẽ tốt hơn nhiều.


2
điều này không hiệu quả với tôi, vì tôi phải url_encode toàn bộ chuỗi bằng một bộ lọc khác ...
stoefln

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

Như bạn có thể thấy điều này hoạt động với các bộ lọc và chức năng mà không cần sử dụng settrên một dòng riêng biệt.


11

Bất cứ khi nào bạn cần sử dụng bộ lọc có chuỗi kết hợp (hoặc phép toán cơ bản), bạn nên bọc nó bằng (). Ví dụ.:

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


1
Rất hữu ích, cảm ơn. Tôi cần nối các biến để sử dụng làm khóa dịch.
afilina

6

Trong Symfony bạn có thể sử dụng điều này cho giao thức và máy chủ:

{{ app.request.schemeAndHttpHost }}

Mặc dù @ alessandro1997 đã đưa ra một câu trả lời hoàn hảo về sự kết hợp.


6

Bạn có thể sử dụng ~như{{ foo ~ 'inline string' ~ bar.fieldName }}

Nhưng bạn cũng có thể tạo concatchức năng của riêng mình để sử dụng nó như trong câu hỏi của bạn
{{ concat('http://', app.request.host) }}::

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

Trong app/config/services.yml:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }

Một giải pháp rất tốt
Daniel

3

Trả lời nhanh (TL; DR)

  • Việc ghép chuỗi Twig cũng có thể được thực hiện với format()bộ lọc

Trả lời chi tiết

Bối cảnh

  • Cành 2.x
  • Xây dựng chuỗi và nối

Vấn đề

  • Kịch bản: DeveloperGailSim muốn thực hiện nối chuỗi trong Twig
    • Các câu trả lời khác trong chủ đề này đã giải quyết toán tử concat
    • Câu trả lời này tập trung vào formatbộ lọc có tính biểu cảm cao hơn

Giải pháp

  • Phương pháp thay thế là sử dụng formatbộ lọc
  • Bộ formatlọc hoạt động giống như sprintfchức năng trong các ngôn ngữ lập trình khác
  • Bộ formatlọc có thể ít cồng kềnh hơn toán tử ~ cho các chuỗi phức tạp hơn

Ví dụ00

  • chuỗi concat trần

    {{"% s% s% s!" | định dạng ('alpha', 'bravo', 'charlie')}}
    
    --- kết quả --
    
    alphabravocharlie!
    
    

Ví dụ01

  • concat chuỗi example01 với văn bản can thiệp

    {{"% S trong% s rơi chủ yếu vào định dạng% s!" | ('Alpha', 'bravo', 'charlie')}}
    
    --- kết quả --
    
    Các alpha trong bravo rơi chủ yếu trên charlie!
    
    

Ví dụ02

  • concai chuỗi example02 với định dạng số
  • theo cú pháp giống như sprintftrong các ngôn ngữ khác

    {{"% 04d trong% 04d rơi chủ yếu vào định dạng% s!" | (2,3, 'cây')}}
    
    --- kết quả --
    
    0002 trong 0003 rơi chủ yếu trên cây!
    
    

Xem thêm


1

Để trộn chuỗi, biến và dịch tôi chỉ cần làm như sau:

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

Mặc dù mọi thứ được trộn lẫn, nó hoạt động như một nét duyên dáng.


-1

"{{...}}" - dấu phân cách cũng có thể được sử dụng trong các chuỗi:

"http://{{ app.request.host }}"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.