Browse Source

Allow extensions applying to all admins

Kévin Dunglas 11 years ago
parent
commit
2937c1afaf

+ 10 - 1
DependencyInjection/Compiler/ExtensionCompilerPass.php

@@ -26,6 +26,7 @@ class ExtensionCompilerPass implements CompilerPassInterface
      */
      */
     public function process(ContainerBuilder $container)
     public function process(ContainerBuilder $container)
     {
     {
+        $universalExtensions = array();
         foreach ($container->findTaggedServiceIds('sonata.admin.extension') as $id => $attributes) {
         foreach ($container->findTaggedServiceIds('sonata.admin.extension') as $id => $attributes) {
 
 
             $target = false;
             $target = false;
@@ -33,6 +34,10 @@ class ExtensionCompilerPass implements CompilerPassInterface
                 $target = $attributes[0]['target'];
                 $target = $attributes[0]['target'];
             }
             }
 
 
+            if (isset($attributes[0]['global']) && $attributes[0]['global']) {
+                $universalExtensions[] = $id;
+            }
+
             if (!$target || !$container->hasDefinition($target)) {
             if (!$target || !$container->hasDefinition($target)) {
                 continue;
                 continue;
             }
             }
@@ -46,8 +51,12 @@ 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);
-            $extensions = $this->getExtensionsForAdmin($id, $admin, $container, $extensionMap);
 
 
+            foreach ($universalExtensions as $extension) {
+                $admin->addMethodCall('addExtension', array(new Reference($extension)));
+            }
+
+            $extensions = $this->getExtensionsForAdmin($id, $admin, $container, $extensionMap);
             foreach ($extensions as $extension) {
             foreach ($extensions as $extension) {
                 if(!$container->hasDefinition($extension)){
                 if(!$container->hasDefinition($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));

+ 6 - 0
Resources/doc/reference/extensions.rst

@@ -31,6 +31,7 @@ There are two ways to configure your extensions and connect them to an admin.
 
 
 You can include this information in the service definition of your extension.
 You can include this information in the service definition of your extension.
 Add the tag *sonata.admin.extension* and use the *target* attribute to point to the admin you want to modify.
 Add the tag *sonata.admin.extension* and use the *target* attribute to point to the admin you want to modify.
+Set the *global* attribute to *true* and the extension will be added to all admins.
 
 
 .. configuration-block::
 .. configuration-block::
 
 
@@ -42,6 +43,11 @@ Add the tag *sonata.admin.extension* and use the *target* attribute to point to
                 tags:
                 tags:
                     - { name: sonata.admin.extension, target: acme.demo.admin.article }
                     - { name: sonata.admin.extension, target: acme.demo.admin.article }
 
 
+            acme.demo.order.extension:
+                class: Acme\Demo\BlogBundle\Admin\Extension\OrderAdminExtension
+                tags:
+                    - { name: sonata.admin.extension, global: true }
+
 The second option is to add it to your config.yml file.
 The second option is to add it to your config.yml file.
 
 
 .. configuration-block::
 .. configuration-block::

+ 27 - 10
Tests/DependencyInjection/Compiler/ExtensionCompilerPassTest.php

@@ -27,6 +27,8 @@ class ExtensionCompilerPassTest extends \PHPUnit_Framework_TestCase
     private $publishExtension;
     private $publishExtension;
     private $historyExtension;
     private $historyExtension;
     private $orderExtension;
     private $orderExtension;
+    private $securityExtension;
+    private $filterExtension;
 
 
     /**
     /**
      * Root name of the configuration
      * Root name of the configuration
@@ -41,11 +43,13 @@ class ExtensionCompilerPassTest extends \PHPUnit_Framework_TestCase
 
 
         $this->extension = new SonataAdminExtension();
         $this->extension = new SonataAdminExtension();
         $this->config    = $this->getConfig();
         $this->config    = $this->getConfig();
-        $this->root      = "sonata.admin";
+        $this->root      = 'sonata.admin';
 
 
         $this->publishExtension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
         $this->publishExtension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
         $this->historyExtension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
         $this->historyExtension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
         $this->orderExtension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
         $this->orderExtension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
+        $this->securityExtension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
+        $this->filterExtension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
     }
     }
 
 
     /**
     /**
@@ -216,6 +220,7 @@ class ExtensionCompilerPassTest extends \PHPUnit_Framework_TestCase
         $this->assertTrue($container->hasDefinition('sonata_extension_publish'));
         $this->assertTrue($container->hasDefinition('sonata_extension_publish'));
         $this->assertTrue($container->hasDefinition('sonata_extension_history'));
         $this->assertTrue($container->hasDefinition('sonata_extension_history'));
         $this->assertTrue($container->hasDefinition('sonata_extension_order'));
         $this->assertTrue($container->hasDefinition('sonata_extension_order'));
+        $this->assertTrue($container->hasDefinition('sonata_extension_security'));
 
 
         $this->assertTrue($container->hasDefinition('sonata_post_admin'));
         $this->assertTrue($container->hasDefinition('sonata_post_admin'));
         $this->assertTrue($container->hasDefinition('sonata_article_admin'));
         $this->assertTrue($container->hasDefinition('sonata_article_admin'));
@@ -223,22 +228,26 @@ class ExtensionCompilerPassTest extends \PHPUnit_Framework_TestCase
 
 
         $def = $container->get('sonata_post_admin');
         $def = $container->get('sonata_post_admin');
         $extensions = $def->getExtensions();
         $extensions = $def->getExtensions();
-        $this->assertCount(2, $extensions);
+        $this->assertCount(3, $extensions);
 
 
-        $this->assertInstanceOf(get_class($this->publishExtension), $extensions[0]);
-        $this->assertInstanceOf(get_class($this->historyExtension), $extensions[1]);
+        $this->assertInstanceOf(get_class($this->securityExtension), $extensions[0]);
+        $this->assertInstanceOf(get_class($this->publishExtension), $extensions[1]);
+        $this->assertInstanceOf(get_class($this->historyExtension), $extensions[2]);
 
 
         $def = $container->get('sonata_article_admin');
         $def = $container->get('sonata_article_admin');
         $extensions = $def->getExtensions();
         $extensions = $def->getExtensions();
-        $this->assertCount(2, $extensions);
-        $this->assertInstanceOf(get_class($this->publishExtension), $extensions[0]);
-        $this->assertInstanceOf(get_class($this->orderExtension), $extensions[1]);
+        $this->assertCount(3, $extensions);
+        $this->assertInstanceOf(get_class($this->securityExtension), $extensions[0]);
+        $this->assertInstanceOf(get_class($this->publishExtension), $extensions[1]);
+        $this->assertInstanceOf(get_class($this->orderExtension), $extensions[2]);
 
 
         $def = $container->get('sonata_news_admin');
         $def = $container->get('sonata_news_admin');
         $extensions = $def->getExtensions();
         $extensions = $def->getExtensions();
-        $this->assertCount(2, $extensions);
-        $this->assertInstanceOf(get_class($this->orderExtension), $extensions[0]);
-        $this->assertInstanceOf(get_class($this->historyExtension), $extensions[1]);
+        $this->assertCount(4, $extensions);
+        $this->assertInstanceOf(get_class($this->securityExtension), $extensions[0]);
+        $this->assertInstanceOf(get_class($this->orderExtension), $extensions[1]);
+        $this->assertInstanceOf(get_class($this->historyExtension), $extensions[2]);
+        $this->assertInstanceOf(get_class($this->filterExtension), $extensions[3]);
     }
     }
 
 
     /**
     /**
@@ -318,6 +327,14 @@ class ExtensionCompilerPassTest extends \PHPUnit_Framework_TestCase
         $container
         $container
             ->register('sonata_extension_order')
             ->register('sonata_extension_order')
             ->setClass(get_class($this->orderExtension));
             ->setClass(get_class($this->orderExtension));
+        $container
+            ->register('sonata_extension_security')
+            ->setClass(get_class($this->securityExtension))
+            ->addTag('sonata.admin.extension', array('global' => true));
+        $container
+            ->register('sonata_extension_filter')
+            ->setClass(get_class($this->filterExtension))
+            ->addTag('sonata.admin.extension', array('target' => 'sonata_news_admin'));
 
 
         return $container;
         return $container;
     }
     }