นับค่าฟิลด์หลายค่าเป็นทวิ


9

ฉันต้องการนับจำนวนของค่าของฟิลด์ไม่ จำกัด เป็น twpal tempalate ที่ฉันพยายาม

{{ node.field_mytext.count }} => ต้องเผชิญกับข้อผิดพลาด

และลองอีกครั้ง

{{ content.field_mytext.count }}=> ไม่มีอะไรส่งคืน

(ในวิธีนี้ฉันตรวจสอบว่าฟิลด์ของฉันไม่ได้อยู่ในฟิลด์ถูกปิดใช้งานคือตัวจัดการการแสดงผล)


คำถามของฉันคือฉันจะนับจำนวนรายการใน Twig ได้อย่างไร?

ฉันหวังว่าฉันจะเผชิญกับโซลูชันที่คาดหวังว่าโซลูชันเหล่านี้: D

  • เพิ่มไว้ใน preprocess_node
  • ใช้Twig Tweak

คุณลอง {{content.field_mytext | ความยาว }}?
David Mcsmith

คำตอบ:


14

{{node.field_mytext.count}} => พบข้อผิดพลาด

สิ่งนี้ใช้ไม่ได้เนื่องจากวิธีcountนี้ไม่ได้รับอนุญาตในนโยบายทวิ:

core / lib / Drupal / core / แม่แบบ / TwigSandboxPolicy.php

{{content.field_mytext | ความยาว }}?

สิ่งนี้ใช้ไม่ได้เนื่องจากcontentเป็นอาเรย์แสดงผลที่มีคีย์เพิ่มเติมมากมาย

ใช้งานได้: แปลงฟิลด์เป็นอาร์เรย์และนับ

{{ node.field_mytext.getvalue | length }}

คุณอาจจะทำได้ด้วยลูป foreach แต่มันก็สะอาดกว่าสำหรับวัตถุประสงค์เฉพาะนี้
ไม่มี Sssweat

6

['#items']|lengthวิธีที่ง่ายที่สุดคือการได้รับ ฉันทำมันตลอดเวลาสำหรับการนับรายการเพื่อดูกรณีเพิ่มเติมและเมื่อโหลดตัวเลื่อน

{{ content.field_mytext['#items']|length }}

4

ฉันใช้ตัวกรอง Twig ของตัวเองเพื่อสนับสนุนเขตข้อมูลเอนทิตีด้วยสิ่งนี้คุณสามารถใช้เขตข้อมูลเป็นอาร์เรย์ดั้งเดิม:

{{ content.field_mytext|length }}

หรือ

{{ content.field_mytext|first|value }}

หรือ

{% if content.field_mytext is empty %}

คุณสามารถเพิ่ม Twig ฟิลเตอร์ของคุณเองได้อย่างง่ายดายผ่านโมดูลที่กำหนดเอง คุณสามารถเรียนรู้เพิ่มเติมได้ที่นี่: drupal.org/docs/8/creating-custom-modules ในระยะสั้นที่คุณจำเป็นต้องสร้างไดเรกทอรีโมดูลเช่นpath/to/drupal/modules/custom/common/ใส่มีcommon.info.ymlความหมายและโมดูลcommon.services.ymlที่มีความหมายของการบริการ (ดูความคิดเห็นในรหัส) /path/to/drupal/modules/custom/common/src/TwigExtension.phpและใส่รหัสของฉันไป

<?php
namespace Drupal\common;

use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\TypedData\ComplexDataInterface;

/**
 * A class providing Twig extensions.
 *
 * This provides a Twig extension that registers various Field-API-specific
 * extensions to Twig, overriding empty and array related filters.
 *
 * Don't forget about common.services.yml
 * services:
 *   common.twig.TwigExtension:
 *     class: Drupal\common\TwigExtension
 *     tags:
 *       - { name: twig.extension }
 *
 * Usage (in *.html.twig file):
 *   - check is field empty {% if content.field_foo is empty %}
 *   - get field first value {{ content.field_foo|first|value }}
 */
class TwigExtension extends \Twig_Extension {

  /**
   * {@inheritdoc}
   */
  public function getTests() {
    return [
      new \Twig_SimpleTest('empty', [$this, 'twigEmptyField']),
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function getFilters() {
    return [
      new \Twig_SimpleFilter('length', [$this, 'twigLengthFilter'], ['needs_environment' => TRUE]),
      new \Twig_SimpleFilter('slice', [$this, 'twigSlice'], ['needs_environment' => TRUE]),
      new \Twig_SimpleFilter('first', [$this, 'twigFirst'], ['needs_environment' => TRUE]),
      new \Twig_SimpleFilter('last', [$this, 'twigLast'], ['needs_environment' => TRUE]),
      new \Twig_SimpleFilter('value', [$this, 'twigFieldValue']),
    ];
  }

  /**
   * Check if value is field item object.
   *
   * @param mixed $value
   *   Mixed Twig variable.
   *
   * @return \Drupal\Core\Field\FieldItemListInterface|mixed
   *   FieldItemListInterface or same value as passed.
   */
  private function checkItems($value) {
    if (is_array($value) && !empty($value['#items']) && $value['#items'] instanceof FieldItemListInterface) {
      return $value['#items'];
    }
    return $value;
  }

  /**
   * Get field item value.
   *
   * @param object $field
   *   Field object.
   *
   * @return array|mixed
   *   List of values or value.
   */
  public function twigFieldValue($field) {
    if ($field instanceof FieldItemInterface) {
      $prop = $field->mainPropertyName();
      $value = $field->getValue();
      return $prop ? $value[$prop] : $value;
    }
    if ($field instanceof FieldItemListInterface) {
      $value = [];
      foreach ($field as $item) {
        $value[] = $this->twigFieldValue($item);
      }
      return $value;
    }
    return '';
  }

  /**
   * Checks if a variable is empty.
   *
   * @see twig_test_empty
   */
  public function twigEmptyField($value) {
    $value = $this->checkItems($value);
    if ($value instanceof ComplexDataInterface) {
      return $value->isEmpty();
    }
    // Return TRUE, because there is no data only cache and weight.
    elseif (!is_object($value) && isset($value['#cache']) && count($value) == 2) {
      return TRUE;
    }
    return twig_test_empty($value);
  }

  /**
   * Returns the length of a variable.
   *
   * @param \Twig_Environment $env
   *   Twig environment.
   * @param mixed $item
   *   A variable.
   *
   * @return mixed
   *   The first element of the item.
   *
   * @see twig_length_filter
   */
  public function twigLengthFilter(\Twig_Environment $env, $item) {
    $item = $this->checkItems($item);
    return twig_length_filter($env, $item);
  }

  /**
   * Slices a variable.
   *
   * @param \Twig_Environment $env
   *   Twig environment.
   * @param mixed $item
   *   A variable.
   * @param int $start
   *   Start of the slice.
   * @param int $length
   *   Size of the slice.
   * @param bool $preserveKeys
   *   Whether to preserve key or not (when the input is an array)
   *
   * @return mixed
   *   The first element of the item.
   *
   * @see twig_slice
   */
  public function twigSlice(\Twig_Environment $env, $item, $start, $length = NULL, $preserveKeys = FALSE) {
    $item = $this->checkItems($item);
    return twig_slice($env, $item, $start, $length, $preserveKeys);
  }

  /**
   * Returns the first element of the item.
   *
   * @param \Twig_Environment $env
   *   Twig environment.
   * @param mixed $item
   *   A variable.
   *
   * @return mixed
   *   The first element of the item.
   *
   * @see twig_first
   */
  public function twigFirst(\Twig_Environment $env, $item) {
    $item = $this->checkItems($item);
    return twig_first($env, $item);
  }

  /**
   * Returns the last element of the item.
   *
   * @param \Twig_Environment $env
   *   Twig environment.
   * @param mixed $item
   *   A variable.
   *
   * @return mixed
   *   The first element of the item.
   *
   * @see twig_last
   */
  public function twigLast(\Twig_Environment $env, $item) {
    $item = $this->checkItems($item);
    return twig_last($env, $item);
  }

}

0

ใช้ตัวกรองความยาว

{{ content.field_mytext | length }} 

4
ส่งคืนค่าความผิดพลาด !!! ฟิลด์ของฉันยาวและฉันมี 4 รายการอยู่ในนั้น แต่คืน 20
Yusef

1
สิ่งนี้สามารถ (ขึ้นอยู่กับสถานการณ์) สามารถคืนค่าที่ถูกต้อง แต่มันเป็นคำตอบที่ไม่ถูกต้อง
aydow
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.