Bir pakette tanımlanan tüm alanları alın


16

bir içerik türünde kullanılan tüm alanları almak için, Drupal 7'de aşağıdaki kodu kullanıyorum.

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

Drupal 8'in eşdeğeri nedir?


1
Bir varlık ile mi çalışıyorsunuz? Eğer öyleyse: $fields = $entity->getFieldDefinitions();yapacak. Eşdeğeri ne olduğundan emin değilim field_info_instances(), bir tane FieldStorageConfiggibi görünmüyor
Clive

Hayır, yalnızca node_type_edit_form öğesini değiştirmek ve formdaki düğüm türü tarafından tanımlanan alanların bir listesini eklemek istiyorum. Düğümün türü sahip olduğum tek argüman. Bu yüzden field_info_instances gibi fonksiyonun yardımcı olabileceğini düşündüm.
Pravin Ajaaz

@Clive: Varlık türü adını kullanarak bir varlık nesnesi oluşturabilir miyim. Düğüm türleri için nesne oluşturan bir NodeType :: load ('makale') işlevi vardır.
Pravin Ajaaz

\Drupal::entityManager()->getFieldDefinitions('node', 'article')iş clive yaptı :)
Pravin Ajaaz

Yanıtlar:


31

EntityManager ilerlemeye itiraz edildi. Bunun yerine aşağıdakiler kullanılabilir:

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

Sadece cck alan listesi almanın bir yolu var mı?
Rajesh Vishwakarma

2
Bu şimdi kabul edilen cevap olmalı.
Bram

25

getFieldDefinitions()Tanımlanmış kullanarak elde ettimClass EntityManager . Belirli bir pakette kullanılan tüm alanları almak için, İşte bir yol:

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

Yukarıdaki alanlar $bundle_fieldsda alan içeriyor olsa da nid, uuid, revisions, langcode, etc. Doğru bir çıktı elde etmek için şöyle bir şey yaptım:

  $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
Ancak, entityManager kullanımdan kaldırılmıştır. İşlev tanımının üzerindeki yorumda, entityTypeManager'ın kullanılması veya yöntem uygulanmadığında (getFieldDefinitions uygulanmadı) "doğru arabirimi veya hizmeti bulmak için kullanımdan kaldırılmış \ Drupal \ Core \ Entity \ EntityManager'a bakın" der . Bu yorumu anlamıyorum. Kullanılacak doğru işlevi nerede bulabilirim?
Felix Eve

5
Temel alanları filtrelemek için ( nid, uuid, revisions, langcode, etc) şunları yapabilirsinizif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
Alan Tanımlarını yalnızca bir içerik türüne değil, tüm içerik türlerine almanın bir yolu var mı?
Matt

1
@ leon.nk evet <code> eğer ($ field-> getFieldStorageDefinition () -> isBaseField () == FALSE) </code> eğer <code> if (! empty ($ field_definition-> getTargetBundle ()) ) </code> ile temel alanları filtreleyin.
Hanmant

6

EntityManager kullanımdan kaldırıldı ve bir sonraki kodu kullandım. Controller sınıfına ekledim:

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

// İşte bazı işlevleriniz

 /**
   * 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 bana yardımcı oldu


Bazı ipuçları: Yapıcılarda (ve genel olarak) her zaman arabirimler kullanın. Drupal servis uygulamalarının çoğunun iyi tanımlanmış arayüzleri vardır.
ssibal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.