Zählen Sie mehrwertige Feldwerte im Zweig

9

Ich möchte die Anzahl der Werte des unbegrenzten Feldes in dem von mir versuchten Zweig-Tempalat zählen

{{ node.field_mytext.count }} => mit Fehler konfrontiert

und in einem anderen Versuch

{{ content.field_mytext.count }}=> nichts zurückgegeben

(Bei dieser Methode habe ich überprüft, dass mein Feld nicht deaktiviert ist. Feld ist Display Manager).


Meine Frage ist, wie ich die Anzahl der Elemente eines Feldes in Twig zählen kann.

Ich hoffe, dass ich mit den Lösungen konfrontiert bin, die folgende Lösungen erwarten: D.

  • füge es in preprocess_node hinzu
  • benutze Twig Tweak
Yusef
quelle
hast du versucht {{content.field_mytext | Länge}}?
David Mcsmith

Antworten:

14

{{node.field_mytext.count}} => mit Fehler konfrontiert

Dies funktioniert nicht, da die Methode countin Zweigrichtlinien nicht zulässig ist:

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

{{content.field_mytext | Länge}}?

Dies funktioniert nicht, da contentes sich um ein Render-Array mit vielen zusätzlichen Schlüsseln handelt.

Dies funktioniert: Feld in Array konvertieren und zählen

{{ node.field_mytext.getvalue | length }}
4k4
quelle
Sie könnten es wahrscheinlich auch mit einer foreach-Schleife tun, aber dies ist für diesen speziellen Zweck sauberer.
Kein Sssweat
6

Am einfachsten ist es, das zu bekommen ['#items']|length. Ich mache es die ganze Zeit, um Elemente zu zählen, um mehr Instanzen anzuzeigen und um Schieberegler zu laden.

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

Ich habe eigene Twig-Filter verwendet, um Entitätsfelder zu unterstützen. Hiermit können Sie Felder als native Arrays verwenden:

{{ content.field_mytext|length }}

oder

{{ content.field_mytext|first|value }}

oder

{% if content.field_mytext is empty %}

Sie können ganz einfach Ihre eigenen Zweigfilter über ein benutzerdefiniertes Modul hinzufügen. Weitere Informationen finden Sie hier: drupal.org/docs/8/creating-custom-modules . Kurz gesagt, Sie müssen ein Modulverzeichnis erstellen path/to/drupal/modules/custom/common/, dort beispielsweise common.info.ymlmit Moduldefinition und common.services.ymlDienstdefinition (siehe Kommentare im Code) ablegen und meinen Code in ablegen /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);
  }

}
zviryatko
quelle
0

Verwendung Längenfilter

{{ content.field_mytext | length }} 
David Mcsmith
quelle
4
Fehlerwert zurückgeben !!!, mein Feld ist lang und ich habe 4 Artikel drin, aber 20 zurück !!!
Yusef
1
Dies kann (abhängig von den Umständen) die korrekten Werte zurückgeben, ist jedoch eine ungenaue Antwort.
aydow