web-dev-qa-db-fra.com

Comment obtenir la valeur du champ de collection de champs dans le fichier twig?

J'ai un champ de collecte de champs. J'ai besoin de la valeur du champ dans le champ dans le fichier twig.

Comment imprimer la valeur du champ.

Image du code ci-dessous.

{% for item in items %}
    {{ kint(item.content) }}
{% endfor %}

enter image description here

Besoin de la valeur du champ de date "field_project_from".

3
DRUPWAY

Supposons que vous ayez une collection de champs field_test Et que la collection de champs ait des champs disons field_name Et field_age, Vous pouvez y accéder en utilisant l'extrait de code ci-dessous.

{% for details in node.field_test %}
    Name: {{ details.getFieldCollectionItem().field_name.value }}
    Age: {{ details.getFieldCollectionItem().field_age.value }}
{% endfor %}

Voir référence et autre référence

Je suppose que getFieldCollectionItem().field_name.value est ce que vous recherchez.

10
AkiShankar

Vous avez une bonne réponse à la question, comment obtenir les valeurs de champ de collection de champs, à partir de @AkiShankar. Mais vous obtenez uniquement les valeurs telles qu'elles sont stockées dans la base de données et vous devez formater le contenu vous-même.

Si vous souhaitez imprimer les champs formatés, utilisez le modèle de l'élément de collecte de champs.

Le thème des éléments de collection de champs est le même que pour les nœuds. Les deux sont des entités. Et seulement si vous avez un modèle de l'entité ou d'un champ à l'intérieur de l'entité, vous pouvez gérer le rendu de la sortie du champ.

1
4k4

La réponse de @ AkiShankar fonctionne, mais crée beaucoup de travail pour le développeur dans le modèle twig. Si vous travaillez directement hors de l'entité et que vous obtenez getFieldCollectionItem (), vous êtes obligé de valider les données dans votre brindille, et vous ne pouvez pas utiliser de formateurs de champs, donc pour quelque chose comme une carte Google, extraire les données directement sans formateur ne fonctionne pas si bien. Si vous voulez pouvoir utiliser les modes d'affichage dans votre collection de champs ( cela fonctionne également pour les paragraphes et les références d'entité), vous pouvez créer un formateur de champ personnalisé pour votre entité qui restitue les champs. Vous pouvez ensuite accéder facilement aux champs enfants dans la branche parent:

À /modules/custom/mymodule/src/Plugin/Field/FieldFormatter/EntityComponentFormatter.php

namespace Drupal\mymodule\Plugin\Field\FieldFormatter;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter;

/**
 * Plugin implementation of the 'entity reference rendered entity' formatter.
 *
 * @FieldFormatter(
 *   id = "entity_component_formatter",
 *   label = @Translation("Rendered entity variables (available to parent template)"),
 *   description = @Translation("Entity with fields available in parent template."),
 *   field_types = {
 *     "entity_reference"
 *   }
 * )
 */
class EntityComponentFormatter extends EntityReferenceEntityFormatter {

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    $elements = parent::viewElements($items, $langcode);

    foreach ($this->getEntitiesToView($items, $langcode) as $delta => $entity) {
      $view_builder = $this->entityTypeManager->getViewBuilder($entity->getEntityTypeId());
      $elements[$delta] = $view_builder->build($elements[$delta]);
    }

    return $elements;
  }

}

Vous pouvez parcourir à travers votre twig comme ceci:

{% for key, item in content.field_my_field_collection %}
  {{ item.field_1 }} 
  {{ item.field_2 }}         
{% endfor %}  

Si vous ne souhaitez pas créer un formateur personnalisé, vous pouvez faire la même chose dans hook_entity_view:

/**
 * Implements hook_entity_view().
 *
 * Gets the output for extra fields.
 */
function mymodule_entity_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {

  if ($entity->getEntityType()->id() == 'node' && $entity->bundle() == 'article' && $view_mode == 'myviewmode' && !empty($build['field_my_field_collection'])) {
    $view_builder = \Drupal::entityTypeManager()
  ->getViewBuilder('field_collection_item');

    $build['field_my_field_collection'] = $view_builder->build($build['field_my_field_collection']);
  }

}
1
oknate