compter les valeurs de champ à valeurs multiples dans une brindille


9

Je veux compter le nombre de valeurs de champ illimité dans un rameau tempalate j'ai essayé

{{ node.field_mytext.count }} => face à l'erreur

et dans un autre essai

{{ content.field_mytext.count }}=> rien retourné

(dans cette méthode, j'ai vérifié que mon champ n'est pas dans le champ désactivé est le gestionnaire d'affichage).


Ma question est de savoir comment puis-je compter le nombre d'éléments d'un champ dans Twig?

J'espère que je fais face avec les solutions attendent ces solutions: D

  • l'ajouter dans preprocess_node
  • utiliser Twig Tweak

avez-vous essayé {{content.field_mytext | longueur}}?
David Mcsmith

Réponses:


14

{{node.field_mytext.count}} => face à une erreur

Cela ne fonctionne pas, car la méthode countn'est pas autorisée dans les stratégies de brindille:

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

{{content.field_mytext | longueur}}?

Cela ne fonctionne pas, car il contents'agit d'un tableau de rendu avec de nombreuses clés supplémentaires.

Cela fonctionne: Convertir le champ en tableau et compter

{{ node.field_mytext.getvalue | length }}

vous pourriez probablement aussi le faire avec une boucle foreach, mais c'est plus propre à cet effet spécifique.
Pas de Sssweat

6

Le moyen le plus simple est d'obtenir le ['#items']|length. Je le fais tout le temps pour compter les éléments pour voir plus d'instances et pour charger des curseurs.

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

4

J'ai utilisé ses propres filtres Twig pour prendre en charge les champs d'entité, avec cela, vous pouvez utiliser les champs comme des tableaux natifs:

{{ content.field_mytext|length }}

ou

{{ content.field_mytext|first|value }}

ou

{% if content.field_mytext is empty %}

Vous pouvez facilement ajouter vos propres filtres Twig via un module personnalisé. Vous pouvez en savoir plus ici: drupal.org/docs/8/creating-custom-modules . En bref, vous devez créer un répertoire de modules, par exemple path/to/drupal/modules/custom/common/, y mettre common.info.ymlavec la définition du module et common.services.ymlavec la définition du service (voir les commentaires dans le code) et mettre mon code dans /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

Utiliser un filtre de longueur

{{ content.field_mytext | length }} 

4
retourne la valeur de l'erreur !!!, mon champ est long et j'ai 4 articles dedans mais retourne 20 !!!
Yusef

1
cela peut (selon les circonstances) peut renvoyer les valeurs correctes, mais c'est une réponse inexacte.
aydow
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.