diff --git a/config/install/entity_embed.settings.yml b/config/install/entity_embed.settings.yml new file mode 100644 index 0000000..9bf5b72 --- /dev/null +++ b/config/install/entity_embed.settings.yml @@ -0,0 +1 @@ +rendered_entity_mode: false diff --git a/config/schema/entity_embed.schema.yml b/config/schema/entity_embed.schema.yml index 0f6aaec..014e705 100644 --- a/config/schema/entity_embed.schema.yml +++ b/config/schema/entity_embed.schema.yml @@ -29,3 +29,11 @@ embed.embed_type_settings.entity: display_review: type: boolean label: 'Display review step' + +entity_embed.settings: + type: config_object + label: 'Entity embed settings' + mapping: + rendered_entity_mode: + type: boolean + label: 'Rendered entity mode' diff --git a/entity_embed.install b/entity_embed.install index c01a745..57f83ca 100644 --- a/entity_embed.install +++ b/entity_embed.install @@ -43,3 +43,11 @@ function entity_embed_update_8001() { $old_embed_button->delete(); } } + +/** + * Updates the default mode settings. + */ +function entity_embed_update_8002() { + $config = \Drupal::service('config.factory')->getEditable('entity_embed.settings'); + $config->set('rendered_entity_mode', TRUE)->save(); +} diff --git a/src/Annotation/EntityEmbedDisplay.php b/src/Annotation/EntityEmbedDisplay.php index 8fe8d63..c453f18 100644 --- a/src/Annotation/EntityEmbedDisplay.php +++ b/src/Annotation/EntityEmbedDisplay.php @@ -53,4 +53,11 @@ class EntityEmbedDisplay extends Plugin { */ public $entity_types = FALSE; + /** + * Shows plugin in the UI if this is TRUE. + * + * @var bool + */ + public $expose_in_ui = TRUE; + } diff --git a/src/EntityEmbedDisplay/EntityEmbedDisplayManager.php b/src/EntityEmbedDisplay/EntityEmbedDisplayManager.php index 62bfc01..8c61e06 100644 --- a/src/EntityEmbedDisplay/EntityEmbedDisplayManager.php +++ b/src/EntityEmbedDisplay/EntityEmbedDisplayManager.php @@ -95,12 +95,28 @@ class EntityEmbedDisplayManager extends DefaultPluginManager { */ public function getDefinitionOptionsForEntity(EntityInterface $entity) { $definitions = $this->getDefinitionsForContexts(array('entity' => $entity, 'entity_type' => $entity->getEntityTypeId())); + $definitions = $this->filterExposedDefinitions($definitions); return array_map(function ($definition) { return (string) $definition['label']; }, $definitions); } /** + * Filters out plugins from definitions that should be hidden in the UI. + * + * @param array $definitions + * The array of plugin definitions. + * + * @return array + * Returns plugin definitions that should be displayed in the UI. + */ + public function filterExposedDefinitions(array $definitions) { + return array_filter($definitions, function($definition) { + return isset($definition['expose_in_ui']) && $definition['expose_in_ui'] == TRUE; + }); + } + + /** * Provides a list of plugins that can be used for a certain entity type. * * @param string $entity_type @@ -111,6 +127,7 @@ class EntityEmbedDisplayManager extends DefaultPluginManager { */ public function getDefinitionOptionsForEntityType($entity_type) { $definitions = $this->getDefinitionsForContexts(array('entity_type' => $entity_type)); + $definitions = $this->filterExposedDefinitions($definitions); return array_map(function ($definition) { return (string) $definition['label']; }, $definitions); diff --git a/src/Plugin/Derivative/FieldFormatterDeriver.php b/src/Plugin/Derivative/FieldFormatterDeriver.php index ccc759b..bcb9092 100644 --- a/src/Plugin/Derivative/FieldFormatterDeriver.php +++ b/src/Plugin/Derivative/FieldFormatterDeriver.php @@ -8,6 +8,7 @@ namespace Drupal\entity_embed\Plugin\Derivative; use Drupal\Component\Plugin\Derivative\DeriverBase; +use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Drupal\Core\Field\FormatterPluginManager; @@ -27,13 +28,23 @@ class FieldFormatterDeriver extends DeriverBase implements ContainerDeriverInter protected $formatterManager; /** + * The config factory service. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface + */ + protected $configFactory; + + /** * Constructs new FieldFormatterEntityEmbedDisplayBase. * * @param \Drupal\Core\Field\FormatterPluginManager $formatter_manager * The field formatter plugin manager. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * A config factory for retrieving required config objects. */ - public function __construct(FormatterPluginManager $formatter_manager) { + public function __construct(FormatterPluginManager $formatter_manager, ConfigFactoryInterface $config_factory) { $this->formatterManager = $formatter_manager; + $this->configFactory = $config_factory; } /** @@ -41,7 +52,8 @@ class FieldFormatterDeriver extends DeriverBase implements ContainerDeriverInter */ public static function create(ContainerInterface $container, $base_plugin_id) { return new static( - $container->get('plugin.manager.field.formatter') + $container->get('plugin.manager.field.formatter'), + $container->get('config.factory') ); } @@ -58,9 +70,13 @@ class FieldFormatterDeriver extends DeriverBase implements ContainerDeriverInter if (!isset($base_plugin_definition['field_type'])) { throw new \LogicException("Undefined field_type definition in plugin {$base_plugin_definition['id']}."); } + $mode = $this->configFactory->get('entity_embed.settings')->get('rendered_entity_mode'); foreach ($this->formatterManager->getOptions($base_plugin_definition['field_type']) as $formatter => $label) { $this->derivatives[$formatter] = $base_plugin_definition; $this->derivatives[$formatter]['label'] = $label; + if ($formatter == 'entity_reference_entity_view' && $mode == FALSE) { + $this->derivatives[$formatter]['expose_in_ui'] = FALSE; + } } return $this->derivatives; } diff --git a/src/Plugin/Derivative/ViewModeDeriver.php b/src/Plugin/Derivative/ViewModeDeriver.php index 56be677..2f7fb37 100644 --- a/src/Plugin/Derivative/ViewModeDeriver.php +++ b/src/Plugin/Derivative/ViewModeDeriver.php @@ -3,6 +3,7 @@ namespace Drupal\entity_embed\Plugin\Derivative; use Drupal\Component\Plugin\Derivative\DeriverBase; +use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\EntityDisplayRepositoryInterface; use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; @@ -23,13 +24,23 @@ class ViewModeDeriver extends DeriverBase implements ContainerDeriverInterface { protected $entityDisplayRepository; /** + * The config factory service. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface + */ + protected $configFactory; + + /** * Constructs a ViewModeDeriver object. * * @param \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_repository * The entity display repository. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * A config factory for retrieving required config objects. */ - public function __construct(EntityDisplayRepositoryInterface $entity_display_repository) { + public function __construct(EntityDisplayRepositoryInterface $entity_display_repository, ConfigFactoryInterface $config_factory) { $this->entityDisplayRepository = $entity_display_repository; + $this->configFactory = $config_factory; } /** @@ -37,7 +48,8 @@ class ViewModeDeriver extends DeriverBase implements ContainerDeriverInterface { */ public static function create(ContainerInterface $container, $base_plugin_id) { return new static( - $container->get('entity_display.repository') + $container->get('entity_display.repository'), + $container->get('config.factory') ); } @@ -45,12 +57,14 @@ class ViewModeDeriver extends DeriverBase implements ContainerDeriverInterface { * {@inheritdoc} */ public function getDerivativeDefinitions($base_plugin_definition) { + $mode = $this->configFactory->get('entity_embed.settings')->get('rendered_entity_mode'); foreach ($this->entityDisplayRepository->getAllViewModes() as $view_modes) { foreach ($view_modes as $view_mode => $definition) { $this->derivatives[$definition['id']] = $base_plugin_definition; $this->derivatives[$definition['id']]['label'] = new TranslatableMarkup($definition['label']); $this->derivatives[$definition['id']]['view_mode'] = $view_mode; $this->derivatives[$definition['id']]['entity_types'] = $definition['targetEntityType']; + $this->derivatives[$definition['id']]['expose_in_ui'] = $mode ? FALSE : TRUE; } } return $this->derivatives; diff --git a/src/Tests/EntityEmbedDialogTest.php b/src/Tests/EntityEmbedDialogTest.php index fcc80cd..8211bc4 100644 --- a/src/Tests/EntityEmbedDialogTest.php +++ b/src/Tests/EntityEmbedDialogTest.php @@ -90,9 +90,39 @@ class EntityEmbedDialogTest extends EntityEmbedTestBase { // Check that 'Next' is a primary button. $this->assertFieldByXPath('//input[contains(@class, "button--primary")]', 'Next', 'Next is a primary button'); - $title = $this->node->getTitle() . ' (' . $this->node->id() . ')'; + $title = $this->node->getTitle() . ' (' . $this->node->id() . ')'; $edit = ['entity_id' => $title]; - $this->drupalPostAjaxForm(NULL, $edit, 'op'); + $response = $this->drupalPostAjaxForm(NULL, $edit, 'op'); + $plugins = [ + 'entity_reference:entity_reference_label', + 'entity_reference:entity_reference_entity_id', + 'view_mode:node.full', + 'view_mode:node.rss', + 'view_mode:node.search_index', + 'view_mode:node.search_result', + 'view_mode:node.teaser', + ]; + foreach ($plugins as $plugin) { + $this->assertTrue(strpos($response[2]['data'], $plugin), 'Plugin ' . $plugin . ' is available in selection.'); + } + + $this->container->get('config.factory')->getEditable('entity_embed.settings') + ->set('rendered_entity_mode', TRUE)->save(); + $this->displayPluginManager()->clearCachedDefinitions(); + + $this->getEmbedDialog('custom_format', 'node'); + $title = $this->node->getTitle() . ' (' . $this->node->id() . ')'; + $edit = ['entity_id' => $title]; + $response = $this->drupalPostAjaxForm(NULL, $edit, 'op'); + + $plugins = [ + 'entity_reference:entity_reference_label', + 'entity_reference:entity_reference_entity_id', + 'entity_reference:entity_reference_entity_view', + ]; + foreach ($plugins as $plugin) { + $this->assertTrue(strpos($response[2]['data'], $plugin), 'Plugin ' . $plugin . ' is available in selection.'); + } /*$this->drupalPostForm(NULL, $edit, 'Next'); // Ensure form structure of the 'embed' step and submit form. $this->assertFieldByName('attributes[data-entity-embed-display]', 'Entity Embed Display plugin field is present.'); diff --git a/src/Tests/EntityReferenceFieldFormatterTest.php b/src/Tests/EntityReferenceFieldFormatterTest.php index 39242ad..9dbe32a 100644 --- a/src/Tests/EntityReferenceFieldFormatterTest.php +++ b/src/Tests/EntityReferenceFieldFormatterTest.php @@ -38,7 +38,6 @@ class EntityReferenceFieldFormatterTest extends EntityEmbedTestBase { $this->assertAvailableDisplayPlugins($this->node, [ 'entity_reference:entity_reference_label', 'entity_reference:entity_reference_entity_id', - 'entity_reference:entity_reference_entity_view', 'view_mode:node.full', 'view_mode:node.rss', 'view_mode:node.search_index', @@ -46,6 +45,16 @@ class EntityReferenceFieldFormatterTest extends EntityEmbedTestBase { 'view_mode:node.teaser', ]); + $this->container->get('config.factory')->getEditable('entity_embed.settings') + ->set('rendered_entity_mode', TRUE)->save(); + $this->displayPluginManager()->clearCachedDefinitions(); + + $this->assertAvailableDisplayPlugins($this->node, [ + 'entity_reference:entity_reference_label', + 'entity_reference:entity_reference_entity_id', + 'entity_reference:entity_reference_entity_view', + ]); + // Ensure that correct form attributes are returned for // 'entity_reference:entity_reference_entity_id' plugin. $form = array();