Kaynağa Gözat

date and daterange filters

Pat Haggerty 13 yıl önce
ebeveyn
işleme
741a3d55cc

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

@@ -0,0 +1,71 @@
+<?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_daterange';
+    }
+
+    public function buildForm(FormBuilder $builder, array $options)
+    {
+        $choices = array(
+            self::TYPE_RANGE            => $this->translator->trans('label_type_range', array(), 'SonataAdminBundle'),
+        );
+
+        $builder
+            ->add('type', 'choice', array('choices' => $choices, 'required' => false))
+            ->add('value', 'date', array('required' => false))
+            ->add('valueb', '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;
+    }
+}

+ 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_type_equal', array(), 'SonataAdminBundle'),
+            self::TYPE_GREATER_EQUAL    => $this->translator->trans('label_type_greater_equal', array(), 'SonataAdminBundle'),
+            self::TYPE_GREATER_THAN     => $this->translator->trans('label_type_greater_than', array(), 'SonataAdminBundle'),
+            self::TYPE_LESS_EQUAL       => $this->translator->trans('label_type_less_equal', array(), 'SonataAdminBundle'),
+            self::TYPE_LESS_THAN        => $this->translator->trans('label_type_less_than', array(), 'SonataAdminBundle'),
+            self::TYPE_NULL             => $this->translator->trans('label_type_null', array(), 'SonataAdminBundle'),
+            self::TYPE_NOT_NULL         => $this->translator->trans('label_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;
+    }
+}

+ 10 - 0
Resources/config/form_types.xml

@@ -55,6 +55,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>

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

@@ -222,6 +222,18 @@
               <source>label_type_less_than</source>
               <target>&lt;</target>
             </trans-unit>
+            <trans-unit id="label_type_null">
+              <source>label_type_null</source>
+              <target>is empty</target>
+            </trans-unit>
+            <trans-unit id="label_type_not_null">
+              <source>label_type_not_null</source>
+              <target>is not empty</target>
+            </trans-unit>
+            <trans-unit id="label_type_range">
+              <source>label_type_range</source>
+              <target>range of dates</target>
+            </trans-unit>
             <trans-unit id="label_filters">
               <source>label_filters</source>
               <target>Filters</target>

+ 8 - 1
Resources/views/CRUD/base_list.html.twig

@@ -153,7 +153,14 @@ file that was distributed with this source code.
                                         <tr id="filter_{{ filter.name }}_row">
                                             <td class="filter-title">{{ admin.trans(filter.label) }}</td>
                                             <td class="filter-type">{{ form_widget(form.getChild(filter.name).getChild('type')) }}</td>
-                                            <td class="filter-value">{{ form_widget(form.getChild(filter.name).getChild('value')) }}</td>
+                                            <td class="filter-value">
+                                                {{ form_widget(form.getChild(filter.name).getChild('value')) }}
+                                                    
+                                                {% if form.getChild(filter.name).getChildren()['valueb'] is defined %}
+                                                    {{ form_widget(form.getChild(filter.name).getChild('valueb')) }}
+                                                {% endif %}
+
+                                            </td>
                                         </tr>
                                     {% endfor %}
                                 </table>