Ottieni tutti i campi definiti in un pacchetto


16

per ottenere tutti i campi utilizzati in un tipo di contenuto, in Drupal 7 uso il seguente codice.

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

Qual è l'equivalente per Drupal 8?


1
Stai lavorando con un'entità? Se è così: $fields = $entity->getFieldDefinitions();lo farà. Non sono sicuro di quale sia l'equivalente di field_info_instances(), FieldStorageConfignon sembra averne uno
Clive

No, voglio solo modificare node_type_edit_form e aggiungere un elenco di campi definiti dal tipo di nodo nel modulo. Quindi il tipo di nodo è l'unico argomento che ho. Quindi ho pensato che funzioni come field_info_instances potrebbero aiutare.
Pravin Ajaaz,

@Clive: posso creare un oggetto entità usando il nome del tipo di entità. Esiste una funzione NodeType :: load ('articolo') che crea oggetti per i tipi di nodo.
Pravin Ajaaz,

\Drupal::entityManager()->getFieldDefinitions('node', 'article')il lavoro è finito :)
Pravin Ajaaz,

Risposte:


31

EntityManager è obsoleto andando avanti. È possibile utilizzare invece quanto segue:

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

C'è un modo per ottenere solo l'elenco dei campi cck?
Rajesh Vishwakarma,

2
Questa dovrebbe essere la risposta accettata ora.
Bram,

25

L'ho raggiunto usando getFieldDefinitions()definito in Class EntityManager. Quindi, al fine di ottenere tutti i campi utilizzati in un determinato pacchetto, ecco un modo:

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

Sebbene quanto sopra $bundle_fieldscontenga anche nid, uuid, revisions, langcode, etccome campi. Quindi per ottenere un risultato accurato ho fatto qualcosa del genere:

  $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
Funziona, tuttavia entityManager è obsoleto. Il commento sopra la definizione della funzione dice use entityTypeManager o se il metodo non è implementato (getFieldDefinitions non lo è) "vedere il deprecato \ Drupal \ Core \ Entity \ EntityManager per trovare l'interfaccia o il servizio corretti." Non capisco questo commento. Dove posso cercare per trovare la funzione corretta da usare?
Felix Eve,

5
Per filtrare i campi base ( nid, uuid, revisions, langcode, etc) puoi fareif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
C'è un modo per ottenere le definizioni dei campi per tutti i tipi di tipi di contenuto, non solo uno?
Matt,

1
@ leon.nk yes <code> if ($ field-> getFieldStorageDefinition () -> isBaseField () == FALSE) </code> è più preciso di <code> if (! empty ($ field_definition-> getTargetBundle ()) ) </code> per filtrare i campi di base.
Hanmant,

6

EntityManager è obsoleto e ho usato il codice successivo. Ho aggiunto alla classe Controller:

 /**
   * 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')
    );
  }

// Ecco alcune delle tue funzioni

 /**
   * 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 mi è stato di aiuto


Alcuni consigli: nei costruttori (e in generale) usare sempre le interfacce. La maggior parte delle implementazioni del servizio drupal ha interfacce ben definite.
ssibal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.