hitung nilai bidang multinilai dalam ranting


9

Saya ingin menghitung jumlah nilai bidang tak terbatas di ranting tempalate yang saya coba

{{ node.field_mytext.count }} => dihadapkan dengan kesalahan

dan dalam percobaan lain

{{ content.field_mytext.count }}=> tidak ada yang dikembalikan

(dalam metode ini saya memeriksa bidang saya tidak dalam bidang dinonaktifkan adalah manajer tampilan).


Pertanyaan saya adalah bagaimana saya bisa menghitung jumlah item dalam ranting?

Saya harap saya hadapi dengan solusi mengharapkan solusi ini: D

  • tambahkan dalam preprocess_node
  • gunakan Twig Tweak

apakah Anda mencoba {{content.field_mytext | panjangnya }}?
David Mcsmith

Jawaban:


14

{{node.field_mytext.count}} => dihadapkan dengan kesalahan

Ini tidak berfungsi, karena metode countini tidak diperbolehkan dalam kebijakan ranting:

core / lib / Drupal / Core / Template / TwigSandboxPolicy.php

{{content.field_mytext | panjangnya }}?

Ini tidak berfungsi, karena contentarray render dengan banyak kunci tambahan.

Ini berfungsi: Konversi bidang ke array dan menghitung

{{ node.field_mytext.getvalue | length }}

Anda mungkin juga bisa melakukannya dengan foreach loop, tetapi ini lebih bersih untuk tujuan khusus ini.
Tidak ada Sssweat

6

Cara termudah adalah dengan mendapatkan ['#items']|length. Saya selalu melakukannya untuk menghitung item untuk melihat lebih banyak instance dan ketika memuat slider.

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

4

Saya telah menggunakan filter Twig sendiri untuk mendukung bidang entitas, dengan ini Anda dapat menggunakan bidang sebagai array asli:

{{ content.field_mytext|length }}

atau

{{ content.field_mytext|first|value }}

atau

{% if content.field_mytext is empty %}

Anda dapat dengan mudah menambahkan Anda memiliki filter Twig melalui modul khusus. Anda dapat mempelajari lebih lanjut di sini: drupal.org/docs/8/creating-custom-modules . Singkatnya, Anda perlu membuat direktori modul, misalnya path/to/drupal/modules/custom/common/, letakkan di sana common.info.ymldengan definisi modul dan common.services.ymldengan definisi layanan (lihat komentar dalam kode) dan masukkan kode saya /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

Gunakan filter panjang

{{ content.field_mytext | length }} 

4
mengembalikan nilai kesalahan !!!, bidang saya panjang dan saya punya 4 item di sana tapi kembalikan 20 !!!
Yusef

1
ini bisa (tergantung keadaan) dapat mengembalikan nilai yang benar, tetapi ini adalah jawaban yang tidak akurat.
aydow
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.