Lặp lại các phần tử con trong Twig như Element :: children ()


9

Khi xử lý một mảng có thể kết xuất trong PHP, tôi có thể sử dụng Element :: children () để truy cập các phần tử không phải là #thuộc tính mà là các phần tử có thể kết xuất phụ (biểu mẫu trong một bộ trường, các mục bên trong tiện ích trường, v.v.). Ví dụ: đoạn mã này từ file.module:

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

Làm thế nào tôi có thể làm tương tự trong một mẫu Twig? Nếu tôi làm {% for child in element %}, nó cũng sẽ bao gồm #type, #cachevv


Câu trả lời:


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

2
Vui lòng tránh các câu trả lời chỉ có mã.
Mołot

2

Tôi đã tạo một bộ lọc Twig trở lại với trẻ em như một 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;
  }

}


trong mẫu Twig:

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

2

Sử dụng mô-đun Twig Tweak , trong số các tính năng tuyệt vời khác, có bộ lọc "trẻ em":

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

1

Đây là bản sửa đổi của /drupal//a/236408/67965 mà vòng lặp qua các kết xuất con thay vì trường #items.

Phần mở rộng twig:

/**
 * 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
  );
}

Trong twig, sau đó bạn có thể đi qua trẻ em được kết xuất trực tiếp, điều này giúp trong các mẫu thiết kế nguyên tử. Xác định một mẫu thực thể, ví dụ:

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

trong đó Grid.html.twig là một cái gì đó như:

{% 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>

Điều này thường hữu ích hơn việc phải hiển thị một mẫu trường {{ content.field_collection_items }}vì bố cục của các phần tử con có thể được kiểm soát trong ngữ cảnh của phần tử thiết kế cha.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.