Quellcode durchsuchen

Add check to use SonataIntlBundle helper if available

Thomas Rabaix vor 13 Jahren
Ursprung
Commit
8b4a687fe2

+ 33 - 3
Builder/ListBuilder.php

@@ -23,16 +23,33 @@ class ListBuilder implements ListBuilderInterface
 {
     protected $guesser;
 
-    public function __construct(TypeGuesserInterface $guesser)
+    protected $templates = array();
+
+    /**
+     * @param \Sonata\AdminBundle\Guesser\TypeGuesserInterface $guesser
+     * @param array $templates
+     */
+    public function __construct(TypeGuesserInterface $guesser, $templates = array())
     {
-        $this->guesser = $guesser;
+        $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
+     */
     public function addField(FieldDescriptionCollection $list, $type = null, FieldDescriptionInterface $fieldDescription, AdminInterface $admin)
     {
         if ($type == null) {
@@ -50,6 +67,19 @@ class ListBuilder implements ListBuilderInterface
         return $list->add($fieldDescription);
     }
 
+    /**
+     * @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
      *
@@ -93,7 +123,7 @@ class ListBuilder implements ListBuilderInterface
 
         if (!$fieldDescription->getTemplate()) {
 
-            $fieldDescription->setTemplate(sprintf('SonataAdminBundle:CRUD:list_%s.html.twig', $fieldDescription->getType()));
+            $fieldDescription->setTemplate($this->getTemplate($fieldDescription->getType()));
 
             if ($fieldDescription->getMappingType() == ClassMetadataInfo::MANY_TO_ONE) {
                 $fieldDescription->setTemplate('SonataDoctrineORMAdminBundle:CRUD:list_orm_many_to_one.html.twig');

+ 8 - 0
DependencyInjection/Configuration.php

@@ -48,6 +48,14 @@ class Configuration implements ConfigurationInterface
                             ->prototype('scalar')->end()
                             ->defaultValue(array('SonataDoctrineORMAdminBundle:Form:filter_admin_fields.html.twig'))
                         ->end()
+                        ->arrayNode('types')
+                            ->children()
+                                ->arrayNode('list')
+                                    ->useAttributeAsKey('name')
+                                    ->prototype('scalar')->end()
+                                ->end()
+                            ->end()
+                        ->end()
                     ->end()
                 ->end()
             ->end()

+ 40 - 2
DependencyInjection/SonataDoctrineORMAdminExtension.php

@@ -35,17 +35,55 @@ class SonataDoctrineORMAdminExtension extends Extension
      * @param array            $configs    An array of configuration settings
      * @param ContainerBuilder $container A ContainerBuilder instance
      */
-    public function load(array $config, ContainerBuilder $container)
+    public function load(array $configs, ContainerBuilder $container)
     {
+
+        $defaultConfig = array(
+            'templates' => array(
+                'types' => array(
+                    'list' => array(
+                        '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',
+                    )
+                )
+            )
+        );
+
+        // let's add some magic
+        if (class_exists('Sonata\IntlBundle\SonataIntlBundle', true)) {
+            $defaultConfig['templates']['types']['list'] = array_merge($defaultConfig['templates']['types']['list'], array(
+                'date'         => 'SonataIntlBundle:CRUD:list_date.html.twig',
+                'datetime'     => 'SonataIntlBundle:CRUD:list_datetime.html.twig',
+                'smallint'     => 'SonataIntlBundle:CRUD:list_decimal.html.twig',
+                'bigint'       => 'SonataIntlBundle:CRUD:list_decimal.html.twig',
+                'integer'      => 'SonataIntlBundle:CRUD:list_decimal.html.twig',
+                'decimal'      => 'SonataIntlBundle:CRUD:list_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, $config);
+        $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']);
     }
 }

+ 1 - 0
Resources/config/doctrine_orm.xml

@@ -18,6 +18,7 @@
         <!-- ListBuilder -->
         <service id="sonata.admin.builder.orm_list" class="Sonata\DoctrineORMAdminBundle\Builder\ListBuilder" >
             <argument type="service" id="sonata.admin.guesser.orm_list_chain" />
+            <argument />
         </service>
 
         <service id="sonata.admin.guesser.orm_list" class="Sonata\DoctrineORMAdminBundle\Guesser\TypeGuesser">

+ 17 - 0
Resources/doc/reference/templates.rst

@@ -25,3 +25,20 @@ You can also configure the templates used by the Form Framework while rendering
         templates:
             form: [ SonataDoctrineORMAdminBundle:Form:form_admin_fields.html.twig ]
             filter: [ SonataDoctrineORMAdminBundle:Form:filter_admin_fields.html.twig ]
+
+
+You can also customize field types
+
+.. code-block:: yaml
+
+    sonata_doctrine_orm_admin:
+        templates:
+        types:
+            list:
+                date:       SonataAdminBundle:CRUD:date_field.html.twig
+                datetime:   SonataAdminBundle:CRUD:datetime_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).