Obtenga todos los campos definidos en un paquete


16

para obtener todos los campos utilizados en un tipo de contenido, en Drupal 7 utilizo el siguiente código.

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

¿Cuál es el equivalente para Drupal 8?


1
¿Estás trabajando con una entidad? Si es así: $fields = $entity->getFieldDefinitions();lo haré. No estoy seguro de cuál es el equivalente field_info_instances(), FieldStorageConfigno parece tener uno
Clive

No, solo quiero alterar el node_type_edit_form y agregar una lista de campos definidos por el tipo de nodo en el formulario. Entonces, el tipo de nodo es el único argumento que tengo. Entonces pensé que una función como field_info_instances podría ayudar.
Pravin Ajaaz

@Clive: ¿puedo crear un objeto de entidad usando el nombre del tipo de entidad? Hay una función NodeType :: load ('artículo') que crea objetos para tipos de nodos.
Pravin Ajaaz

\Drupal::entityManager()->getFieldDefinitions('node', 'article')hizo el trabajo clive :)
Pravin Ajaaz

Respuestas:


31

EntityManager está en desuso en adelante. En su lugar, se puede usar lo siguiente:

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

¿Hay alguna manera de obtener solo la lista de campos cck?
Rajesh Vishwakarma

2
Esta debería ser la respuesta aceptada ahora.
Bram

25

Lo logré usando getFieldDefinitions()definido en Class EntityManager. Entonces, para obtener todos los campos utilizados en un paquete particular, esta es una manera:

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

Aunque lo anterior $bundle_fieldstambién contiene nid, uuid, revisions, langcode, etccomo campos. Entonces, para obtener una salida precisa, hice algo como esto:

  $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
Esto funciona, sin embargo, entityManager está en desuso. El comentario sobre la definición de la función dice use entityTypeManager o si el método no está implementado (getFieldDefinitions no lo está) "vea el \ Drupal \ Core \ Entity \ EntityManager en desuso para encontrar la interfaz o servicio correcto". No entiendo este comentario. ¿Dónde puedo buscar para encontrar la función correcta para usar?
Felix Eve

55
Para filtrar los campos base ( nid, uuid, revisions, langcode, etc), puede hacerloif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
¿Hay alguna forma de obtener las Definiciones de campo para todos los tipos de contenido, no solo para uno?
Matt

1
@ leon.nk yes <code> if ($ field-> getFieldStorageDefinition () -> isBaseField () == FALSE) </code> que es más preciso que <code> if (! empty ($ field_definition-> getTargetBundle ()) ) </code> para filtrar los campos base.
Hanmant

6

EntityManager está en desuso y utilicé el siguiente código. Agregué a la clase 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')
    );
  }

// Aquí algunas de tus funciones

 /**
   * 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 me ayudó


Algunos consejos: en los constructores (y en general) use siempre interfaces. La mayoría de las implementaciones del servicio drupal tienen interfaces bien definidas.
ssibal
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.