Uzyskaj wszystkie pola zdefiniowane w pakiecie

16

aby uzyskać wszystkie pola używane w typie zawartości, w Drupal 7 używam następującego kodu.

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

Jaki jest odpowiednik Drupala 8?

Pravin Ajaaz
źródło
1
Czy pracujesz z bytem? Jeśli tak: $fields = $entity->getFieldDefinitions();zrobi to. Nie jestem pewien, co to jest odpowiednik field_info_instances(), FieldStorageConfigwydaje się , że nie ma
Clive
Nie. Chcę tylko zmienić formularz_typ_węzła i dodać w formularzu listę pól zdefiniowanych przez typ węzła. Zatem typ węzła jest jedynym argumentem, jaki mam. Pomyślałem więc, że funkcja taka jak field_info_instances może pomóc.
Pravin Ajaaz,
@Clive: czy mogę utworzyć obiekt encji przy użyciu nazwy typu encji. Istnieje funkcja NodeType :: load („artykuł”), która tworzy obiekty dla typów węzłów.
Pravin Ajaaz,
\Drupal::entityManager()->getFieldDefinitions('node', 'article')wykonał robotę clive :)
Pravin Ajaaz

Odpowiedzi:

31

EntityManager jest przestarzały, aby przejść do przodu. Zamiast tego można użyć:

$entityFieldManager = \Drupal::service('entity_field.manager');
$fields = $entityFieldManager->getFieldDefinitions($entity_type, $bundle);
NewZeal
źródło
Czy jest jakiś sposób na uzyskanie tylko listy pól cck?
Rajesh Vishwakarma
2
To powinna być teraz akceptowana odpowiedź.
Bram
25

Osiągnąłem to używając getFieldDefinitions()zdefiniowanego w Class EntityManager. Aby uzyskać wszystkie pola używane w danym pakiecie, oto sposób:

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

Chociaż powyższe $bundle_fieldszawiera również nid, uuid, revisions, langcode, etcjako pola. Aby uzyskać dokładny wynik, zrobiłem coś takiego:

  $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
źródło
2
Działa to, jednak instanceManager jest przestarzały. Komentarz nad definicją funkcji mówi: użyj encjiTypeManager lub jeśli metoda nie jest zaimplementowana (getFieldDefinitions nie jest) „zobacz nieaktualne \ Drupal \ Core \ Entity \ EntityManager, aby znaleźć odpowiedni interfejs lub usługę.” Nie rozumiem tego komentarza. Gdzie mogę znaleźć odpowiednią funkcję?
Felix Eve
5
Aby odfiltrować pola podstawowe ( nid, uuid, revisions, langcode, etc), możesz to zrobićif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk
1
Czy istnieje sposób, aby uzyskać definicje pól dla wszystkich typów typów treści, a nie tylko jednego?
Matt
1
@ leon.nk tak <code> if ($ field-> getFieldStorageDefinition () -> isBaseField () == FALSE) </code> to jest bardziej precyzyjne niż <code> if (! empty ($ field_definition-> getTargetBundle ()) ) </code>, aby odfiltrować pola podstawowe.
Hanmant,
6

EntityManager jest przestarzały i użyłem następnego kodu. Dodałem do klasy 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')
    );
  }

// Oto niektóre twoje funkcje

 /**
   * 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 to mi pomogło

Maria
źródło
Kilka wskazówek: W konstruktorach (i ogólnie) używaj zawsze interfejsów. Większość implementacji usług drupal ma dobrze zdefiniowane interfejsy.
ssibal