Explorar el Código

datetime filters and some date filter fixes

Pat Haggerty hace 13 años
padre
commit
fca45b8a4b

+ 44 - 0
Form/Type/DateTimeRangeType.php

@@ -0,0 +1,44 @@
+<?php
+/*
+ * This file is part of the Sonata package.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ */
+
+namespace Sonata\AdminBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormTypeInterface;
+use Symfony\Component\Form\FormBuilder;
+
+use Symfony\Component\Translation\TranslatorInterface;
+
+class DateTimeRangeType extends AbstractType
+{
+    protected $translator;
+
+    public function __construct(TranslatorInterface $translator)
+    {
+        $this->translator = $translator;
+    }
+
+    public function buildForm(FormBuilder $builder, array $options)
+    {
+        $builder->add('start', 'datetime', array_merge(array('required' => false), $options['field_options']));
+        $builder->add('end', 'datetime', array_merge(array('required' => false), $options['field_options']));
+    }
+
+    public function getDefaultOptions(array $options)
+    {
+        return $options;
+    }
+    
+    public function getName()
+    {
+        return 'sonata_type_datetime_range';
+    }
+}

+ 4 - 2
Form/Type/Filter/DateRangeType.php

@@ -20,7 +20,8 @@ use Symfony\Component\Translation\TranslatorInterface;
 
 class DateRangeType extends AbstractType
 {
-    const TYPE_RANGE = 1;
+    const TYPE_BETWEEN = 1;
+    const TYPE_NOT_BETWEEN = 2;
 
     protected $translator;
 
@@ -45,7 +46,8 @@ class DateRangeType extends AbstractType
     public function buildForm(FormBuilder $builder, array $options)
     {
         $choices = array(
-            self::TYPE_RANGE            => $this->translator->trans('label_date_type_range', array(), 'SonataAdminBundle'),
+            self::TYPE_BETWEEN    => $this->translator->trans('label_date_type_between', array(), 'SonataAdminBundle'),
+            self::TYPE_NOT_BETWEEN    => $this->translator->trans('label_date_type_not_between', array(), 'SonataAdminBundle'),
         );
         
         $builder

+ 72 - 0
Form/Type/Filter/DateTimeRangeType.php

@@ -0,0 +1,72 @@
+<?php
+/*
+ * This file is part of the Sonata package.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ */
+
+namespace Sonata\AdminBundle\Form\Type\Filter;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormTypeInterface;
+use Symfony\Component\Form\FormBuilder;
+use Symfony\Component\Form\FormView;
+use Symfony\Component\Form\FormInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class DateTimeRangeType extends AbstractType
+{
+    const TYPE_BETWEEN = 1;
+    const TYPE_NOT_BETWEEN = 2;
+
+    protected $translator;
+
+    /**
+     * @param \Symfony\Component\Translation\TranslatorInterface $translator
+     */
+    public function __construct(TranslatorInterface $translator)
+    {
+        $this->translator = $translator;
+    }
+
+    /**
+     * Returns the name of this type.
+     *
+     * @return string The name of this type
+     */
+    public function getName()
+    {
+        return 'sonata_type_filter_datetime_range';
+    }
+
+    public function buildForm(FormBuilder $builder, array $options)
+    {
+        $choices = array(
+            self::TYPE_BETWEEN    => $this->translator->trans('label_date_type_between', array(), 'SonataAdminBundle'),
+            self::TYPE_NOT_BETWEEN    => $this->translator->trans('label_date_type_not_between', array(), 'SonataAdminBundle'),
+        );
+        
+        $builder
+            ->add('type', 'choice', array('choices' => $choices, 'required' => false))
+            ->add('value', 'sonata_type_datetime_range', array('field_options' => array_merge(array('date_format' => 'yyyy-MM-dd'), $options['field_options'])))
+        ;
+    }
+
+    public function getDefaultOptions(array $options)
+    {
+        $defaultOptions = array(
+            'operator_type'    => 'hidden',
+            'operator_options' => array(),
+            'field_type'       => 'text',
+            'field_options'    => array(),
+        );
+
+        $options = array_replace($options, $defaultOptions);
+
+        return $options;
+    }
+}

+ 89 - 0
Form/Type/Filter/DateTimeType.php

@@ -0,0 +1,89 @@
+<?php
+/*
+ * This file is part of the Sonata package.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ */
+
+namespace Sonata\AdminBundle\Form\Type\Filter;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormTypeInterface;
+use Symfony\Component\Form\FormBuilder;
+use Symfony\Component\Form\FormView;
+use Symfony\Component\Form\FormInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class DateTimeType extends AbstractType
+{
+    const TYPE_GREATER_EQUAL = 1;
+
+    const TYPE_GREATER_THAN = 2;
+
+    const TYPE_EQUAL = 3;
+
+    const TYPE_LESS_EQUAL = 4;
+
+    const TYPE_LESS_THAN = 5;
+
+    const TYPE_NULL = 6;
+    
+    const TYPE_NOT_NULL = 7;
+
+    
+    protected $translator;
+
+    /**
+     * @param \Symfony\Component\Translation\TranslatorInterface $translator
+     */
+    public function __construct(TranslatorInterface $translator)
+    {
+        $this->translator = $translator;
+    }
+
+    /**
+     * Returns the name of this type.
+     *
+     * @return string The name of this type
+     */
+    public function getName()
+    {
+        return 'sonata_type_filter_datetime';
+    }
+
+    public function buildForm(FormBuilder $builder, array $options)
+    {
+        $choices = array(
+            self::TYPE_EQUAL            => $this->translator->trans('label_date_type_equal', array(), 'SonataAdminBundle'),
+            self::TYPE_GREATER_EQUAL    => $this->translator->trans('label_date_type_greater_equal', array(), 'SonataAdminBundle'),
+            self::TYPE_GREATER_THAN     => $this->translator->trans('label_date_type_greater_than', array(), 'SonataAdminBundle'),
+            self::TYPE_LESS_EQUAL       => $this->translator->trans('label_date_type_less_equal', array(), 'SonataAdminBundle'),
+            self::TYPE_LESS_THAN        => $this->translator->trans('label_date_type_less_than', array(), 'SonataAdminBundle'),
+            self::TYPE_NULL             => $this->translator->trans('label_date_type_null', array(), 'SonataAdminBundle'),
+            self::TYPE_NOT_NULL         => $this->translator->trans('label_date_type_not_null', array(), 'SonataAdminBundle'),
+        );
+
+        $builder
+            ->add('type', 'choice', array('choices' => $choices, 'required' => false))
+            ->add('value', 'datetime', array_merge(array('required' => false, 'date_format' => 'yyyy-MM-dd'), $options['field_options']))
+        ;
+    }
+
+    public function getDefaultOptions(array $options)
+    {
+        $defaultOptions = array(
+            'operator_type'    => 'hidden',
+            'operator_options' => array(),
+            'field_type'       => 'text',
+            'field_options'    => array()
+        );
+
+        $options = array_replace($options, $defaultOptions);
+
+        return $options;
+    }
+}

+ 17 - 0
Resources/config/form_types.xml

@@ -43,6 +43,12 @@
             <argument type="service" id="translator" />
         </service>
 
+        <service id="sonata.admin.form.type.datetime_range" class="Sonata\AdminBundle\Form\Type\DateTimeRangeType">
+            <tag name="form.type" alias="sonata_type_datetime_range" />
+
+            <argument type="service" id="translator" />
+        </service>
+
         <!-- Form Extension -->
         <service id="sonata.admin.form.extension.field" class="Sonata\AdminBundle\Form\Extension\Field\Type\FormTypeFieldExtension">
             <tag name="form.type_extension" alias="field" />
@@ -70,11 +76,22 @@
             <tag name="form.type" alias="sonata_type_filter_date" />
             <argument type="service" id="translator" />
         </service>
+
         <service id="sonata.admin.form.filter.type.daterange" class="Sonata\AdminBundle\Form\Type\Filter\DateRangeType">
             <tag name="form.type" alias="sonata_type_filter_date_range" />
             <argument type="service" id="translator" />
         </service>
 
+        <service id="sonata.admin.form.filter.type.datetime" class="Sonata\AdminBundle\Form\Type\Filter\DateTimeType">
+            <tag name="form.type" alias="sonata_type_filter_datetime" />
+            <argument type="service" id="translator" />
+        </service>
+
+        <service id="sonata.admin.form.filter.type.datetime_range" class="Sonata\AdminBundle\Form\Type\Filter\DateTimeRangeType">
+            <tag name="form.type" alias="sonata_type_filter_datetime_range" />
+            <argument type="service" id="translator" />
+        </service>
+
     </services>
 
 </container>

+ 7 - 3
Resources/translations/SonataAdminBundle.en.xliff

@@ -250,9 +250,13 @@
               <source>label_date_type_not_null</source>
               <target>is not empty</target>
             </trans-unit>
-            <trans-unit id="label_date_type_range">
-              <source>label_date_type_range</source>
-              <target>range of dates</target>
+            <trans-unit id="label_date_type_between">
+              <source>label_date_type_between</source>
+              <target>between</target>
+            </trans-unit>
+            <trans-unit id="label_date_not_between">
+              <source>label_date_type_not_between</source>
+              <target>not between</target>
             </trans-unit>
             <trans-unit id="label_filters">
               <source>label_filters</source>