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?

Pravin Ajaaz
quelle
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);
NewZeal
quelle
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();
    }
  }
Pravin Ajaaz
quelle
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

Maria
quelle
Einige Tipps: Verwenden Sie in Konstruktoren (und im Allgemeinen) immer Interfaces. Die meisten Implementierungen von Drupal-Diensten haben klar definierte Schnittstellen.
ssibal