Quellcode durchsuchen

Merge pull request #82 from Romain-Geissler/fix-submodel-filtering

Fix submodel filtering.
Thomas vor 13 Jahren
Ursprung
Commit
12729a1a6b
3 geänderte Dateien mit 77 neuen und 7 gelöschten Zeilen
  1. 3 1
      Filter/ModelFilter.php
  2. 40 6
      Tests/Filter/ModelFilterTest.php
  3. 34 0
      Tests/Filter/StringFilterTest.php

+ 3 - 1
Filter/ModelFilter.php

@@ -105,7 +105,9 @@ class ModelFilter extends Filter
             throw new \RunTimeException('Invalid mapping type');
         }
 
-        $alias = $queryBuilder->entityJoin($this->getParentAssociationMappings() + array($this->getAssociationMapping()));
+        $associationMappings = $this->getParentAssociationMappings();
+        $associationMappings[] = $this->getAssociationMapping();
+        $alias = $queryBuilder->entityJoin($associationMappings);
 
         return array($alias, false);
     }

+ 40 - 6
Tests/Filter/ModelFilterTest.php

@@ -13,7 +13,7 @@ namespace Sonata\DoctrineORMAdminBundle\Tests\Filter;
 
 use Sonata\DoctrineORMAdminBundle\Filter\ModelFilter;
 use Doctrine\ORM\Mapping\ClassMetadataInfo;
-use Sonata\AdminBundle\Form\Type\Filter\ChoiceType;
+use Sonata\AdminBundle\Form\Type\EqualType;
 use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;
 
 class ModelFilterTest extends \PHPUnit_Framework_TestCase
@@ -53,7 +53,7 @@ class ModelFilterTest extends \PHPUnit_Framework_TestCase
         $builder = new ProxyQuery(new QueryBuilder);
 
         $filter->filter($builder, 'alias', 'field', array(
-            'type' => ChoiceType::TYPE_CONTAINS,
+            'type' => EqualType::TYPE_IS_EQUAL,
             'value' => array('1', '2')
         ));
 
@@ -69,7 +69,7 @@ class ModelFilterTest extends \PHPUnit_Framework_TestCase
 
         $builder = new ProxyQuery(new QueryBuilder);
 
-        $filter->filter($builder, 'alias', 'field', array('type' => ChoiceType::TYPE_CONTAINS, 'value' => 2));
+        $filter->filter($builder, 'alias', 'field', array('type' => EqualType::TYPE_IS_EQUAL, 'value' => 2));
 
         $this->assertEquals(array('alias = :field_name_0'), $builder->query);
         $this->assertEquals(array('field_name_0' => 2), $builder->parameters);
@@ -109,14 +109,48 @@ class ModelFilterTest extends \PHPUnit_Framework_TestCase
         $filter->initialize('field_name', array(
             'mapping_type' => ClassMetadataInfo::ONE_TO_ONE,
             'field_name' => 'field_name',
-            'association_mapping' => 'association_mapping'
+            'association_mapping' => array(
+                'fieldName' => 'association_mapping'
+            )
         ));
 
         $builder = new ProxyQuery(new QueryBuilder);
 
-        $filter->apply($builder, array('type' => ChoiceType::TYPE_CONTAINS, 'value' => 'asd'));
+        $filter->apply($builder, array('type' => EqualType::TYPE_IS_EQUAL, 'value' => 'asd'));
 
-        $this->assertEquals(array('o.a', 's_a = :field_name_0'), $builder->query);
+        $this->assertEquals(array('o.association_mapping', 's_association_mapping = :field_name_0'), $builder->query);
+        $this->assertEquals(true, $filter->isActive());
+    }
+
+    public function testAssociationWithValidParentAssociationMappings()
+    {
+        $filter = new ModelFilter;
+        $filter->initialize('field_name', array(
+            'mapping_type' => ClassMetadataInfo::ONE_TO_ONE,
+            'field_name' => 'field_name',
+            'parent_association_mappings' => array(
+                array(
+                    'fieldName' => 'association_mapping'
+                ),
+                array(
+                    'fieldName' => 'sub_association_mapping'
+                ),
+            ),
+            'association_mapping' => array(
+                'fieldName' => 'sub_sub_association_mapping'
+            )
+        ));
+
+        $builder = new ProxyQuery(new QueryBuilder);
+
+        $filter->apply($builder, array('type' => EqualType::TYPE_IS_EQUAL, 'value' => 'asd'));
+
+        $this->assertEquals(array(
+            'o.association_mapping',
+            's_association_mapping.sub_association_mapping',
+            's_association_mapping_sub_association_mapping.sub_sub_association_mapping',
+            's_association_mapping_sub_association_mapping_sub_sub_association_mapping = :field_name_0'
+        ), $builder->query);
         $this->assertEquals(true, $filter->isActive());
     }
 }

+ 34 - 0
Tests/Filter/StringFilterTest.php

@@ -80,4 +80,38 @@ class StringFilterTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals(array('field_name_0' => 'asd'), $builder->parameters);
         $this->assertEquals(true, $filter->isActive());
     }
+
+    public function testEqualsWithValidParentAssociationMappings()
+    {
+        $filter = new StringFilter;
+        $filter->initialize('field_name', array(
+            'format' => '%s',
+            'field_name' => 'field_name',
+            'parent_association_mappings' => array(
+                array(
+                    'fieldName' => 'association_mapping'
+                ),
+                array(
+                    'fieldName' => 'sub_association_mapping'
+                ),
+                array(
+                    'fieldName' => 'sub_sub_association_mapping'
+                ),
+            )
+        ));
+
+        $builder = new ProxyQuery(new QueryBuilder);
+        $this->assertEquals(array(), $builder->query);
+
+        $filter->apply($builder, array('type' => ChoiceType::TYPE_EQUAL, 'value' => 'asd'));
+
+        $this->assertEquals(array(
+            'o.association_mapping',
+            's_association_mapping.sub_association_mapping',
+            's_association_mapping_sub_association_mapping.sub_sub_association_mapping',
+            's_association_mapping_sub_association_mapping_sub_sub_association_mapping.field_name = :field_name_0'
+        ), $builder->query);
+        $this->assertEquals(array('field_name_0' => 'asd'), $builder->parameters);
+        $this->assertEquals(true, $filter->isActive());
+    }
 }