टहनी में बाल तत्वों के माध्यम से लूप जैसे तत्व :: बच्चे ()


9

PHP में रेंडर करने योग्य सरणी से निपटने के दौरान, मैं उन तत्वों का उपयोग करने के लिए तत्व :: बच्चों () का उपयोग कर सकता हूं जो कि #गुण नहीं हैं लेकिन अधीनस्थ रेंडर करने योग्य तत्व (किसी फ़ील्ड के अंदर आइटम, फ़ील्ड विजेट के अंदर आइटम आदि)। उदाहरण के लिए, file.module से यह स्निपेट:

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

मैं एक Twig टेम्पलेट में समान कैसे कर सकता हूं? अगर मैं करता हूं {% for child in element %}, तो यह भी शामिल होगा #type, #cacheआदि।


जवाबों:


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

2
कृपया कोड-केवल उत्तरों से बचें।
मोलॉट

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 }}क्योंकि बच्चों के लेआउट को मूल डिज़ाइन तत्व के संदर्भ में नियंत्रित किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.