فهرست منبع

Merge pull request #420 from somewherethere/date_filters

Date filters
Thomas 13 سال پیش
والد
کامیت
ad5bb37c1a

+ 39 - 0
Form/Type/DateRangeType.php

@@ -0,0 +1,39 @@
+<?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 DateRangeType extends AbstractType
+{
+    protected $translator;
+
+    public function __construct(TranslatorInterface $translator)
+    {
+        $this->translator = $translator;
+    }
+
+    public function buildForm(FormBuilder $builder, array $options)
+    {
+        $builder->add('start', 'date', array('required' => false));
+        $builder->add('end', 'date', array('required' => false));
+    }
+    
+    public function getName()
+    {
+        return 'sonata_type_date_range';
+    }
+}

+ 70 - 0
Form/Type/Filter/DateRangeType.php

@@ -0,0 +1,70 @@
+<?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 DateRangeType extends AbstractType
+{
+    const TYPE_RANGE = 1;
+
+    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_date_range';
+    }
+
+    public function buildForm(FormBuilder $builder, array $options)
+    {
+        $choices = array(
+            self::TYPE_RANGE            => $this->translator->trans('label_date_type_range', array(), 'SonataAdminBundle'),
+        );
+
+        $builder
+            ->add('type', 'choice', array('choices' => $choices, 'required' => false))
+            ->add('value', 'sonata_type_date_range', array('required' => false))
+        ;
+    }
+
+    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/DateType.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 DateType 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_date';
+    }
+
+    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', 'date', array('required' => false))
+        ;
+    }
+
+    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;
+    }
+}

+ 16 - 0
Resources/config/form_types.xml

@@ -36,6 +36,12 @@
             <tag name="form.type" alias="sonata_type_translatable_choice" />
             <argument type="service" id="translator" />
         </service>
+        
+        <service id="sonata.admin.form.type.date_range" class="Sonata\AdminBundle\Form\Type\DateRangeType">
+            <tag name="form.type" alias="sonata_type_date_range" />
+
+            <argument type="service" id="translator" />
+        </service>
 
         <!-- Form Extension -->
         <service id="sonata.admin.form.extension.field" class="Sonata\AdminBundle\Form\Extension\Field\Type\FormTypeFieldExtension">
@@ -59,6 +65,16 @@
         <service id="sonata.admin.form.filter.type.default" class="Sonata\AdminBundle\Form\Type\Filter\DefaultType">
             <tag name="form.type" alias="sonata_type_filter_default" />
         </service>
+        
+        <service id="sonata.admin.form.filter.type.date" class="Sonata\AdminBundle\Form\Type\Filter\DateType">
+            <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_daterange" />
+            <argument type="service" id="translator" />
+        </service>
+
     </services>
 
 </container>

+ 32 - 0
Resources/translations/SonataAdminBundle.en.xliff

@@ -222,6 +222,38 @@
               <source>label_type_less_than</source>
               <target>&lt;</target>
             </trans-unit>
+            <trans-unit id="label_date_type_equal">
+              <source>label_date_type_equal</source>
+              <target>=</target>
+            </trans-unit>
+            <trans-unit id="label_date_type_greater_equal">
+              <source>label_date_type_greater_equal</source>
+              <target>&gt;=</target>
+            </trans-unit>
+            <trans-unit id="label_date_type_greater_than">
+              <source>label_date_type_greater_than</source>
+              <target>&gt;</target>
+            </trans-unit>
+            <trans-unit id="label_date_type_less_equal">
+              <source>label_date_type_less_equal</source>
+              <target>&lt;=</target>
+            </trans-unit>
+            <trans-unit id="label_date_type_less_than">
+              <source>label_date_type_less_than</source>
+              <target>&lt;</target>
+            </trans-unit>
+            <trans-unit id="label_date_type_null">
+              <source>label_date_type_null</source>
+              <target>is empty</target>
+            </trans-unit>
+            <trans-unit id="label_date_type_not_null">
+              <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>
             <trans-unit id="label_filters">
               <source>label_filters</source>
               <target>Filters</target>