Holen Sie sich alle Felder in einem Bundle definiert


16

Um alle in einem Inhaltstyp verwendeten Felder abzurufen, verwende ich in Drupal 7 den folgenden Code.

$fields = field_info_instances('node', 'article');

Was ist das Äquivalent für Drupal 8?


1
Arbeiten Sie mit einer Entität? Wenn ja: $fields = $entity->getFieldDefinitions();werde es tun. Ich bin nicht sicher, was das Äquivalent von field_info_instances()ist, FieldStorageConfigscheint kein einziges zu haben
Clive

Nein, ich möchte nur das Formular "node_type_edit_form" ändern und eine Liste von Feldern hinzufügen, die durch den Knotentyp im Formular definiert sind. Der Typ des Knotens ist also das einzige Argument, das ich habe. Also dachte ich, dass eine Funktion wie field_info_instances helfen könnte.
Pravin Ajaaz

@Clive: Kann ich ein Entitätsobjekt mit dem Namen des Entitätstyps erstellen? Es gibt eine Funktion NodeType :: load ('article'), die Objekte für Knotentypen erstellt.
Pravin Ajaaz,

\Drupal::entityManager()->getFieldDefinitions('node', 'article')hat den Job gemacht clive :)
Pravin Ajaaz

Antworten:


30

EntityManager wird in Zukunft nicht mehr weiterentwickelt. Folgendes kann stattdessen verwendet werden:

$entityFieldManager = \Drupal::service('entity_field.manager');
$fields = $entityFieldManager->getFieldDefinitions($entity_type, $bundle);

Gibt es eine Möglichkeit, nur eine cck-Feldliste abzurufen?
Rajesh Vishwakarma

2
Dies sollte jetzt die akzeptierte Antwort sein.
Bram

24

Ich habe es mit getFieldDefinitions()defined in erreicht Class EntityManager. Damit alle Felder in einem bestimmten Bündel verwendet werden, haben Sie folgende Möglichkeiten:

$bundle_fields = \Drupal::entityManager()->getFieldDefinitions('node', 'article');

Das obige $bundle_fieldsenthält nid, uuid, revisions, langcode, etcaber auch als Felder. Um eine genaue Ausgabe zu erhalten, habe ich Folgendes getan:

  $entity_type_id = 'node';
  $bundle = 'article';
  foreach (\Drupal::entityManager()->getFieldDefinitions($entity_type_id, $bundle) as $field_name => $field_definition) {
    if (!empty($field_definition->getTargetBundle())) {
      $bundleFields[$entity_type_id][$field_name]['type'] = $field_definition->getType();
      $bundleFields[$entity_type_id][$field_name]['label'] = $field_definition->getLabel();
    }
  }

2
Dies funktioniert, aber entityManager ist veraltet. Der Kommentar über der Funktionsdefinition besagt "use entityTypeManager" oder wenn die Methode nicht implementiert ist (getFieldDefinitions ist nicht implementiert) ". Ich verstehe diesen Kommentar nicht. Wo finde ich die richtige Funktion?
Felix Eve

5
Um die nid, uuid, revisions, langcode, etcif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
Basisfelder

1
Gibt es eine Möglichkeit, die Felddefinitionen für alle Arten von Inhaltstypen zu erhalten, nicht nur für einen?
Matt

1
@ leon.nk yes <code> if ($ field-> getFieldStorageDefinition () -> isBaseField () == FALSE) </ code> das ist genauer als <code> if (! empty ($ field_definition-> getTargetBundle ()) ) </ code>, um Basisfelder herauszufiltern.
Hanmant

5

EntityManager ist veraltet und ich habe den nächsten Code verwendet. Ich habe der Controller-Klasse hinzugefügt:

 /**
   * The entity field manager.
   *
   * @var \Drupal\Core\Entity\EntityFieldManager
   */
  protected $entityFieldManager;

  /**
   * Constructor.
   *
   * @param \Drupal\Core\Entity\EntityFieldManager $entity_field_manager
   *   The entity field manager.
   */
  public function __construct(EntityFieldManager $entity_field_manager) {
    $this->entityFieldManager = $entity_field_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity_field.manager')
    );
  }

// Hier einige deiner Funktionen

 /**
   * Build table rows.
   */
  protected function buildRows() {
    $entity_type_id = 'node';
    $bundle = 'article';
$fields = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle);
foreach ($fields as $field_name => $field_definition) {
  if (!empty($field_definition->getTargetBundle())) {               
    $listFields[$field_name]['type'] = $field_definition->getType();
    $listFields[$field_name]['label'] = $field_definition->getLabel();                  
  }
}
$rows = [];
foreach ($listFields as $field_name => $info) {
  $rows[] = $this->buildRow($info, $field_name);
}
return $rows;

}

https://www.drupal.org/node/2549139 es wurde mir geholfen


Einige Tipps: Verwenden Sie in Konstruktoren (und im Allgemeinen) immer Interfaces. Die meisten Implementierungen von Drupal-Diensten haben klar definierte Schnittstellen.
ssibal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.