Browse Source

[mapping] fixed issue with multilevel extensions in inheritance mapping, closes #239

gedi 13 years ago
parent
commit
4864a80079

+ 5 - 0
README.md

@@ -7,6 +7,11 @@
 **Note:** Use 2.1.x or 2.2.x tag in order to use extensions based on Doctrine2.x.x component versions. Currently
 master branch is based on 2.3.x versions and may not work with older components.
 
+**2012-01-23**
+
+- Fixed an issue with inheritance mapping in case of multiple class extension.
+For details take a [peek at tests](https://github.com/l3pp4rd/DoctrineExtensions/blob/master/tests/Gedmo/Tree/MultiInheritanceTest2.php)
+
 **2012-01-22**
 
 - Adapted extensions for recent 2.3.0-DEV version of doctrine2. Released a tag for 2.2.x component

+ 1 - 1
lib/Gedmo/Mapping/ExtensionMetadataFactory.php

@@ -82,7 +82,7 @@ final class ExtensionMetadataFactory
                 if ($cmf->hasMetadataFor($parentClass)) {
                     $class = $this->objectManager->getClassMetadata($parentClass);
                     $this->driver->readExtendedMetadata($class, $config);
-                    if (!$class->isInheritanceTypeNone() && $config) {
+                    if (!$class->isInheritanceTypeNone() && !$class->parentClasses && $config) {
                         $useObjectName = $class->name;
                     }
                 }

+ 2 - 2
tests/Gedmo/Tree/Fixture/Role.php

@@ -7,10 +7,10 @@ use Doctrine\ORM\Mapping as ORM;
 
 /**
  * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
- * @ORM\Table(name="`role`")
+ * @ORM\Table(name="role")
  * @ORM\InheritanceType("JOINED")
  * @ORM\DiscriminatorColumn(name="discr", type="string")
- * @ORM\DiscriminatorMap({"user" = "User", "usergroup" = "UserGroup"})
+ * @ORM\DiscriminatorMap({"user" = "User", "usergroup" = "UserGroup", "userldap" = "UserLDAP"})
  * @Gedmo\Tree(type="nested")
  */
 abstract class Role {

+ 1 - 1
tests/Gedmo/Tree/Fixture/User.php

@@ -5,7 +5,7 @@ use Doctrine\ORM\Mapping as ORM;
 
 /**
  * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
- * @ORM\Table(name="`user`")
+ * @ORM\Table(name="user")
  */
 class User extends Role {
 

+ 1 - 1
tests/Gedmo/Tree/Fixture/UserGroup.php

@@ -7,7 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  * Group entity
  *
  * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
- * @ORM\Table(name="`user_group`")
+ * @ORM\Table(name="user_group")
  */
 class UserGroup extends Role {
 

+ 16 - 0
tests/Gedmo/Tree/Fixture/UserLDAP.php

@@ -0,0 +1,16 @@
+<?php
+namespace Tree\Fixture;
+
+use Doctrine\ORM\Mapping as ORM;
+
+/**
+ * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
+ * @ORM\Table(name="user_ldap")
+ */
+class UserLDAP extends User
+{
+    public function __construct($ldapUserName)
+    {
+        parent::__construct('next@something.com', 'pass');
+    }
+}

+ 27 - 3
tests/Gedmo/Tree/MultiInheritanceTest2.php

@@ -21,19 +21,42 @@ class MultiInheritanceTest2 extends BaseTestCaseORM
     const USER = "Tree\\Fixture\\User";
     const GROUP = "Tree\\Fixture\\UserGroup";
     const ROLE = "Tree\\Fixture\\Role";
+    const USERLDAP = "Tree\\Fixture\\UserLDAP";
 
     protected function setUp()
     {
         parent::setUp();
 
         $evm = new EventManager;
-        $evm->addEventSubscriber(new TreeListener);
+        $this->tree = new TreeListener;
+        $evm->addEventSubscriber($this->tree);
 
         $this->getMockSqliteEntityManager($evm);
         $this->populate();
     }
 
-    public function testConsistence()
+    /**
+     * @test
+     */
+    public function shouldHandleMultilevelInheritance()
+    {
+        $admins = $this->em->getRepository(self::GROUP)->findOneByName('Admins');
+        $adminRight = $admins->getRight();
+        $userLdap = new \Tree\Fixture\UserLDAP('testname');
+        $userLdap->init();
+        $userLdap->setParent($admins);
+        $this->em->persist($userLdap);
+        $this->em->flush();
+        $this->em->clear();
+
+        $admins = $this->em->getRepository(self::GROUP)->findOneByName('Admins');
+        self::assertNotEquals($adminRight, $admins->getRight());
+    }
+
+    /**
+     * @test
+     */
+    public function shouldBeAbleToPopulateTree()
     {
         $admins = $this->em->getRepository(self::GROUP)->findOneByName('Admins');
         $user3 = new \Tree\Fixture\User('user3@test.com', 'secret');
@@ -87,7 +110,8 @@ class MultiInheritanceTest2 extends BaseTestCaseORM
         return array(
             self::USER,
             self::GROUP,
-            self::ROLE
+            self::ROLE,
+            self::USERLDAP
         );
     }