Browse Source

Add boolean condition on filter

Thomas Rabaix 13 years ago
parent
commit
f6ea82264e

+ 23 - 8
Filter/Filter.php

@@ -21,6 +21,12 @@ abstract class Filter implements FilterInterface
 
     protected $options = array();
 
+    protected $condition;
+
+    const CONDITION_OR = 'OR';
+
+    const CONDITION_AND = 'AND';
+
     /**
      * @param string $name
      * @param array $options
@@ -39,14 +45,6 @@ abstract class Filter implements FilterInterface
         return $this->name;
     }
 
-    /**
-     * @return array
-     */
-    public function getDefaultOptions()
-    {
-        return array();
-    }
-
     /**
      * @param string $name
      * @param null $default
@@ -124,4 +122,21 @@ abstract class Filter implements FilterInterface
     {
         return $this->value;
     }
+
+    /**
+     * @param $condition
+     * @return void
+     */
+    public function setCondition($condition)
+    {
+        $this->condition = $condition;
+    }
+
+    /**
+     * @return
+     */
+    public function getCondition()
+    {
+        return $this->condition;
+    }
 }

+ 10 - 2
Filter/ORM/BooleanFilter.php

@@ -42,18 +42,26 @@ class BooleanFilter extends Filter
                 return;
             }
 
-            $queryBuilder->andWhere($queryBuilder->expr()->in(sprintf('%s.%s', $alias, $field), $values));
+            $this->applyWhere($queryBuilder, $queryBuilder->expr()->in(sprintf('%s.%s', $alias, $field), $values));
         } else {
 
             if (!in_array($data['value'], array(BooleanType::TYPE_NO, BooleanType::TYPE_YES))) {
                 return;
             }
 
-            $queryBuilder->andWhere(sprintf('%s.%s = :%s', $alias, $field, $this->getName()));
+            $this->applyWhere($queryBuilder, sprintf('%s.%s = :%s', $alias, $field, $this->getName()));
             $queryBuilder->setParameter($this->getName(), ($data['value'] == BooleanType::TYPE_YES) ? 1 : 0);
         }
     }
 
+    /**
+     * @return array
+     */
+    function getDefaultOptions()
+    {
+        return array();
+    }
+
     public function getRenderSettings()
     {
         return array('sonata_type_filter_default', array(

+ 11 - 3
Filter/ORM/ChoiceFilter.php

@@ -39,9 +39,9 @@ class ChoiceFilter extends Filter
             }
 
             if ($data['type'] == ChoiceType::TYPE_NOT_CONTAINS) {
-                $queryBuilder->andWhere($queryBuilder->expr()->notIn(sprintf('%s.%s', $alias, $field ), $data['value']));
+                $this->applyWhere($queryBuilder, $queryBuilder->expr()->notIn(sprintf('%s.%s', $alias, $field ), $data['value']));
             } else {
-                $queryBuilder->andWhere($queryBuilder->expr()->in(sprintf('%s.%s', $alias, $field ), $data['value']));
+                $this->applyWhere($queryBuilder, $queryBuilder->expr()->in(sprintf('%s.%s', $alias, $field ), $data['value']));
             }
 
         } else {
@@ -50,7 +50,7 @@ class ChoiceFilter extends Filter
                 return;
             }
 
-            $queryBuilder->andWhere(sprintf('%s.%s = :%s', $alias, $field, $this->getName()));
+            $this->applyWhere($queryBuilder, sprintf('%s.%s = :%s', $alias, $field, $this->getName()));
             $queryBuilder->setParameter($this->getName(), $data['value']);
         }
     }
@@ -70,6 +70,14 @@ class ChoiceFilter extends Filter
         return isset($choices[$type]) ? $choices[$type] : false;
     }
 
+    /**
+     * @return array
+     */
+    function getDefaultOptions()
+    {
+        return array();
+    }
+
     public function getRenderSettings()
     {
         return array('sonata_type_filter_default', array(

+ 9 - 0
Filter/ORM/Filter.php

@@ -28,4 +28,13 @@ abstract class Filter extends BaseFilter
     {
         return array($queryBuilder->getRootAlias(), $this->getFieldName());
     }
+
+    protected function applyWhere($queryBuilder, $parameter)
+    {
+        if ($this->getCondition() == self::CONDITION_OR) {
+            $queryBuilder->orWhere($parameter);
+        } else {
+            $queryBuilder->andWhere($parameter);
+        }
+    }
 }

+ 4 - 4
Filter/ORM/ModelFilter.php

@@ -43,9 +43,9 @@ class ModelFilter extends Filter
         }
 
         if ($data['type'] == BooleanType::TYPE_NO) {
-            $queryBuilder->andWhere($queryBuilder->expr()->notIn(sprintf('%s.%s', $alias, $field), $data['value']));
+            $this->applyWhere($queryBuilder, $queryBuilder->expr()->notIn(sprintf('%s.%s', $alias, $field), $data['value']));
         } else {
-            $queryBuilder->andWhere($queryBuilder->expr()->in(sprintf('%s.%s', $alias, $field), $data['value']));
+            $this->applyWhere($queryBuilder, $queryBuilder->expr()->in(sprintf('%s.%s', $alias, $field), $data['value']));
         }
     }
 
@@ -56,9 +56,9 @@ class ModelFilter extends Filter
         }
 
         if ($data['type'] == BooleanType::TYPE_NO) {
-            $queryBuilder->andWhere(sprintf('%s.%s != :%s', $alias, $field, $this->getName()));
+            $this->applyWhere($queryBuilder, sprintf('%s.%s != :%s', $alias, $field, $this->getName()));
         } else {
-            $queryBuilder->andWhere(sprintf('%s.%s = :%s', $alias, $field, $this->getName()));
+            $this->applyWhere($queryBuilder, sprintf('%s.%s = :%s', $alias, $field, $this->getName()));
         }
 
         $queryBuilder->setParameter($this->getName(), $data['value']);

+ 9 - 1
Filter/ORM/NumberFilter.php

@@ -35,7 +35,7 @@ class NumberFilter extends Filter
         }
 
         // c.name > '1' => c.name OPERATOR :FIELDNAME
-        $queryBuilder->andWhere(sprintf('%s.%s %s :%s', $alias, $field, $operator, $this->getName()));
+        $this->applyWhere($queryBuilder, sprintf('%s.%s %s :%s', $alias, $field, $operator, $this->getName()));
         $queryBuilder->setParameter($this->getName(),  $data['value']);
     }
 
@@ -56,6 +56,14 @@ class NumberFilter extends Filter
         return isset($choices[$type]) ? $choices[$type] : false;
     }
 
+    /**
+     * @return array
+     */
+    function getDefaultOptions()
+    {
+        return array();
+    }
+
     public function getRenderSettings()
     {
         return array('sonata_type_filter_number', array(

+ 1 - 1
Filter/ORM/StringFilter.php

@@ -43,7 +43,7 @@ class StringFilter extends Filter
         }
 
         // c.name > '1' => c.name OPERATOR :FIELDNAME
-        $queryBuilder->andWhere(sprintf('%s.%s %s :%s', $alias, $field, $operator, $this->getName()));
+        $this->applyWhere($queryBuilder, sprintf('%s.%s %s :%s', $alias, $field, $operator, $this->getName()));
 
         if ($data['type'] == ChoiceType::TYPE_EQUAL) {
             $queryBuilder->setParameter($this->getName(), $data['value']);