Sfoglia il codice sorgente

Prettier way to generate unique parameter names.

Romain Geissler 13 anni fa
parent
commit
308f0c5e43

+ 8 - 0
Datagrid/ProxyQuery.php

@@ -25,9 +25,12 @@ class ProxyQuery implements ProxyQueryInterface
 
     protected $sortOrder;
 
+    protected $parameterUniqueId;
+
     public function __construct(QueryBuilder $queryBuilder)
     {
         $this->queryBuilder = $queryBuilder;
+        $this->uniqueParameterId = 0;
     }
 
     public function execute(array $params = array(), $hydrationMode = null)
@@ -163,4 +166,9 @@ class ProxyQuery implements ProxyQueryInterface
     {
         $this->queryBuilder->getMaxResults();
     }
+
+    public function getUniqueParameterId()
+    {
+        return $this->uniqueParameterId++;
+    }
 }

+ 3 - 3
Filter/AbstractDateFilter.php

@@ -49,8 +49,8 @@ abstract class AbstractDateFilter extends Filter
             //default type for range filter
             $data['type'] = !isset($data['type']) || !is_numeric($data['type']) ?  DateRangeType::TYPE_BETWEEN : $data['type'];
 
-            $startDateParameterName = $this->getNewParameterName();
-            $endDateParameterName = $this->getNewParameterName();
+            $startDateParameterName = $this->getNewParameterName($queryBuilder);
+            $endDateParameterName = $this->getNewParameterName($queryBuilder);
 
             if ($data['type'] == DateRangeType::TYPE_NOT_BETWEEN) {
                 $this->applyWhere($queryBuilder, sprintf('%s.%s < :%s OR %s.%s > :%s', $alias, $field, $startDateParameterName, $alias, $field, $endDateParameterName));
@@ -77,7 +77,7 @@ abstract class AbstractDateFilter extends Filter
             if (in_array($operator, array('NULL', 'NOT NULL'))) {
                 $this->applyWhere($queryBuilder, sprintf('%s.%s IS %s ', $alias, $field, $operator));
             } else {
-                $parameterName = $this->getNewParameterName();
+                $parameterName = $this->getNewParameterName($queryBuilder);
 
                 $this->applyWhere($queryBuilder, sprintf('%s.%s %s :%s', $alias, $field, $operator, $parameterName));
                 $queryBuilder->setParameter($parameterName, $data['value']);

+ 1 - 1
Filter/BooleanFilter.php

@@ -49,7 +49,7 @@ class BooleanFilter extends Filter
                 return;
             }
 
-            $parameterName = $this->getNewParameterName();
+            $parameterName = $this->getNewParameterName($queryBuilder);
             $this->applyWhere($queryBuilder, sprintf('%s.%s = :%s', $alias, $field, $parameterName));
             $queryBuilder->setParameter($parameterName, ($data['value'] == BooleanType::TYPE_YES) ? 1 : 0);
         }

+ 1 - 1
Filter/ChoiceFilter.php

@@ -50,7 +50,7 @@ class ChoiceFilter extends Filter
                 return;
             }
 
-            $parameterName = $this->getNewParameterName();
+            $parameterName = $this->getNewParameterName($queryBuilder);
 
             if ($data['type'] == ChoiceType::TYPE_NOT_CONTAINS) {
                 $this->applyWhere($queryBuilder, sprintf('%s.%s <> :%s', $alias, $field, $parameterName));

+ 3 - 7
Filter/Filter.php

@@ -16,7 +16,6 @@ use Sonata\AdminBundle\Filter\Filter as BaseFilter;
 abstract class Filter extends BaseFilter
 {
     protected $active = false;
-    protected $parameterUniqueId = 0;
 
     public function apply($queryBuilder, $value)
     {
@@ -54,14 +53,11 @@ abstract class Filter extends BaseFilter
         $this->active = true;
     }
 
-    protected function getNewParameterName()
+    protected function getNewParameterName($queryBuilder)
     {
         // dots are not accepted in a DQL identifier so replace them
-        // by underscores. To avoid any name conflict with two filters
-        // named myEntity.myProperty and myEntity_myProperty used at the
-        // same time, we also use the object hash, that are different
-        // for two objects alive at the same time.
-        return str_replace('.', '_', $this->getName()).'_'.spl_object_hash($this).'_'.($this->parameterUniqueId++);
+        // by underscores.
+        return str_replace('.', '_', $this->getName()).'_'.$queryBuilder->getUniqueParameterId();
     }
 
     public function isActive()

+ 2 - 2
Filter/ModelFilter.php

@@ -43,7 +43,7 @@ class ModelFilter extends Filter
             return;
         }
 
-        $parameterName = $this->getNewParameterName();
+        $parameterName = $this->getNewParameterName($queryBuilder);
 
         if (isset($data['type']) && $data['type'] == EqualType::TYPE_IS_NOT_EQUAL) {
             $this->applyWhere($queryBuilder, $queryBuilder->expr()->notIn($alias, ':'.$parameterName));
@@ -60,7 +60,7 @@ class ModelFilter extends Filter
             return;
         }
 
-        $parameterName = $this->getNewParameterName();
+        $parameterName = $this->getNewParameterName($queryBuilder);
 
         if (isset($data['type']) && $data['type'] == EqualType::TYPE_IS_NOT_EQUAL) {
             $this->applyWhere($queryBuilder, sprintf('%s != :%s', $alias, $parameterName));

+ 1 - 1
Filter/NumberFilter.php

@@ -37,7 +37,7 @@ class NumberFilter extends Filter
         }
 
         // c.name > '1' => c.name OPERATOR :FIELDNAME
-        $parameterName = $this->getNewParameterName();
+        $parameterName = $this->getNewParameterName($queryBuilder);
         $this->applyWhere($queryBuilder, sprintf('%s.%s %s :%s', $alias, $field, $operator, $parameterName));
         $queryBuilder->setParameter($parameterName,  $data['value']);
     }

+ 1 - 1
Filter/StringFilter.php

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