diff --git a/src/Plugin/Block/EntityField.php b/src/Plugin/Block/EntityField.php index 3a4884d..cc9d80c 100644 --- a/src/Plugin/Block/EntityField.php +++ b/src/Plugin/Block/EntityField.php @@ -139,6 +139,12 @@ class EntityField extends BlockBase implements ContextAwarePluginInterface, Cont public function build() { /** @var $entity \Drupal\Core\Entity\EntityInterface */ $entity = $this->getContextValue('entity'); + + // Only attempt to do anything if this field is on this bundle. + if (!in_array($entity->bundle(), $this->bundles)) { + return []; + } + // @todo Get this from configuration! $display_settings = []; if ($field = $entity->{$this->fieldName}) { diff --git a/src/Plugin/Deriver/EntityFieldDeriver.php b/src/Plugin/Deriver/EntityFieldDeriver.php index b0c37e4..9820354 100644 --- a/src/Plugin/Deriver/EntityFieldDeriver.php +++ b/src/Plugin/Deriver/EntityFieldDeriver.php @@ -12,6 +12,7 @@ use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Plugin\Context\ContextDefinition; use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\Core\StringTranslation\TranslationInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -34,8 +35,9 @@ class EntityFieldDeriver extends DeriverBase implements ContainerDeriverInterfac * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager. */ - public function __construct(EntityManagerInterface $entity_manager) { + public function __construct(EntityManagerInterface $entity_manager, TranslationInterface $string_translation) { $this->entityManager = $entity_manager; + $this->stringTranslation = $string_translation; } /** @@ -43,7 +45,8 @@ class EntityFieldDeriver extends DeriverBase implements ContainerDeriverInterfac */ public static function create(ContainerInterface $container, $base_plugin_id) { return new static( - $container->get('entity.manager') + $container->get('entity.manager'), + $container->get('string_translation') ); } @@ -51,19 +54,27 @@ class EntityFieldDeriver extends DeriverBase implements ContainerDeriverInterfac * {@inheritdoc} */ public function getDerivativeDefinitions($base_plugin_definition) { - foreach ($this->entityManager->getFieldMap() as $entity_type_id => $entity_fields) { - foreach ($entity_fields as $field_name => $field_info) { + $entity_type_labels = $this->entityManager->getEntityTypeLabels(); + foreach ($this->entityManager->getFieldMap() as $entity_type_id => $entity_field_map) { + foreach ($this->entityManager->getFieldStorageDefinitions($entity_type_id) as $field_definition) { + $field_name = $field_definition->getName(); + $field_info = $entity_field_map[$field_name]; $derivative_id = $entity_type_id . ":" . $field_name; - $this->derivatives[$derivative_id] = $base_plugin_definition; - // This isn't part of the Block Plugin annotation - we're just stashing - // it for use later. - $this->derivatives[$derivative_id]['bundles'] = $field_info['bundles']; - // @todo: Put in a category for the Entity label - // @todo: Look up the field label - $this->derivatives[$derivative_id]['admin_label'] = $this->t('Field @name', ['@name' => $field_name]); - $this->derivatives[$derivative_id]['context'] = [ + + // Set plugin definition for derivative. + $derivative = $base_plugin_definition; + $derivative['category'] = $this->t('@entity fields', array('@entity' => $entity_type_labels[$entity_type_id])); + $derivative['admin_label'] = $field_definition->getLabel(); + $derivative['context'] = [ 'entity' => new ContextDefinition('entity:' . $entity_type_id), ]; + + // This isn't part of the Block plugin definition - we're just stashing + // it for use later. + $derivative['bundles'] = $field_info['bundles']; + + $this->derivatives[$derivative_id] = $derivative; + } } return $this->derivatives;