1

I have a Paragraphs bundle that has 2 fields. I want to have the value of the first field in the second field's template so I can combine it with {{ loop.index }} to make unique classes for a grid layout.

Is this possible using a preprocess function and a theme template?

  • You mean the field.html.twig template? Looking at the available variables there is no access to the entity or other fields. So without altering preprocessors I guess not. – Neograph734 Dec 24 '16 at 20:57
  • Oh, apologies, I understood you wanted to this without a preprocessor. Forget my previous comment... – Neograph734 Dec 24 '16 at 21:01
  • 1
    Instead of adding your div wrappers and class names in field.html.twig use node.html.twig, where you have access to both values. But since you're using paragraphs, in you case, it's probably the paragraphs template file. – No Sssweat Dec 25 '16 at 2:25
  • Yes, I am looking for a preprocess way of doing it. I don't think I can do it in the paragraph template because I need the loop.index that is in the field template to make the unique class. – thejimbirch Dec 25 '16 at 16:32
3

For non-paragraph fields, there is a node object available in the variables of the field template, so you can put this in a field.html.twig file:

{{ element['#object'].machine_name_of_other_field.value }}
2

Here is a solution that I came up with to solve this in the Paragraph template (paragraph--PARAGRAPH-NAME.html.twig), but I still think there is a better way using a preprocess.

{# Renders Grid Style field. #}
{% if content.field_grid_style|render %}
  {% set grid_style = content.field_grid_style['#items'].getString() %}
{% endif %}

{#
  Loops through the Column field here instead of the field template so we can
  set the grid_style class and add the loop index (key + 1)
#}
{% for key, item in content.field_column_content if key|first != '#' %}
  <div class="{{ grid_style }}--{{ key + 1 }}">{{ item }}</div>
{% endfor %}
0

Here is the solution for rendering one field inside second's field template.

Get the first field value from hook_preprocess_field.

function teachervision_preprocess_file_field(&$variables) {
  if ($variables['field_name'] == 'second_field_machine_name') {
    $node = \Drupal::routeMatch()->getParameter('node');
    $variables['first_field'] = '';
    if ($node && isset($node->first_field_machine_name->value)) {
      $variables['first_field'] = $node->first_field_machine_name->value;
    }
  }
}

Inside field template of second field, you can get this variable 'first_field' and do something like that

{% for item in items %}
  <div{{ attributes.addClass(classes, 'field__first_item') }}>{{ first_field }}</div>
  <div{{ attributes.addClass(classes, 'field__second_item') }}>{{ item.content }}</div>
{% endfor %}

Hope, it makes sense to you.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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