|
@@ -27,6 +27,7 @@ class ExtensionCompilerPass implements CompilerPassInterface
|
|
public function process(ContainerBuilder $container)
|
|
public function process(ContainerBuilder $container)
|
|
{
|
|
{
|
|
$universalExtensions = array();
|
|
$universalExtensions = array();
|
|
|
|
+ $targets = array();
|
|
|
|
|
|
foreach ($container->findTaggedServiceIds('sonata.admin.extension') as $id => $tags) {
|
|
foreach ($container->findTaggedServiceIds('sonata.admin.extension') as $id => $tags) {
|
|
foreach ($tags as $attributes) {
|
|
foreach ($tags as $attributes) {
|
|
@@ -37,17 +38,14 @@ class ExtensionCompilerPass implements CompilerPassInterface
|
|
}
|
|
}
|
|
|
|
|
|
if (isset($attributes['global']) && $attributes['global']) {
|
|
if (isset($attributes['global']) && $attributes['global']) {
|
|
- $universalExtensions[] = $id;
|
|
|
|
|
|
+ $universalExtensions[$id] = $attributes;
|
|
}
|
|
}
|
|
|
|
|
|
if (!$target || !$container->hasDefinition($target)) {
|
|
if (!$target || !$container->hasDefinition($target)) {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- $container
|
|
|
|
- ->getDefinition($target)
|
|
|
|
- ->addMethodCall('addExtension', array(new Reference($id)))
|
|
|
|
- ;
|
|
|
|
|
|
+ $this->addExtension($targets, $target, $id, $attributes);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -57,17 +55,34 @@ class ExtensionCompilerPass implements CompilerPassInterface
|
|
foreach ($container->findTaggedServiceIds('sonata.admin') as $id => $attributes) {
|
|
foreach ($container->findTaggedServiceIds('sonata.admin') as $id => $attributes) {
|
|
$admin = $container->getDefinition($id);
|
|
$admin = $container->getDefinition($id);
|
|
|
|
|
|
- foreach ($universalExtensions as $extension) {
|
|
|
|
- $admin->addMethodCall('addExtension', array(new Reference($extension)));
|
|
|
|
|
|
+ if (!isset($targets[$id])) {
|
|
|
|
+ $targets[$id] = new \SplPriorityQueue();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ foreach ($universalExtensions as $extension => $extensionAttributes) {
|
|
|
|
+ $this->addExtension($targets, $id, $extension, $extensionAttributes);
|
|
}
|
|
}
|
|
|
|
|
|
$extensions = $this->getExtensionsForAdmin($id, $admin, $container, $extensionMap);
|
|
$extensions = $this->getExtensionsForAdmin($id, $admin, $container, $extensionMap);
|
|
|
|
|
|
foreach ($extensions as $extension) {
|
|
foreach ($extensions as $extension) {
|
|
if (!$container->has($extension)) {
|
|
if (!$container->has($extension)) {
|
|
- throw new \InvalidArgumentException(sprintf('Unable to find extension service for id %s', $extension));
|
|
|
|
|
|
+ throw new \InvalidArgumentException(
|
|
|
|
+ sprintf('Unable to find extension service for id %s', $extension)
|
|
|
|
+ );
|
|
}
|
|
}
|
|
- $admin->addMethodCall('addExtension', array(new Reference($extension)));
|
|
|
|
|
|
+
|
|
|
|
+ $this->addExtension($targets, $id, $extension, $attributes);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ foreach ($targets as $target => $extensions) {
|
|
|
|
+ $extensions = iterator_to_array($extensions);
|
|
|
|
+ krsort($extensions);
|
|
|
|
+ $admin = $container->getDefinition($target);
|
|
|
|
+
|
|
|
|
+ foreach (array_values($extensions) as $extension) {
|
|
|
|
+ $admin->addMethodCall('addExtension', array($extension));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -197,4 +212,22 @@ class ExtensionCompilerPass implements CompilerPassInterface
|
|
|
|
|
|
return $this->hasTrait($parentClass, $traitName);
|
|
return $this->hasTrait($parentClass, $traitName);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Add extension configuration to the targets array.
|
|
|
|
+ *
|
|
|
|
+ * @param array $targets
|
|
|
|
+ * @param string $target
|
|
|
|
+ * @param string $extension
|
|
|
|
+ * @param array $attributes
|
|
|
|
+ */
|
|
|
|
+ private function addExtension(array &$targets, $target, $extension, $attributes)
|
|
|
|
+ {
|
|
|
|
+ if (!isset($targets[$target])) {
|
|
|
|
+ $targets[$target] = new \SplPriorityQueue();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $priority = isset($attributes['priority']) ? $attributes['priority'] : 0;
|
|
|
|
+ $targets[$target]->insert(new Reference($extension), $priority);
|
|
|
|
+ }
|
|
}
|
|
}
|