Element :: children ()과 같이 Twig의 자식 요소를 반복합니다.


9

PHP에서 렌더링 가능한 배열을 다룰 때 Element :: children ()을 사용하여 #속성이 아닌 하위 요소 인 렌더링 가능한 요소 (필드 집합 내의 항목, 필드 위젯 내의 항목 등)에 액세스 할 수 있습니다. 예를 들어 file.module의이 스 니펫은 다음과 같습니다.

<?php
if ($element['#multiple']) {
  foreach (Element::children($element) as $name) {
    // ...
  }
}
?>

나뭇 가지 템플릿에서 어떻게 똑같이 할 수 있습니까? 내가 할 경우 {% for child in element %}, 그것은 또한 포함 #type, #cache


답변:


21
{% for key, child in element if key|first != '#' %}
  <div>{{ child }}</div>
{% endfor %}

2
코드 전용 답변을 피하십시오.
Mołot

2

아이들과 함께 다시 반환하는 나뭇 가지 필터를 만들었습니다 ArrayIterator.

mymodule/mymodule.services.yml

services:
  mymodule.twig_extension:
    arguments: ['@renderer']
    class: Drupal\mymodule\TwigExtension\Children
    tags:
      - { name: twig.extension }


mymodule/src/TwigExtension/Children.php

<?php

namespace Drupal\mymodule\TwigExtension;


class Children extends \Twig_Extension
{

  /**
   * Generates a list of all Twig filters that this extension defines.
   */
  public function getFilters()
  {
    return [
      new \Twig_SimpleFilter('children', array($this, 'children')),
    ];
  }


  /**
   * Gets a unique identifier for this Twig extension.
   */
  public function getName()
  {
    return 'mymodule.twig_extension';
  }


  /**
   * Get the children of a field (FieldItemList)
   */
  public static function Children($variable)
  {
    if (!empty($variable['#items'])
      && $variable['#items']->count() > 0
    ) {
      return $variable['#items']->getIterator();
    }

    return null;
  }

}


나뭇 가지 템플릿에서 :

{% for headline in entity.field_headline|children %}
  {{ headline.get('value').getValue() }}
{% endfor %}

2

다른 훌륭한 기능 중 "자식"필터가있는 Twig Tweak 모듈을 사용하십시오 .

{% for item in content.field_name | children(true) %}
  {# loop.length, loop.revindex, loop.revindex0, and loop.last are now available #}
{% endfor %}

1

다음 은 필드 대신 렌더 자식을 반복 하는 https://drupal.stackexchange.com/a/236408/67965 의 수정 사항입니다 #items.

나뭇 가지 확장 :

/**
 * Generates a list of all Twig filters that this extension defines.
 */
public function getFilters() {
  return [
    new \Twig_SimpleFilter('children', array($this, 'children')),
  ];
}

/**
 * Get the render children of a field
 */
public static function children($variable) {
  return array_filter(
    $variable, 
    function($k) { return (is_numeric($k) || (strpos($k, '#') !== 0)); },
    ARRAY_FILTER_USE_KEY
  );
}

나뭇 가지에서는 렌더링 된 자식을 직접 통과하여 원자 디자인 패턴에 도움이됩니다. 엔티티 템플리트를 정의하십시오 (예 :

{% include '@molecules/grid.html.twig' with { 
   head : content.field_title,
   grid_columns: content.field_collection_items|children
} %}

grid.html.twig는 다음과 같습니다.

{% if head %}
<div class="slab__wrapper">
  {{ head }}
</div>
{% endif %}
<div class="grid">          
  {% for col in grid_columns %}
  <div class="grid__column">
    {{ col }}
  </div>
  {% endfor %}
</div>

{{ content.field_collection_items }}자식의 레이아웃이 부모 디자인 요소의 컨텍스트에서 제어 될 수 있기 때문에 일반적으로 필드 템플릿을 렌더링하는 것보다 유용합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.