diff core/lib/Drupal/Core/ParamConverter/AdminPathConfigEntityConverter.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children af1871eacc83
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/ParamConverter/AdminPathConfigEntityConverter.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,104 @@
+<?php
+
+namespace Drupal\Core\ParamConverter;
+
+use Drupal\Core\Config\Entity\ConfigEntityInterface;
+use Drupal\Core\Routing\AdminContext;
+use Symfony\Component\Routing\Route;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+
+/**
+ * Makes sure the unmodified ConfigEntity is loaded on admin pages.
+ *
+ * Converts entity route arguments to unmodified entities as opposed to
+ * converting to entities with overrides, such as the negotiated language.
+ *
+ * This converter applies only if the path is an admin path, the entity is
+ * a config entity, and the "with_config_overrides" element is not set to TRUE
+ * on the parameter definition.
+ *
+ * Due to this converter having a higher weight than the default
+ * EntityConverter, every time this applies, it takes over the conversion duty
+ * from EntityConverter. As we only allow a single converter per route
+ * argument, EntityConverter is ignored when this converter applies.
+ */
+class AdminPathConfigEntityConverter extends EntityConverter {
+
+  /**
+   * The config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * The route admin context to determine whether a route is an admin one.
+   *
+   * @var \Drupal\Core\Routing\AdminContext
+   */
+  protected $adminContext;
+
+  /**
+   * Constructs a new EntityConverter.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The config factory.
+   * @param \Drupal\Core\Routing\AdminContext $admin_context
+   *   The route admin context service.
+   */
+  public function __construct(EntityManagerInterface $entity_manager, ConfigFactoryInterface $config_factory, AdminContext $admin_context) {
+    parent::__construct($entity_manager);
+
+    $this->configFactory = $config_factory;
+    $this->adminContext = $admin_context;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function convert($value, $definition, $name, array $defaults) {
+    $entity_type_id = $this->getEntityTypeFromDefaults($definition, $name, $defaults);
+
+    // If the entity type is dynamic, confirm it to be a config entity. Static
+    // entity types will have performed this check in self::applies().
+    if (strpos($definition['type'], 'entity:{') === 0) {
+      $entity_type = $this->entityManager->getDefinition($entity_type_id);
+      if (!$entity_type->entityClassImplements(ConfigEntityInterface::class)) {
+        return parent::convert($value, $definition, $name, $defaults);
+      }
+    }
+
+    if ($storage = $this->entityManager->getStorage($entity_type_id)) {
+      // Make sure no overrides are loaded.
+      return $storage->loadOverrideFree($value);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applies($definition, $name, Route $route) {
+    if (isset($definition['with_config_overrides']) && $definition['with_config_overrides']) {
+      return FALSE;
+    }
+
+    if (parent::applies($definition, $name, $route)) {
+      $entity_type_id = substr($definition['type'], strlen('entity:'));
+      // If the entity type is dynamic, defer checking to self::convert().
+      if (strpos($entity_type_id, '{') === 0) {
+        return TRUE;
+      }
+      // As we only want to override EntityConverter for ConfigEntities, find
+      // out whether the current entity is a ConfigEntity.
+      $entity_type = $this->entityManager->getDefinition($entity_type_id);
+      if ($entity_type->entityClassImplements(ConfigEntityInterface::class)) {
+        return $this->adminContext->isAdminRoute($route);
+      }
+    }
+    return FALSE;
+  }
+
+}