Bladeren bron

add documentation and option to overwrite some templates

Thomas Rabaix 10 jaren geleden
bovenliggende
commit
24f64f4139

+ 15 - 14
DependencyInjection/Compiler/AddDependencyCallsCompilerPass.php

@@ -138,8 +138,8 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
     /**
      * This method read the attribute keys and configure admin class to use the related dependency
      *
-     * @param \Symfony\Component\DependencyInjection\Definition $definition
-     * @param array                                             $attributes
+     * @param Definition $definition
+     * @param array      $attributes
      */
     public function applyConfigurationFromAttribute(Definition $definition, array $attributes)
     {
@@ -172,11 +172,11 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
     /**
      * Apply the default values required by the AdminInterface to the Admin service definition
      *
-     * @param  \Symfony\Component\DependencyInjection\ContainerBuilder $container
-     * @param  string                                                  $serviceId
-     * @param  array                                                   $attributes
+     * @param  ContainerBuilder $container
+     * @param  string           $serviceId
+     * @param  array            $attributes
      *
-     * @return \Symfony\Component\DependencyInjection\Definition
+     * @return Definition
      */
     public function applyDefaults(ContainerBuilder $container, $serviceId, array $attributes = array())
     {
@@ -187,7 +187,7 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
 
         $manager_type = $attributes['manager_type'];
 
-        $addServices = isset($settings[$serviceId]) ? $settings[$serviceId] : array();
+        $overwriteAdminConfiguration = isset($settings[$serviceId]) ? $settings[$serviceId] : array();
 
         $defaultAddServices = array(
             'model_manager'             => sprintf('sonata.admin.manager.%s', $manager_type),
@@ -211,8 +211,8 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
         foreach ($defaultAddServices as $attr => $addServiceId) {
             $method = 'set' . BaseFieldDescription::camelize($attr);
 
-            if (isset($addServices[$attr]) || !$definition->hasMethodCall($method)) {
-                $definition->addMethodCall($method, array(new Reference(isset($addServices[$attr]) ? $addServices[$attr] : $addServiceId)));
+            if (isset($overwriteAdminConfiguration[$attr]) || !$definition->hasMethodCall($method)) {
+                $definition->addMethodCall($method, array(new Reference(isset($overwriteAdminConfiguration[$attr]) ? $overwriteAdminConfiguration[$attr] : $addServiceId)));
             }
         }
 
@@ -234,7 +234,7 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
 
         $definition->addMethodCall('setPersistFilters', array($persistFilters));
 
-        $this->fixTemplates($container, $definition);
+        $this->fixTemplates($container, $definition, isset($overwriteAdminConfiguration['templates']) ? $overwriteAdminConfiguration['templates'] : array());
 
         if ($container->hasParameter('sonata.admin.configuration.security.information') && !$definition->hasMethodCall('setSecurityInformation')) {
             $definition->addMethodCall('setSecurityInformation', array('%sonata.admin.configuration.security.information%'));
@@ -246,12 +246,13 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
     }
 
     /**
-     * @param  \Symfony\Component\DependencyInjection\ContainerBuilder $container
-     * @param  \Symfony\Component\DependencyInjection\Definition       $definition
+     * @param ContainerBuilder $container
+     * @param Definition       $definition
+     * @param array            $overwrittenTemplates
      *
      * @return void
      */
-    public function fixTemplates(ContainerBuilder $container, Definition $definition)
+    public function fixTemplates(ContainerBuilder $container, Definition $definition, array $overwrittenTemplates = array())
     {
         $definedTemplates = $container->getParameter('sonata.admin.configuration.templates');
 
@@ -305,7 +306,7 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
             'outer_list_rows_mosaic'     => 'SonataAdminBundle:CRUD:list_outer_rows_mosaic.html.twig',
             'outer_list_rows_list'       => 'SonataAdminBundle:CRUD:list_outer_rows_list.html.twig',
             'outer_list_rows_tree'       => 'SonataAdminBundle:CRUD:list_outer_rows_tree.html.twig',
-        ), $definedTemplates);
+        ), $definedTemplates, $overwrittenTemplates);
 
         $definition->addMethodCall('setTemplates', array($definedTemplates));
     }

+ 7 - 4
DependencyInjection/Compiler/ExtensionCompilerPass.php

@@ -73,10 +73,11 @@ class ExtensionCompilerPass implements CompilerPassInterface
     }
 
     /**
-     * @param string $id
-     * @param Definition $admin
+     * @param string           $id
+     * @param Definition       $admin
      * @param ContainerBuilder $container
-     * @param array $extensionMap
+     * @param array            $extensionMap
+     *
      * @return array
      */
     protected function getExtensionsForAdmin($id, Definition $admin, ContainerBuilder $container, array $extensionMap)
@@ -133,8 +134,9 @@ class ExtensionCompilerPass implements CompilerPassInterface
     /**
      * Resolves the class argument of the admin to an actual class (in case of %parameter%)
      *
-     * @param Definition $admin
+     * @param Definition       $admin
      * @param ContainerBuilder $container
+     *
      * @return string
      */
     protected function getManagedClass(Definition $admin, ContainerBuilder $container)
@@ -144,6 +146,7 @@ class ExtensionCompilerPass implements CompilerPassInterface
 
     /**
      * @param array $config
+     *
      * @return array
      */
     protected function flattenExtensionConfiguration(array $config)

+ 18 - 11
DependencyInjection/Configuration.php

@@ -136,17 +136,24 @@ class Configuration implements ConfigurationInterface
                     ->useAttributeAsKey('id')
                     ->prototype('array')
                         ->children()
-                            ->scalarNode('model_manager')->end()
-                            ->scalarNode('form_contractor')->end()
-                            ->scalarNode('show_builder')->end()
-                            ->scalarNode('list_builder')->end()
-                            ->scalarNode('datagrid_builder')->end()
-                            ->scalarNode('translator')->end()
-                            ->scalarNode('configuration_pool')->end()
-                            ->scalarNode('router')->end()
-                            ->scalarNode('validator')->end()
-                            ->scalarNode('security_handler')->end()
-                            ->scalarNode('label')->end()
+                            ->scalarNode('model_manager')->defaultValue(null)->end()
+                            ->scalarNode('form_contractor')->defaultValue(null)->end()
+                            ->scalarNode('show_builder')->defaultValue(null)->end()
+                            ->scalarNode('list_builder')->defaultValue(null)->end()
+                            ->scalarNode('datagrid_builder')->defaultValue(null)->end()
+                            ->scalarNode('translator')->defaultValue(null)->end()
+                            ->scalarNode('configuration_pool')->defaultValue(null)->end()
+                            ->scalarNode('route_generator')->defaultValue(null)->end()
+                            ->scalarNode('validator')->defaultValue(null)->end()
+                            ->scalarNode('security_handler')->defaultValue(null)->end()
+                            ->scalarNode('label')->defaultValue(null)->end()
+                            ->scalarNode('menu_factory')->defaultValue(null)->end()
+                            ->scalarNode('route_builder')->defaultValue(null)->end()
+                            ->scalarNode('label_translator_strategy')->defaultValue(null)->end()
+                            ->arrayNode('templates')
+                                ->useAttributeAsKey('id')
+                                ->prototype('scalar')->defaultValue(null)->end()
+                            ->end()
                         ->end()
                     ->end()
                 ->end()

+ 33 - 0
Resources/doc/cookbook/recipe_overwrite_admin_configuration.rst

@@ -0,0 +1,33 @@
+Overwrite Admin Configuration
+=============================
+
+Sometime you might want to overwrite some Admin settings from vendors. This recipe will explain how to achieve this operation. However, keep in mind this operation is quite dangerous and might break code.
+
+From the configuration file, you can add a new section named ``admin_services`` with the following templates:
+
+.. code-block:: yaml
+
+    sonata_admin:
+        admin_services:
+            id.of.admin.service:
+                # service configuration
+                model_manager:              sonata.admin.manager.doctrine_orm
+                form_contractor:            sonata.admin.builder.doctrine_orm
+                show_builder:               sonata.admin.builder.doctrine_orm
+                list_builder:               sonata.admin.builder.doctrine_orm
+                datagrid_builder:           sonata.admin.builder.doctrine_orm
+                translator:                 translator
+                configuration_pool:         sonata.admin.pool
+                route_generator:            sonata.admin.route.default_generator
+                validator:                  validator
+                security_handler:           sonata.admin.security.handler
+                menu_factor:                knp_menu.factory
+                route_builder:              sonata.admin.route.path_info
+                label_translator_strategy:  sonata.admin.label.strategy.native
+
+                # templates configuration
+                templates:
+                    user_block:             mytemplate.twig.html
+
+
+With these settings you will be able to change default services and templates used by the `id.of.admin.service`` admin instance.

+ 1 - 0
Resources/doc/index.rst

@@ -61,3 +61,4 @@ Cookbook
    cookbook/recipe_dynamic_form_modification
    cookbook/recipe_custom_action
    cookbook/recipe_customizing_a_mosaic_list
+   cookbook/recipe_overwrite_admin_configuration

+ 30 - 0
Tests/DependencyInjection/Compiler/AddDependencyCallsCompilerPassTest.php

@@ -164,6 +164,28 @@ class AddDependencyCallsCompilerPassTest extends \PHPUnit_Framework_TestCase
         $this->assertFalse(array_key_exists('%sonata.admin.parameter.groupname%', $adminGroups));
     }
 
+    public function testApplyTemplatesConfiguration()
+    {
+        $container = $this->getContainer();
+
+        $this->extension->load(array($this->getConfig()), $container);
+
+        $compilerPass = new AddDependencyCallsCompilerPass();
+        $compilerPass->process($container);
+
+        $calls = $container->getDefinition('sonata_post_admin')->getMethodCalls();
+
+        foreach ($calls as $call) {
+            list($name, $parameters) = $call;
+
+            if ($name !== 'setTemplates') {
+                continue;
+            }
+
+            $this->assertEquals('foobar.twig.html', $parameters[0]['user_block']);
+        }
+    }
+
     /**
      * @return array
      */
@@ -184,8 +206,16 @@ class AddDependencyCallsCompilerPassTest extends \PHPUnit_Framework_TestCase
                         'roles' => array('ROLE_ONE'),
                     ),
                 )
+            ),
+            'admin_services' => array(
+                'sonata_post_admin' => array(
+                    'templates' => array(
+                        'user_block' => 'foobar.twig.html'
+                    )
+                )
             )
         );
+
         return $config;
     }
 

+ 42 - 0
Tests/DependencyInjection/ConfigurationTest.php

@@ -40,4 +40,46 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase
             )
         )));
     }
+
+    public function testCustomTemplatesPerAdmin()
+    {
+        $processor = new Processor();
+
+        $config = $processor->processConfiguration(new Configuration(), array(array(
+            'admin_services' => array(
+                'my_admin_id' => array(
+                    'templates' => array('user_block' => 'SonataAdminBundle:mycustomtemplate.html.twig')
+                )
+            )
+        )));
+
+        $this->assertEquals('SonataAdminBundle:mycustomtemplate.html.twig', $config['admin_services']['my_admin_id']['templates']['user_block']);
+    }
+
+    public function testAdminServicesDefault()
+    {
+        $processor = new Processor();
+
+        $config = $processor->processConfiguration(new Configuration(), array(array(
+            'admin_services' => array('my_admin_id' => array())
+        )));
+
+        $this->assertEquals(array(
+            'model_manager' => null,
+            'form_contractor' => null,
+            'show_builder' => null,
+            'list_builder' => null,
+            'datagrid_builder' => null,
+            'translator' => null,
+            'configuration_pool' => null,
+            'validator' => null,
+            'security_handler' => null,
+            'label' => null,
+            'templates' => array(),
+            'route_generator' => null,
+            'menu_factory' => null,
+            'route_builder' => null,
+            'label_translator_strategy' => null
+        ), $config['admin_services']['my_admin_id']);
+    }
 }