ChatGPT解决这个技术问题 Extra ChatGPT

How to concatenate strings in twig

Anyone knows how to concatenate strings in twig? I want to do something like:

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

b
bobbel

This should work fine:

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

To add a filter - like 'trans' - in the same tag use

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

As Adam Elsodaney points out, you can also use string interpolation, this does require double quoted strings:

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

Thanks for you answer. But it appears that | trans filter doesn't work on that (eg: {{ 'test_' ~ name | trans }} won't translate my items. Do you have an idea how to do that? thx!
Yes, you have to create a variable to hold the concatenated string. E.g.: {% set foo = 'http://' ~ app.request.host %}. And then you can do: {{ foo | trans }}.
Translation in one line: {{ ('test_' ~ name) | trans }}
Thank you. So the problem is that filters have higher precedence than the concatenation operator.
This worked for me to concat strings passed into a function as one argument, with filters on the variable and the function token itself: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }} No need for an extra variable.
A
Adam Elsodaney

Also a little known feature in Twig is string interpolation:

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

Nice feature. Be aware, double-quoted strings only!
N
Nabil Kadimi

The operator you are looking for is Tilde (~), like Alessandro said, and here it is in the documentation:

~: Converts all operands into strings and concatenates them. {{ "Hello " ~ name ~ "!" }} would return (assuming name is 'John') Hello John!. – http://twig.sensiolabs.org/doc/templates.html#other-operators

And here is an example somewhere else in the docs:

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

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

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

a
alghimo

In this case, where you want to output plain text and a variable, you could do it like this:

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

If you want to concatenate some variables, alessandro1997's solution would be much better.


this does not work for me, cause i have to url_encode the whole string with another filter...
S
Simon Epskamp
{{ ['foo', 'bar'|capitalize]|join }}

As you can see this works with filters and functions without needing to use set on a seperate line.


l
lsouza

Whenever you need to use a filter with a concatenated string (or a basic math operation) you should wrap it with ()'s. Eg.:

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


Very helpful, thanks. I needed to concatenate variables for use as a translation key.
l
luchaninov

You can use ~ like {{ foo ~ 'inline string' ~ bar.fieldName }}

But you can also create your own concat function to use it like in your question:
{{ 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 }

M
Minras

In Symfony you can use this for protocol and host:

{{ app.request.schemeAndHttpHost }}

Though @alessandro1997 gave a perfect answer about concatenation.


d
dreftymac

Quick Answer (TL;DR)

Twig string concatenation may also be done with the format() filter

Detailed Answer

Context

Twig 2.x

String building and concatenation

Problem

Scenario: DeveloperGailSim wishes to do string concatenation in Twig Other answers in this thread already address the concat operator This answer focuses on the format filter which is more expressive

Other answers in this thread already address the concat operator

This answer focuses on the format filter which is more expressive

Solution

Alternative approach is to use the format filter

The format filter works like the sprintf function in other programming languages

The format filter may be less cumbersome than the ~ operator for more complex strings

Example00

example00 string concat bare {{ "%s%s%s!"|format('alpha','bravo','charlie') }} --- result -- alphabravocharlie!

Example01

example01 string concat with intervening text {{ "The %s in %s falls mainly on the %s!"|format('alpha','bravo','charlie') }} --- result -- The alpha in bravo falls mainly on the charlie!

Example02

example02 string concat with numeric formatting

follows the same syntax as sprintf in other languages {{ "The %04d in %04d falls mainly on the %s!"|format(2,3,'tree') }} --- result -- The 0002 in 0003 falls mainly on the tree!

See also

http://twig.sensiolabs.org/doc/2.x/filters/format.html

https://stackoverflow.com/tags/printf/info


G
Gingi

To mix strings, variables and translations I simply do the following:

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

Despite everything being mixed up, it works like a charm.


u
user2345998

The "{{ ... }}"-delimiter can also be used within strings:

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