فهرست منبع

Merge pull request #102 from lbotsch/master

[Sortable] fix tests, listener optimizations and fix #99
Gediminas Morkevicius 14 سال پیش
والد
کامیت
aced2d8a15

+ 21 - 11
lib/Gedmo/Sortable/SortableListener.php

@@ -38,12 +38,13 @@ class SortableListener extends MappedEventSubscriber
         );
     }
     
-    public function prePersist(EventArgs $eventArgs)
+    public function prePersist(EventArgs $args)
     {
-        $em = $eventArgs->getEntityManager();
-        $object = $eventArgs->getEntity();
-        $meta = $em->getClassMetadata(get_class($object));
-        if ($config = $this->getConfiguration($em, $meta->name)) {
+        $ea = $this->getEventAdapter($args);
+        $om = $ea->getObjectManager();
+        $object = $ea->getObject();
+        $meta = $om->getClassMetadata(get_class($object));
+        if ($config = $this->getConfiguration($om, $meta->name)) {
             if (isset($config['position'])
                     && is_null($meta->getReflectionProperty($config['position'])->getValue($object))) {
                 $meta->getReflectionProperty($config['position'])->setValue($object, -1);
@@ -57,10 +58,10 @@ class SortableListener extends MappedEventSubscriber
      * @param EventArgs $eventArgs
      * @return void
      */
-    public function loadClassMetadata(EventArgs $eventArgs)
+    public function loadClassMetadata(EventArgs $args)
     {
-        $ea = $this->getEventAdapter($eventArgs);
-        $this->loadMetadataForObjectClass($ea->getObjectManager(), $eventArgs->getClassMetadata());
+        $ea = $this->getEventAdapter($args);
+        $this->loadMetadataForObjectClass($ea->getObjectManager(), $args->getClassMetadata());
     }
 
     /**
@@ -105,7 +106,7 @@ class SortableListener extends MappedEventSubscriber
     
     /**
      * Computes node positions and updates the sort field in memory and in the db
-     * @param EntityManager $em
+     * @param object $em ObjectManager
      */
     private function processInsert($em, $config, $meta, $object)
     {
@@ -163,12 +164,13 @@ class SortableListener extends MappedEventSubscriber
 
     /**
      * Computes node positions and updates the sort field in memory and in the db
-     * @param EntityManager $em
+     * @param object $em ObjectManager
      */
     private function processUpdate($em, $config, $meta, $object)
     {
         $uow = $em->getUnitOfWork();
         
+        $changed = false;
         $changeSet = $uow->getEntityChangeSet($object);
         if (!array_key_exists($config['position'], $changeSet)) {
             return;
@@ -176,11 +178,19 @@ class SortableListener extends MappedEventSubscriber
         $oldPosition = $changeSet[$config['position']][0];
         $newPosition = $changeSet[$config['position']][1];
         
+        $changed = $changed || $oldPosition != $newPosition;
+        
         // Get groups
         $groups = array();
         foreach ($config['groups'] as $group) {
+            $changed = $changed ||
+                (array_key_exists($group, $changeSet)
+                    && $changeSet[$group][0] != $changeSet[$group][1]);
             $groups[$group] = $meta->getReflectionProperty($group)->getValue($object);
         }
+        
+        if (!$changed) return;
+        
         // Get hash
         $hash = $this->getHash($meta, $groups, $object);
         
@@ -242,7 +252,7 @@ class SortableListener extends MappedEventSubscriber
     
     /**
      * Computes node positions and updates the sort field in memory and in the db
-     * @param EntityManager $em
+     * @param object $em ObjectManager
      */
     private function processDeletion($em, $config, $meta, $object)
     {

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

@@ -7,7 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
 use Doctrine\Common\Collections\ArrayCollection;
 
 /**
- * @Entity
+ * @ORM\Entity
  */
 class Category
 {

+ 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(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
+ * @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
  */
 class Item
 {

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

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

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

@@ -27,13 +27,8 @@ class SortableTest extends BaseTestCaseORM
     {
         parent::setUp();
         
-        $annotationReader = new \Doctrine\Common\Annotations\AnnotationReader();
-        $annotationReader->setAutoloadAnnotations(true);
-        $sortable = new SortableListener;
-        $sortable->setAnnotationReader($annotationReader);
-        
         $evm = new EventManager;
-        $evm->addEventSubscriber($sortable);
+        $evm->addEventSubscriber(new SortableListener);
 
         $this->getMockSqliteEntityManager($evm);
         //$this->startQueryLog();