it-swarm.com.de

Wie überprüfe ich, ob ein Entitätspaket ein Feld hat?

Wie kann ich überprüfen, ob ein Bundle ein Feld enthält? Ich weiß, dass ich $entity->hasField() verwenden kann, wenn ich eine bestimmte Entität habe (wie in dieser Beitrag definiert), aber wie kann ich diese Informationen nur mit dem Entitätstyp und den Bundle-Informationen erhalten?

Ich gehe davon aus, dass ich einfach eine Entität des Typs und des Bündels erstellen (und niemals speichern) und dagegen prüfen könnte, aber das scheint grob zu sein.

3
sonfd

Woops, das hängt eng mit zusammen. Alle Felder in einem Bundle definieren , aber da das alle Felder abruft, werde ich dies posten.

Verwenden Sie den Dienst EntityFieldManager (entity_field.manager) , insbesondere die Methode getFieldDefinitions , um alle Felddefinitionen abzurufen und dann nach Ihrem spezifischen Feld zu suchen.

function doesBundleHaveField($entity_type = 'node', $bundle = 'page', $field_name = 'field_paragraphs') {
  $all_bundle_fields = \Drupal::service('entity_field.manager')->getFieldDefinitions($entity_type, $bundle);
  return isset($all_bundle_fields[$field_name]);
}
7
sonfd

Sie können die statische Methode loadByName von FieldStorageConfig verwenden, die die Feldkonfigurationsentität zurückgibt, wenn eine für den angegebenen Feldnamen vorhanden ist, andernfalls NULL. Holen Sie sich dann die angehängten Bundles und filtern Sie nach Ihrem entsprechenden Bundle:

use Drupal\field\Entity\FieldStorageConfig;
$field_storage = FieldStorageConfig::loadByName('node', 'field_foo');
if (!empty($field_storage) && in_array('page', $field_storage->getBundles())) {
  // TODO: Implement this.
}
2
foopal