Browse Source

Sortable Repository

Lukas Botsch 14 years ago
parent
commit
0cdfd0b53d

+ 76 - 0
lib/Gedmo/Sortable/Entity/Repository/SortableRepository.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace Gedmo\Sortable\Entity\Repository;
+
+use Doctrine\ORM\EntityRepository,
+    Doctrine\ORM\EntityManager,
+    Doctrine\ORM\Mapping\ClassMetadata;
+
+class SortableRepository extends EntityRepository
+{
+    /**
+     * Sortable listener on event manager
+     *
+     * @var SortableListener
+     */
+    protected $listener = null;
+    
+    protected $config = null;
+    protected $meta = null;
+    
+    public function __construct(EntityManager $em, ClassMetadata $class)
+    {
+        parent::__construct($em, $class);
+        $sortableListener = null;
+        foreach ($em->getEventManager()->getListeners() as $event => $listeners) {
+            foreach ($listeners as $hash => $listener) {
+                if ($listener instanceof \Gedmo\Sortable\SortableListener) {
+                    $sortableListener = $listener;
+                    break;
+                }
+            }
+            if ($sortableListener) {
+                break;
+            }
+        }
+
+        if (is_null($sortableListener)) {
+            throw new \Gedmo\Exception\InvalidMappingException('This repository can be attached only to ORM sortable listener');
+        }
+
+        $this->listener = $sortableListener;
+        $this->meta = $this->getClassMetadata();
+        $this->config = $this->listener->getConfiguration($this->_em, $this->meta->name);
+    }
+    
+    public function getBySortableGroupsQuery(array $groupValues=array())
+    {
+        $groups = array_combine(array_values($this->config['groups']), array_keys($this->config['groups']));
+        foreach ($groupValues as $name => $value) {
+            if (!in_array($name, $this->config['groups'])) {
+                throw new \InvalidArgumentException('Sortable group "'.$name.'" is not defined in Entity '.$this->meta->name);
+            }
+            unset($groups[$name]);
+        }
+        if (count($groups) > 0) {
+            throw new \InvalidArgumentException(
+                'You need to specify values for the following groups to select by sortable groups: '.implode(", ", array_keys($groups)));
+        }
+        
+        $qb = $this->createQueryBuilder('n');
+        $qb->orderBy('n.'.$this->config['position']);
+        $i = 1;
+        foreach ($groupValues as $group => $value) {
+            $qb->andWhere('n.'.$group.' = :group'.$i)
+               ->setParameter('group'.$i, $value);
+            $i++;
+        }
+        return $qb->getQuery();
+    }
+    
+    public function getBySortableGroups(array $groupValues=array())
+    {
+        $query = $this->getBySortableGroupsQuery($groupValues);
+        return $query->getResult();
+    }
+}

+ 1 - 1
tests/Gedmo/Sortable/Fixture/Item.php

@@ -6,7 +6,7 @@ use Gedmo\Mapping\Annotation as Gedmo;
 use Doctrine\ORM\Mapping as ORM;
 
 /**
- * @Entity
+ * @Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
  */
 class Item
 {

+ 13 - 6
tests/Gedmo/Sortable/SortableTest.php

@@ -129,8 +129,13 @@ class SortableTest extends BaseTestCaseORM
         
         $this->em->clear();
         
-        $items = $this->em->createQuery("SELECT i, c FROM Sortable\Fixture\Item i JOIN i.category c ORDER BY c.name, i.position")
-                 ->getResult();
+        $repo = $this->em->getRepository('Sortable\\Fixture\\Category');
+        $category1 = $repo->findOneByName('Category1');
+        $category2 = $repo->findOneByName('Category2');
+        
+        $repo = $this->em->getRepository('Sortable\\Fixture\\Item');
+        
+        $items = $repo->getBySortableGroups(array('category' => $category1));
         
         $this->assertEquals("Item1", $items[0]->getName());
         $this->assertEquals("Category1", $items[0]->getCategory()->getName());
@@ -144,11 +149,13 @@ class SortableTest extends BaseTestCaseORM
         $this->assertEquals("Item4", $items[3]->getName());
         $this->assertEquals("Category1", $items[3]->getCategory()->getName());
         
-        $this->assertEquals("Item1_2", $items[4]->getName());
-        $this->assertEquals("Category2", $items[4]->getCategory()->getName());
+        $items = $repo->getBySortableGroups(array('category' => $category2));
+        
+        $this->assertEquals("Item1_2", $items[0]->getName());
+        $this->assertEquals("Category2", $items[0]->getCategory()->getName());
         
-        $this->assertEquals("Item2_2", $items[5]->getName());
-        $this->assertEquals("Category2", $items[5]->getCategory()->getName());
+        $this->assertEquals("Item2_2", $items[1]->getName());
+        $this->assertEquals("Category2", $items[1]->getCategory()->getName());
     }
     
     protected function getUsedEntityFixtures()