Empty variable output using Twig - twig

I have a slim/paris/twig application and I have a strange problem with the output.
This is my code:
The title: {{ share.title }}
The output is nothing.
But if I use:
The title {{ share.title | lower }}
The output is:
The title first title
{{ share.title | raw }} works too, but I don't want to use it because it shows accented characteres as weird characters.
Any idea how to solve this ?
Thanks

Related

Jinja2 truncate string variable not working

My Python application is using Jinja for the front end. I am trying to truncate the variable that is a string, however it is not working.
I can truncate a string but not a variable.
This fails to truncate:
{{ pagetitle | truncate(9,True,'') }}
This truncates to foo bar b:
{{ "foo bar baz qux"|truncate(9,True,'') }}
I think I have figured this out.
It appears to only trim phrases? {{ "foo bar baz qux"|truncate(9,True,'') }} will truncate, however {{ "foobarbazqux"|truncate(9,True,'') }} will not truncate.
There is a fourth parameter to truncate, and this is the one allowing you to achieve what you are looking for.
Strings that only exceed the length by the tolerance margin given in the fourth parameter will not be truncated.
So, given:
{{ 'foobarbazqux' | truncate(9, True, '', 0) }}
This yields:
foobarbaz
So, in your case:
{{ pagetitle | truncate(9, True, '', 0) }}
This said, since you are using truncate without an ellipsis and want to cut in word (the second parameter is True), you could also consider going for a simpler slice:
{{ 'foobarbazqux'[0:9] }}
So, in your case:
{{ pagetitle[0:9] }}
I had to add an optional leeway value. Not sure what the leeway value is doing. But it's truncating correctly.
pagetitle='whateverwhatever'
{{ pagetitle | truncate(9,True,'',0) }}

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,',') }}

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