dtraft
dtraft

Reputation: 43

Applying twig filters in Drupal 8 Views Template

I'm building a themed view in Drupal 8 using twig. I'd like to use twig filters on the row.content variable in the views-view-unformatted.html.twig template.

It seems that row.content is an array so twig's string manipulation doesn't work. However, it prints onto the page as a string (view is just a list of taxonomy terms).

What I'd like to do is slugify the output so taxonomy terms with spaces can have valid hrefs. See the replace filter in the code below.

<ul class="nav nav-tabs" role="tablist">
{% for row in rows %}
  <li role="presentation" class="{{loop.first ? 'active' : ''}}">
    <a href="#{{row.content | replace({" ", "-"})}}" aria-controls="{{row.content}}" role="tab" data-toggle="tab">{{row.content}}</a>
  </li>
{% endfor %}
</ul>

This will just output <a href="#">. Does anyone know how to access the raw text value that is output during twigs interpolation?

Thanks!

Upvotes: 2

Views: 4798

Answers (1)

Macronomicus
Macronomicus

Reputation: 61

I ran into this myself it was difficult because kint and dump crashes on views. there is a quick workaround to get to the bits though, put this under {% for row in rows %} in your twig views style template.

<ol>
{% for key, value in row.content %}
  <li>{{ key }}</li>
{% endfor %}
</ol>  

load the page with that & gives you the keys to see, I checked them each with the following dump command, just added underneath to test.

{{ dump(row.content['#row']) }}

The above dump showed all the goods in #row, where I dug in and found the field I wanted inside _entity (may be different for you), then I wanted to replace spaces with dash and force lowercase.

Everything past row.content['#row'] is likely different for you, you'll need to dig in the array a bit with the dump command mentioned above. Below is the line that got me what I wanted.

{{ row.content['#row']._entity.title[0].value|replace(' ', '-')|lower }}

Below is twig template example. For filename change viewname and block-3 to your setup.

views-view-unformatted--viewname--block-3.html.twig

{% for row in rows %}
    {%
        set row_classes = [
            default_row_class ? 'views-row',
            'something',
            'kint-cant',
        ]
    %}
    {# My field value unformatted #}
    <!-- {{ row.content['#row']._entity.title[0].value }} --> 

    <section{{ row.attributes.addClass(row_classes) }} id="{{ row.content['#row']._entity.title[0].value|replace(' ', '-')|lower }}">
        {{ row.content }}
    </section>
{% endfor %}

Im sure there are plenty of other ways to do this, but it worked for me as a quick solution to print out views fields in the style template, which is really useful.

Upvotes: 1

Related Questions