瀏覽代碼

Add show field templates configuration + SonataIntlBundle support (optional)

Thomas Rabaix 13 年之前
父節點
當前提交
52867ccdc1

+ 33 - 2
Builder/ShowBuilder.php

@@ -23,16 +23,34 @@ class ShowBuilder implements ShowBuilderInterface
 {
     protected $guesser;
 
-    public function __construct(TypeGuesserInterface $guesser)
+    protected $templates;
+
+    /**
+     * @param \Sonata\AdminBundle\Guesser\TypeGuesserInterface $guesser
+     * @param array $templates
+     */
+    public function __construct(TypeGuesserInterface $guesser, array $templates)
     {
         $this->guesser = $guesser;
+        $this->templates = $templates;
     }
 
+    /**
+     * @param array $options
+     * @return \Sonata\AdminBundle\Admin\FieldDescriptionCollection
+     */
     public function getBaseList(array $options = array())
     {
         return new FieldDescriptionCollection;
     }
 
+    /**
+     * @param \Sonata\AdminBundle\Admin\FieldDescriptionCollection $list
+     * @param null $type
+     * @param \Sonata\AdminBundle\Admin\FieldDescriptionInterface $fieldDescription
+     * @param \Sonata\AdminBundle\Admin\AdminInterface $admin
+     * @return mixed
+     */
     public function addField(FieldDescriptionCollection $list, $type = null, FieldDescriptionInterface $fieldDescription, AdminInterface $admin)
     {
         if ($type == null) {
@@ -58,6 +76,19 @@ class ShowBuilder implements ShowBuilderInterface
 
     }
 
+    /**
+     * @param $type
+     * @return string
+     */
+    private function getTemplate($type)
+    {
+        if (!isset($this->templates[$type])) {
+            return null;
+        }
+
+        return $this->templates[$type];
+    }
+
     /**
      * The method defines the correct default settings for the provided FieldDescription
      *
@@ -92,7 +123,7 @@ class ShowBuilder implements ShowBuilderInterface
 
         if (!$fieldDescription->getTemplate()) {
 
-            $fieldDescription->setTemplate(sprintf('SonataAdminBundle:CRUD:show_%s.html.twig', $fieldDescription->getType()));
+            $fieldDescription->setTemplate($this->getTemplate($fieldDescription->getType()));
 
             if ($fieldDescription->getMappingType() == ClassMetadataInfo::MANY_TO_ONE) {
                 $fieldDescription->setTemplate('SonataDoctrineORMAdminBundle:CRUD:show_orm_many_to_one.html.twig');

+ 4 - 0
DependencyInjection/Configuration.php

@@ -54,6 +54,10 @@ class Configuration implements ConfigurationInterface
                                     ->useAttributeAsKey('name')
                                     ->prototype('scalar')->end()
                                 ->end()
+                                ->arrayNode('show')
+                                    ->useAttributeAsKey('name')
+                                    ->prototype('scalar')->end()
+                                ->end()
                             ->end()
                         ->end()
                     ->end()

+ 49 - 13
DependencyInjection/SonataDoctrineORMAdminExtension.php

@@ -37,7 +37,34 @@ class SonataDoctrineORMAdminExtension extends Extension
      */
     public function load(array $configs, ContainerBuilder $container)
     {
+        $configs = $this->fixTemplatesConfiguration($configs);
 
+        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+        $loader->load('doctrine_orm.xml');
+        $loader->load('doctrine_orm_filter_types.xml');
+
+        $configuration = new Configuration();
+        $processor = new Processor();
+        $config = $processor->processConfiguration($configuration, $configs);
+
+        $pool = $container->getDefinition('sonata.admin.manager.orm');
+        $pool->addMethodCall('__hack_doctrine_orm__', $config);
+
+        // define the templates
+        $container->getDefinition('sonata.admin.builder.orm_list')
+            ->replaceArgument(1, $config['templates']['types']['list']);
+
+        $container->getDefinition('sonata.admin.builder.orm_show')
+            ->replaceArgument(1, $config['templates']['types']['show']);
+    }
+
+
+    /**
+     * @param array $configs
+     * @return array
+     */
+    private function fixTemplatesConfiguration(array $configs)
+    {
         $defaultConfig = array(
             'templates' => array(
                 'types' => array(
@@ -53,6 +80,18 @@ class SonataDoctrineORMAdminExtension extends Extension
                         'integer'      => 'SonataAdminBundle:CRUD:base_list_field.html.twig',
                         'decimal'      => 'SonataAdminBundle:CRUD:base_list_field.html.twig',
                         'identifier'   => 'SonataAdminBundle:CRUD:base_list_field.html.twig',
+                    ),
+                    'show' => array(
+                        'array'        => 'SonataAdminBundle:CRUD:show_array.html.twig',
+                        'boolean'      => 'SonataAdminBundle:CRUD:show_boolean.html.twig',
+                        'date'         => 'SonataAdminBundle:CRUD:show_date.html.twig',
+                        'datetime'     => 'SonataAdminBundle:CRUD:show_datetime.html.twig',
+                        'text'         => 'SonataAdminBundle:CRUD:base_show_field.html.twig',
+                        'string'       => 'SonataAdminBundle:CRUD:base_show_field.html.twig',
+                        'smallint'     => 'SonataAdminBundle:CRUD:base_show_field.html.twig',
+                        'bigint'       => 'SonataAdminBundle:CRUD:base_show_field.html.twig',
+                        'integer'      => 'SonataAdminBundle:CRUD:base_show_field.html.twig',
+                        'decimal'      => 'SonataAdminBundle:CRUD:base_show_field.html.twig',
                     )
                 )
             )
@@ -68,22 +107,19 @@ class SonataDoctrineORMAdminExtension extends Extension
                 'integer'      => 'SonataIntlBundle:CRUD:list_decimal.html.twig',
                 'decimal'      => 'SonataIntlBundle:CRUD:list_decimal.html.twig',
             ));
+
+            $defaultConfig['templates']['types']['show'] = array_merge($defaultConfig['templates']['types']['show'], array(
+                'date'         => 'SonataIntlBundle:CRUD:show_date.html.twig',
+                'datetime'     => 'SonataIntlBundle:CRUD:show_datetime.html.twig',
+                'smallint'     => 'SonataIntlBundle:CRUD:show_decimal.html.twig',
+                'bigint'       => 'SonataIntlBundle:CRUD:show_decimal.html.twig',
+                'integer'      => 'SonataIntlBundle:CRUD:show_decimal.html.twig',
+                'decimal'      => 'SonataIntlBundle:CRUD:show_decimal.html.twig',
+            ));
         }
 
         array_unshift($configs, $defaultConfig);
 
-        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
-        $loader->load('doctrine_orm.xml');
-        $loader->load('doctrine_orm_filter_types.xml');
-
-        $configuration = new Configuration();
-        $processor = new Processor();
-        $config = $processor->processConfiguration($configuration, $configs);
-
-        $pool = $container->getDefinition('sonata.admin.manager.orm');
-        $pool->addMethodCall('__hack_doctrine_orm__', $config);
-
-        $container->getDefinition('sonata.admin.builder.orm_list')
-            ->replaceArgument(1, $config['templates']['types']['list']);
+        return $configs;
     }
 }

+ 1 - 0
Resources/config/doctrine_orm.xml

@@ -33,6 +33,7 @@
         <!-- ShowBuilder  -->
         <service id="sonata.admin.builder.orm_show" class="Sonata\DoctrineORMAdminBundle\Builder\ShowBuilder" >
             <argument type="service" id="sonata.admin.guesser.orm_show_chain" />
+            <argument />
         </service>
 
         <service id="sonata.admin.guesser.orm_show" class="Sonata\DoctrineORMAdminBundle\Guesser\TypeGuesser">

+ 25 - 4
Resources/doc/reference/templates.rst

@@ -27,7 +27,7 @@ You can also configure the templates used by the Form Framework while rendering
             filter: [ SonataDoctrineORMAdminBundle:Form:filter_admin_fields.html.twig ]
 
 
-You can also customize field types
+You can also customize field types by adding types in the ``config.yml`` file. The default values are :
 
 .. code-block:: yaml
 
@@ -35,10 +35,31 @@ You can also customize field types
         templates:
         types:
             list:
-                date:       SonataAdminBundle:CRUD:date_field.html.twig
-                datetime:   SonataAdminBundle:CRUD:datetime_field.html.twig
+                array:      SonataAdminBundle:CRUD:list_array.html.twig
+                boolean:    SonataAdminBundle:CRUD:list_boolean.html.twig
+                date:       SonataAdminBundle:CRUD:list_date.html.twig
+                datetime:   SonataAdminBundle:CRUD:list_datetime.html.twig
+                text:       SonataAdminBundle:CRUD:base_list_field.html.twig
+                string:     SonataAdminBundle:CRUD:base_list_field.html.twig
+                smallint:   SonataAdminBundle:CRUD:base_list_field.html.twig
+                bigint:     SonataAdminBundle:CRUD:base_list_field.html.twig
+                integer:    SonataAdminBundle:CRUD:base_list_field.html.twig
+                decimal:    SonataAdminBundle:CRUD:base_list_field.html.twig
+                identifier: SonataAdminBundle:CRUD:base_list_field.html.twig
+
+            show:
+                array:      SonataAdminBundle:CRUD:show_array.html.twig
+                boolean:    SonataAdminBundle:CRUD:show_boolean.html.twig
+                date:       SonataAdminBundle:CRUD:show_date.html.twig
+                datetime:   SonataAdminBundle:CRUD:show_datetime.html.twig
+                text:       SonataAdminBundle:CRUD:base_show_field.html.twig
+                string:     SonataAdminBundle:CRUD:base_show_field.html.twig
+                smallint:   SonataAdminBundle:CRUD:base_show_field.html.twig
+                bigint:     SonataAdminBundle:CRUD:base_show_field.html.twig
+                integer:    SonataAdminBundle:CRUD:base_show_field.html.twig
+                decimal:    SonataAdminBundle:CRUD:base_show_field.html.twig
 
 .. note::
 
     By default, if the ``SonataIntlBundle`` classes are availables, then the numeric and date fields will be
-    localized with the current user locale (only for list, work in progress).
+    localized with the current user locale.