Add variable to a string in Twig - twig

I am trying to modify the value 7 in the following twig code:
{{ "now"|date_modify("+7 days")|date("Y/m/d") }}
The above works fine, but if I try this I get an error:
{{ "now"|date_modify("+" . user.days . " days")|date("Y/m/d") }}
Is it possible to edit the number of days dynamically in twig?

Try to use ~ to concatenate like this :
{{ "now"|date_modify("+" ~ user.days ~ " days")|date("Y/m/d") }}

Related

Twig equivalent of lcfirst

I'm not able to find a equivalent of lcfirst php function in Twig, my need is to lower only the first letter of a word ?
If such function doesn't exist, what is the best way to do it ?
As discussed in this issue on Github, you could use:
{{ foo[:1]|lower ~ foo[1:] }}
See this working example.
Just add the function into twig by chaining it with a filter, e.g.
$twig->addFilter(new \Twig\TwigFilter('lcfirst', 'lcfirst'));
Then use it inside any twig template like
{{ string | lcfirst }}
You can use a capitalize filter:
{{ 'my first car'|capitalize }}
{# outputs 'My first car' #}
https://twig.symfony.com/doc/1.x/filters/capitalize.html

Twig Join, display 0 value

I have an array of integers I am rendering with join in a twig template. If the value is zero, however, it is not displaying. Wondering if there is a way to resolve this easily?
Thanks
<b>Snow Last 24 Hours:</b> {{ report.snowLast24Hours|join(' - ') }} in
You can try this (with join and replace):
{{ (snowLast24Hours|join()|replace({'0':''}) is empty) ? '' : snowLast24Hours|join(' - ') }}
Or with join and trim:
{{ (snowLast24Hours|join()|trim('0') is empty) ? '' : snowLast24Hours|join(' - ') }}
Neither of the suggested solutions seemed to work and the '0' values kept getting stripped. I worked around this by printing each individual value rather than using join.
ie.
{{ snow.min }} - {{ snow.max }}

Drupal8 Twig - convert string to integer

I just started using twig in drupal8. I'm trying to calculate the difference between two numerical drupal8 variables using views.
field_goals_for: 24
field_goals_against: 3
field_goals_difference: should return 21 but returns 1
I tried already something like this (with and without number_formats):
{% set diff = field_goals_for|number_format - field_goals_against|number_format %}
{{ diff }}
I assume the problem is that the two variables are strings instead of int.
There is a way to convert them to int and return the correct result using twig? If not do you have any alternative solution to suggest?
EDIT:
I tried to SUM and also MULTIPLE the two values:
{{ field_goals_for }} = 24
{{ field_goals_against }} = 3
{{ field_goals_for - field_goals_against }} = 0
{{ field_goals_for + field_goals_against }} = 2
{{ field_goals_for * field_goals_against }} = 1
Why are they considered equal to 1 instead of their real value?
EDIT 2: I found the problem. The value that has been to used is field_goals_for__value instead of field_goals_for. Unfortunately I can't find a way to used both of them in the same text field.
stripping off tags was what did the trick for me!
{% set diff = field_goals_for|striptags - field_goals_against|striptags %}
{{ diff }}
try that
{{ diff["#markup"]|number_format(2,',') }}
It works for me.
I had a similar issue - I had to add '#markup' to get it to work.
{{items[0].content['#markup']|number_format/5*100}}
The number_format filter formats numbers. You can control the number of decimal places, decimal point, and thousands separator using the additional arguments.
As example:
{% set diff = field_goals_for - field_goals_against %}
{{ diff|number_format(2,',') }}
Will print:
21,00
Check here a working example.
Hope this help
The number_format filter was added in Twig 1.5
please check your twig version
(sorry this was initially a comment but since I can't comment yet, I wrote an answer)
Try
{{ diff.__toString|number_format(2,',') }}

concat string and variable in twig

I have this in my template
{{ ad.title_de }}
Now I'm incorporating multiple languages, so 'title_de' has to change
I also have a variable 'tld' which is one of de, en , fr
So I'd like to have something like
{% if tld == 'fr' %}
{{ ad.title_fr }}
etc
Any ideas?
Try using the attribute function.
http://twig.sensiolabs.org/doc/functions/attribute.html
attribute(ad, 'content_'~tld) should work.
Try with this:
{{ ad["title_" ~ tld] }}

Twig - using variable

I want to achive this is twig:
{{ form_widget(form.orderItems.0.enabled) }}
{{ form_widget(form.orderItems.1.enabled) }}
{{ form_widget(form.orderItems.2.enabled) }}
....
but the number to be a variable.
I tried this:
{% set index = 0 %}
{{ form_widget(form.orderItems.index.enabled) }}
Error: Method "index" for object "Symfony\Component\Form\FormView" does not exist
and this:
{{ form_widget(form.orderItems.{{index}}.enabled) }}
Error: Expected name or number
and this:
{{ form_widget(form.orderItems.~index~.enabled) }}
Error: Expected name or number
It is possible to achieve this :(
Some digging suggests you use the 'attribute' function - see Accessing array values using array key from Twig.
I suppose that would be something like
form_widget(attribute(form.orderItems, index).enabled)
Unfortunately I can't easily test that at the moment, but it should get you on the right track.
I am solving the same problem now and getting "expected name or number error" when I want to access variable dynamically.
I can not find simple answer, how to dynamically replace some part of variable in twig.
But It works without first dot as was first comment here.
{{ form[othervariable value].vars.label }}
and NOT
{{ form.[value].name }}

Resources