Nhận tất cả các trường được xác định trong một gói


16

để có được tất cả các trường được sử dụng trong một loại nội dung, trong Drupal 7 tôi sử dụng mã sau đây.

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

Tương đương với Drupal 8 là gì?


1
Bạn đang làm việc với một thực thể? Nếu vậy: $fields = $entity->getFieldDefinitions();sẽ làm điều đó. Tôi không chắc thứ tương đương field_info_instances()là gì, FieldStorageConfigdường như không có
Clive

Không, tôi chỉ muốn thay đổi node_type_edit_form và thêm danh sách các trường được xác định bởi loại nút trong biểu mẫu. Vì vậy, loại nút là đối số duy nhất tôi có. Vì vậy, tôi nghĩ rằng chức năng như field_info_instances có thể giúp đỡ.
Pravin Ajaaz

@Clive: tôi có thể tạo một đối tượng thực thể bằng tên loại thực thể. Có một hàm NodeType :: load ('article') tạo đối tượng cho các loại nút.
Pravin Ajaaz

\Drupal::entityManager()->getFieldDefinitions('node', 'article')đã làm công việc clive :)
Pravin Ajaaz

Câu trả lời:


30

EntityManager không được dùng nữa. Sau đây có thể được sử dụng:

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

Có cách nào để chỉ nhận danh sách trường cck không?
Rajesh Vishwakarma

2
Đây phải là câu trả lời được chấp nhận ngay bây giờ.
Bram

24

Tôi đạt được nó bằng cách sử dụng getFieldDefinitions()định nghĩa trong Class EntityManager. Vì vậy, để có được tất cả các trường được sử dụng trong một gói cụ thể, đây là một cách:

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

Mặc dù ở trên $bundle_fieldscũng chứa nid, uuid, revisions, langcode, etcnhư các lĩnh vực. Vì vậy, để có được một đầu ra chính xác, tôi đã làm một cái gì đó như thế này:

  $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
Điều này hoạt động, tuy nhiên entityManager không được chấp nhận. Nhận xét ở trên định nghĩa hàm cho biết sử dụng entityTypeManager hoặc nếu phương thức không được triển khai (getFieldDefDefs thì không) "xem phần không dùng nữa \ Drupal \ Core \ Entity \ EntityManager để tìm giao diện hoặc dịch vụ chính xác." Tôi không hiểu bình luận này. Tôi có thể tìm ở đâu để tìm đúng chức năng sử dụng?
Đêm giao thừa

5
Để lọc ra các trường cơ sở ( nid, uuid, revisions, langcode, etc) bạn có thể làmif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
Có cách nào để có được Định nghĩa trường cho tất cả các loại nội dung không chỉ một loại không?
Matt

1
@ leon.nk có <code> if ($ field-> getFieldStorageDefDef () -> isBaseField () == FALSE) </ code> chính xác hơn <code> if (! ) </ code> để lọc ra các trường cơ sở.
Hanmant

5

EntityManager không được dùng nữa và tôi đã sử dụng mã tiếp theo. Tôi đã thêm vào lớp Trình điều khiển:

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

// Đây là một số chức năng của bạn

 /**
   * 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 nó đã giúp tôi


Một số mẹo: Trong các hàm tạo (và nói chung) sử dụng luôn các giao diện. Hầu hết các triển khai dịch vụ drupal có giao diện được xác định rõ.
ssibal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.