Come concatenare le stringhe in un ramoscello


Risposte:


872

Questo dovrebbe funzionare bene:

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

Per aggiungere un filtro, come "trans", utilizzare lo stesso tag

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

Come sottolinea Adam Elsodaney , puoi anche usare l'interpolazione di stringhe , questo richiede stringhe tra virgolette doppie:

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

3
Grazie per la risposta. Ma sembra che | il filtro trans non funziona su questo (ad esempio: {{'test_' ~ name | trans}} non tradurrà i miei articoli. Hai idea di come farlo? grazie!
guillaumepotier

12
Sì, devi creare una variabile per contenere la stringa concatenata. Ad esempio: {% set foo = 'http://' ~ app.request.host %}. E allora si può fare: {{ foo | trans }}.
Alessandro Desantis,

75
Traduzione in una riga: {{('test_' ~ name) | trans}}
Johnny

6
Grazie. Quindi il problema è che i filtri hanno una precedenza maggiore rispetto all'operatore di concatenazione.
Alessandro Desantis,

Ciò ha funzionato per me concatenare le stringhe passate in una funzione come un argomento, con filtri sulla variabile e il token della funzione stessa: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}non è necessaria una variabile aggiuntiva.
Wesley Murch il


26

L'operatore che stai cercando è Tilde (~), come ha detto Alessandro, ed eccolo nella documentazione:

~: Converte tutti gli operandi in stringhe e li concatena. {{"Ciao" ~ nome ~ "!" }} ritornerebbe (supponendo che il nome sia "John") Ciao John !. - http://twig.sensiolabs.org/doc/templates.html#other-operators

Ed ecco un esempio da qualche altra parte nei documenti :

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

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

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

22

In questo caso, dove si desidera generare testo normale e una variabile, è possibile farlo in questo modo:

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

Se si desidera concatenare alcune variabili, la soluzione di alessandro1997 sarebbe molto meglio.


2
questo non funziona per me, perché devo url_encode l'intera stringa con un altro filtro ...
stoefln

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

Come puoi vedere, funziona con filtri e funzioni senza la necessità di utilizzarli setsu una linea separata.


11

Ogni volta che devi usare un filtro con una stringa concatenata (o un'operazione matematica di base), dovresti avvolgerlo con (). Per esempio.:

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


1
Molto utile, grazie. Avevo bisogno di concatenare le variabili per l'uso come chiave di traduzione.
afilina,

6

In Symfony puoi usarlo per protocollo e host:

{{ app.request.schemeAndHttpHost }}

Anche se @ alessandro1997 ha dato una risposta perfetta sulla concatenazione.


6

Puoi usare ~come{{ foo ~ 'inline string' ~ bar.fieldName }}

Ma puoi anche creare la tua concatfunzione per usarla come nella tua domanda
{{ concat('http://', app.request.host) }}:

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

In app/config/services.yml:

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

Un'ottima soluzione
Daniel

3

Risposta rapida (TL; DR)

  • La concatenazione di stringhe di ramoscelli può essere eseguita anche con il format()filtro

Risposta dettagliata

Contesto

  • Ramoscello 2.x
  • Costruzione di stringhe e concatenazione

Problema

  • Scenario: DeveloperGailSim desidera eseguire la concatenazione di stringhe in Twig
    • Altre risposte in questo thread sono già indirizzate all'operatore concat
    • Questa risposta si concentra sul formatfiltro che è più espressivo

Soluzione

  • Approccio alternativo è utilizzare il formatfiltro
  • Il formatfiltro funziona come la sprintffunzione in altri linguaggi di programmazione
  • Il formatfiltro può essere meno ingombrante dell'operatore ~ ​​per stringhe più complesse

Example00

  • stringa di esempio00 concat nuda

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

Example01

  • stringa di esempio01 concat con il testo intermedio

    {{"% S in% s ricade principalmente sul formato% s!" | ('Alpha', 'bravo', 'charlie')}}
    
    --- risultato -
    
    L'alfa in bravo cade principalmente sul charlie!
    
    

Example02

  • stringa di esempio02 concat con formattazione numerica
  • segue la stessa sintassi delle sprintfaltre lingue

    {{"Il% 04d in% 04d rientra principalmente nel formato% s!" | (2,3, 'albero')}}
    
    --- risultato -
    
    Il 0002 in 0003 cade principalmente sull'albero!
    
    

Guarda anche


1

Per mescolare stringhe, variabili e traduzioni, faccio semplicemente quanto segue:

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

Nonostante tutto sia confuso, funziona come un fascino.


-1

Il delimitatore "{{...}}" può essere utilizzato anche nelle stringhe:

"http://{{ app.request.host }}"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.