8

I am creating a custom template for my theme and I am constructing a page.html.twig page. I want to call of the individual node fields into separate rows. I have been able to successfully display everything except the paragraph field.

I have tried.

{{ node.field_benefits }}
{{ node.field_benefits.value }}
{{ paragraph.field_benefits }}
{{ paragraph.field_benefits.value }}
{{ node.paragraphs.field_benefits }}

And nothing has worked. Does anyone have any idea of the correct structure to call in the paragraph module?

Or would a for function work

{% if node.field_benefits %}
{% for field_items in node.field_benefits %}
{{ field_item.value }}
{% endfor %}
{% endif %}
3
  • page.html.twig doesn't handle nodes... only the overall page template. You are using the wrong template. I suggest you override the node template instead (or at least read up on the way twig templates are accessed). Also, turning on twig debug and looking at the source code will help you ascertain which template you should be overriding.
    – NikLP
    Feb 26, 2016 at 20:08
  • Ok @NikLP I moved everything to the node level, but I am still unable to render the paragraphs module - I am using the field that I have obtained from debugging and kint and still it shows an empty row Feb 26, 2016 at 22:22
  • Maybe check this out? drupal.org/node/2444893
    – NikLP
    Feb 29, 2016 at 11:29

1 Answer 1

7

First add a paragraph--your_paragraph_machine_name.html.twig to the templates directory of your theme.

Accessing your paragraph fields can be done by adding twig variables in a format similar to {{ content.field_your_field }}.

If you want only the field value, that's a little trickier. For instance if you had a List (text) field and wanted to get the value from the selected option, you could do something like:

{% for item in content.field_select_list %}
  {% if item is iterable %}
    {% for key,value in item %}
      {% if not value is iterable %}
        {% if key == '#markup' %}
          {{ value }}
        {% endif %}
      {% endif %}
    {% endfor %}
  {% endif %}
{% endfor %}

You can always run a {{ dump(content) }} to see the structure and get the values you're looking for. Hope this helps!

EDIT: You can avoid all the silly nested loops. The above example should be written like:

{% set value = content.field_select_list.0['#markup'] %}
{{ value }}

For a Text (plain) field it might look something like:

{{ content.field_text.0['#context'].value }}

To get a URL value from a Link field I've seen suggestions like:

{{ content.field_link['#items'].0.value.uri }}

But it would have an "internal:/" prefix, so I've had better luck with something like this:

{{ content.field_link.0['#title'] %}
2
  • You can use paragraph.field_my_text.value in any paragraph template to output the plain, unformated value, just like node.field_my_text.value in a node template. May 15, 2017 at 8:05
  • how do you print paragraph--your_paragraph_machine_name.html.twig from your main template?
    – Sam
    Nov 4, 2018 at 16:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.