วิธีการเชื่อมสตริงเข้าด้วยกันในทวิก


คำตอบ:


872

สิ่งนี้จะทำงานได้ดี:

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

ในการเพิ่มตัวกรอง - เช่น 'trans' - ในการใช้แท็กเดียวกัน

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

ขณะที่Adam Elsodaney ชี้ให้เห็นคุณยังสามารถใช้การแก้ไขสตริงได้ซึ่งต้องใช้สตริงที่มีเครื่องหมายคำพูดคู่:

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

3
ขอบคุณสำหรับคำตอบ แต่ปรากฏว่า | ตัวกรอง trans ใช้งานไม่ได้กับสิ่งนั้น (เช่น: {{'test_' ~ name | trans}} จะไม่แปลรายการของฉันคุณมีความคิดว่าจะทำเช่นนั้นได้อย่างไรขอบคุณ!
guillaumepotier

12
ใช่คุณต้องสร้างตัวแปรเพื่อเก็บสตริงที่ต่อกัน {% set foo = 'http://' ~ app.request.host %}เช่น: และจากนั้นคุณสามารถทำได้: {{ foo | trans }}.
Alessandro Desantis

75
การแปลในบรรทัดเดียว: {{('test_' ~ name) | trans}}
Johnny

6
ขอบคุณ. ดังนั้นปัญหาคือตัวกรองมีความสำคัญมากกว่าตัวดำเนินการเรียงต่อกัน
Alessandro Desantis

สิ่งนี้ทำงานให้ฉันกับสตริง concat ที่ส่งผ่านไปยังฟังก์ชันเป็นอาร์กิวเมนต์เดียวโดยมีตัวกรองบนตัวแปรและฟังก์ชันโทเค็นเอง: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}ไม่จำเป็นต้องมีตัวแปรเพิ่มเติม
Wesley Murch


26

ผู้ประกอบการที่คุณกำลังมองหาคือ Tilde (~) อย่างที่ Alessandro พูดและนี่คือในเอกสารประกอบ:

~: แปลงตัวถูกดำเนินการทั้งหมดเป็นสตริงและเชื่อมต่อพวกมันเข้าด้วยกัน {{"Hello" ~ name ~ "!" }} จะส่งคืน (สมมติว่าชื่อคือ 'John') Hello John! - 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 }

ทางออกที่ดีมาก
Daniel

3

คำตอบด่วน (TL; DR)

  • การต่อสตริง Twig อาจทำได้ด้วยformat()ตัวกรอง

คำตอบโดยละเอียด

บริบท

  • Twig 2.x
  • การสร้างสายอักขระและการต่อข้อมูล

ปัญหา

  • สถานการณ์จำลอง: DeveloperGailSim ต้องการทำการเชื่อมต่อสตริงใน Twig
    • คำตอบอื่น ๆ ในกระทู้นี้ได้กล่าวถึงผู้ประกอบการเชื่อม
    • คำตอบนี้มุ่งเน้นไปที่formatตัวกรองซึ่งแสดงออกมากขึ้น

สารละลาย

  • แนวทางอื่นคือการใช้formatตัวกรอง
  • formatกรองการทำงานเช่นมีsprintfฟังก์ชั่นในการเขียนโปรแกรมภาษาอื่น ๆ
  • formatกรองอาจจะยุ่งยากน้อยกว่าผู้ประกอบการ ~ สำหรับสตริงที่ซับซ้อนมากขึ้น

Example00

  • สตริงตัวอย่าง example00

    {{"% s% s% s!" | รูปแบบ ('alpha', 'bravo', 'charlie')}}
    
    --- ผลลัพธ์ --
    
    alphabravocharlie!
    
    

Example01

  • สตริงการเชื่อมต่อ example01 พร้อมข้อความที่แทรกเข้ามา

    {{"% s ใน% s อยู่ในรูปแบบ% s!" | รูปแบบ ('alpha', 'bravo', 'charlie')}}
    
    --- ผลลัพธ์ --
    
    อัลฟาในไชโยตกอยู่กับชาร์ลีเป็นหลัก!
    
    

Example02

  • สตริง concat ตัวอย่าง 02 พร้อมการจัดรูปแบบตัวเลข
  • ตามไวยากรณ์เดียวกันsprintfในภาษาอื่น ๆ

    {{"% 04d ใน% 04d ตรงกับ% s!" | รูปแบบ (2,3, 'tree')}}
    
    --- ผลลัพธ์ --
    
    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>
    ' %}

แม้จะมีทุกอย่างปะปน แต่ก็ใช้งานได้เหมือนมีเสน่ห์


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.