X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=web%2Fcore%2Fmodules%2Flayout_builder%2Fsrc%2FPlugin%2FDerivative%2FFieldBlockDeriver.php;fp=web%2Fcore%2Fmodules%2Flayout_builder%2Fsrc%2FPlugin%2FDerivative%2FFieldBlockDeriver.php;h=71b9c1e316c69cfd7ec62db04aa5912403023578;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hp=0000000000000000000000000000000000000000;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0;p=yaffs-website diff --git a/web/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php b/web/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php new file mode 100644 index 000000000..71b9c1e31 --- /dev/null +++ b/web/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php @@ -0,0 +1,137 @@ +entityTypeRepository = $entity_type_repository; + $this->entityFieldManager = $entity_field_manager; + $this->fieldTypeManager = $field_type_manager; + $this->formatterManager = $formatter_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, $base_plugin_id) { + return new static( + $container->get('entity_type.repository'), + $container->get('entity_field.manager'), + $container->get('plugin.manager.field.field_type'), + $container->get('plugin.manager.field.formatter') + ); + } + + /** + * {@inheritdoc} + */ + public function getDerivativeDefinitions($base_plugin_definition) { + $entity_type_labels = $this->entityTypeRepository->getEntityTypeLabels(); + foreach ($this->entityFieldManager->getFieldMap() as $entity_type_id => $entity_field_map) { + foreach ($entity_field_map as $field_name => $field_info) { + // Skip fields without any formatters. + $options = $this->formatterManager->getOptions($field_info['type']); + if (empty($options)) { + continue; + } + + foreach ($field_info['bundles'] as $bundle) { + $derivative = $base_plugin_definition; + $field_definition = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle)[$field_name]; + + // Store the default formatter on the definition. + $derivative['default_formatter'] = ''; + $field_type_definition = $this->fieldTypeManager->getDefinition($field_info['type']); + if (isset($field_type_definition['default_formatter'])) { + $derivative['default_formatter'] = $field_type_definition['default_formatter']; + } + + $derivative['category'] = $this->t('@entity', ['@entity' => $entity_type_labels[$entity_type_id]]); + + $derivative['admin_label'] = $field_definition->getLabel(); + + // Add a dependency on the field if it is configurable. + if ($field_definition instanceof FieldConfigInterface) { + $derivative['config_dependencies'][$field_definition->getConfigDependencyKey()][] = $field_definition->getConfigDependencyName(); + } + // For any field that is not display configurable, mark it as + // unavailable to place in the block UI. + $derivative['_block_ui_hidden'] = !$field_definition->isDisplayConfigurable('view'); + + // @todo Use EntityContextDefinition after resolving + // https://www.drupal.org/node/2932462. + $context_definition = new ContextDefinition('entity:' . $entity_type_id, $entity_type_labels[$entity_type_id], TRUE); + $context_definition->addConstraint('Bundle', [$bundle]); + $derivative['context'] = [ + 'entity' => $context_definition, + ]; + + $derivative_id = $entity_type_id . PluginBase::DERIVATIVE_SEPARATOR . $bundle . PluginBase::DERIVATIVE_SEPARATOR . $field_name; + $this->derivatives[$derivative_id] = $derivative; + } + } + } + return $this->derivatives; + } + +}