đếm các giá trị trường đa trị trong twig


9

Tôi muốn đếm số lượng giá trị của trường không giới hạn trong twig tempalate tôi đã thử

{{ node.field_mytext.count }} => gặp lỗi

và trong một lần thử khác

{{ content.field_mytext.count }}=> không có gì trả lại

(trong phương pháp này tôi đã kiểm tra trường của tôi không nằm trong trường bị vô hiệu hóa là trình quản lý hiển thị).


Câu hỏi của tôi là làm thế nào tôi có thể đếm số lượng vật phẩm của một lĩnh vực trong Twig?

Tôi hy vọng tôi phải đối mặt với các giải pháp mong đợi các giải pháp này: D

  • thêm nó vào pre process_node
  • sử dụng Twig Tweak

bạn đã thử {{content.field_mytext | chiều dài }}?
David Mcsmith

Câu trả lời:


14

{{node.field_mytext.count}} => gặp lỗi

Điều này không hoạt động, vì phương thức countnày không được phép trong các chính sách twig:

lõi / lib / Drupal / Lõi / Mẫu / TwigSandboxPolicy.php

{{nội dung.field_mytext | chiều dài }}?

Điều này không hoạt động, bởi vì contentlà một mảng kết xuất với rất nhiều khóa bổ sung.

Công việc này: Chuyển đổi trường thành mảng và đếm

{{ node.field_mytext.getvalue | length }}

bạn có thể cũng có thể làm điều đó với một vòng lặp foreach, nhưng điều này sạch hơn cho mục đích cụ thể này.
Không có Sssweat

6

Cách dễ nhất là để có được ['#items']|length. Tôi làm tất cả thời gian để đếm các mục để xem nhiều trường hợp hơn và khi tải thanh trượt.

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

4

Tôi đã sử dụng các bộ lọc Twig của riêng mình để hỗ trợ các trường thực thể, với điều này bạn có thể sử dụng các trường làm mảng gốc:

{{ content.field_mytext|length }}

hoặc là

{{ content.field_mytext|first|value }}

hoặc là

{% if content.field_mytext is empty %}

Bạn có thể dễ dàng thêm các bộ lọc Twig của riêng mình thông qua một mô-đun tùy chỉnh. Bạn có thể tìm hiểu thêm tại đây: drupal.org/docs/8/creating-custom-modules . Tóm lại, bạn cần tạo một thư mục mô-đun, ví dụ path/to/drupal/modules/custom/common/, đặt ở đó common.info.ymlvới định nghĩa mô-đun và common.services.ymlvới định nghĩa của dịch vụ (xem nhận xét trong mã) và đặt mã của tôi vào /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

Sử dụng bộ lọc độ dài

{{ content.field_mytext | length }} 

4
Trả về giá trị sai lầm !!!, lĩnh vực của tôi dài và tôi có 4 mục trong đó nhưng trả lại 20 !!!
Yusef

1
điều này có thể (tùy thuộc vào hoàn cảnh) có thể trả về các giá trị chính xác, nhưng đó là một câu trả lời không chính xác.
aydow
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.