Bladeren bron

[sluggable] inheritance handling, closes #103

gediminasm 14 jaren geleden
bovenliggende
commit
631a9abd39

+ 1 - 1
lib/Gedmo/Sluggable/Mapping/Event/Adapter/ODM.php

@@ -25,7 +25,7 @@ final class ODM extends BaseAdapterODM implements SluggableAdapter
     public function getSimilarSlugs($object, ClassMetadata $meta, array $config, $slug)
     {
         $dm = $this->getObjectManager();
-        $qb = $dm->createQueryBuilder($meta->name);
+        $qb = $dm->createQueryBuilder($config['useObjectClass']);
         $identifier = $this->extractIdentifier($dm, $object);
         if ($identifier) {
             $qb->field($meta->identifier)->notEqual($identifier);

+ 1 - 1
lib/Gedmo/Sluggable/Mapping/Event/Adapter/ORM.php

@@ -27,7 +27,7 @@ final class ORM extends BaseAdapterORM implements SluggableAdapter
         $em = $this->getObjectManager();
         $qb = $em->createQueryBuilder();
         $qb->select('rec.' . $config['slug'])
-            ->from($meta->name, 'rec')
+            ->from($config['useObjectClass'], 'rec')
             ->where($qb->expr()->like(
                 'rec.' . $config['slug'],
                 $qb->expr()->literal($slug . '%'))

+ 2 - 2
lib/Gedmo/Sluggable/SluggableListener.php

@@ -117,7 +117,7 @@ class SluggableListener extends MappedEventSubscriber
                 // generate first to exclude this object from similar persisted slugs result
                 $this->generateSlug($ea, $object);
                 $slug = $meta->getReflectionProperty($config['slug'])->getValue($object);
-                $this->persistedSlugs[$meta->name][] = $slug;
+                $this->persistedSlugs[$config['useObjectClass']][] = $slug;
             }
         }
         // we use onFlush and not preUpdate event to let other
@@ -239,7 +239,7 @@ class SluggableListener extends MappedEventSubscriber
         // search for similar slug
         $result = $ea->getSimilarSlugs($object, $meta, $config, $preferedSlug);
         // add similar persisted slugs into account
-        $result += $this->getSimilarPersistedSlugs($meta->name, $preferedSlug);
+        $result += $this->getSimilarPersistedSlugs($config['useObjectClass'], $preferedSlug);
         // leave only right slugs
         if (!$recursing) {
             $this->filterSimilarSlugs($result, $config, $preferedSlug);

+ 26 - 0
tests/Gedmo/Sluggable/Fixture/Inheritance/Car.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace Sluggable\Fixture\Inheritance;
+
+use Doctrine\ORM\Mapping as ORM;
+
+/**
+ * @ORM\Entity
+ */
+class Car extends Vehicle
+{
+    /**
+     * @ORM\Column(length=128)
+     */
+    private $description;
+
+    public function setDescription($description)
+    {
+        $this->description = $description;
+    }
+
+    public function getDescription()
+    {
+        return $this->description;
+    }
+}

+ 57 - 0
tests/Gedmo/Sluggable/Fixture/Inheritance/Vehicle.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace Sluggable\Fixture\Inheritance;
+
+use Doctrine\ORM\Mapping as ORM;
+use Gedmo\Mapping\Annotation as Gedmo;
+
+/**
+ * @ORM\Entity
+ * @ORM\InheritanceType("SINGLE_TABLE")
+ * @ORM\DiscriminatorColumn(name="discriminator", type="string")
+ * @ORM\DiscriminatorMap({
+ *      "vehicle" = "Vehicle",
+ *      "car" = "Car"
+ * })
+ */
+class Vehicle
+{
+    /**
+     * @ORM\Id
+     * @ORM\GeneratedValue
+     * @ORM\Column(type="integer")
+     */
+    private $id;
+
+    /**
+     * @Gedmo\Sluggable
+     * @ORM\Column(length=128)
+     */
+    private $title;
+
+    /**
+     * @Gedmo\Slug
+     * @ORM\Column(length=128, unique=true)
+     */
+    private $slug;
+
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    public function setTitle($title)
+    {
+        $this->title = $title;
+    }
+
+    public function getTitle()
+    {
+        return $this->title;
+    }
+
+    public function getSlug()
+    {
+        return $this->slug;
+    }
+}

+ 61 - 0
tests/Gedmo/Sluggable/InheritanceTest.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace Gedmo\Sluggable;
+
+use Doctrine\Common\EventManager;
+use Tool\BaseTestCaseORM;
+use Sluggable\Fixture\Inheritance\Car;
+use Sluggable\Fixture\Inheritance\Vehicle;
+
+/**
+ * These are tests for Sluggable behavior
+ *
+ * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
+ * @package Gedmo.Sluggable
+ * @link http://www.gediminasm.org
+ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
+ */
+class InheritanceTest extends BaseTestCaseORM
+{
+    const VEHICLE = 'Sluggable\\Fixture\\Inheritance\\Vehicle';
+    const CAR = 'Sluggable\\Fixture\\Inheritance\\Car';
+
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $evm = new EventManager;
+        $evm->addEventSubscriber(new SluggableListener);
+
+        $this->getMockSqliteEntityManager($evm);
+    }
+
+    public function testSlugGeneration()
+    {
+        $audi = new Car;
+        $audi->setDescription('audi car');
+        $audi->setTitle('Audi');
+
+        $this->em->persist($audi);
+
+        $audi2 = new Car;
+        $audi2->setDescription('audi2 car');
+        $audi2->setTitle('Audi');
+
+        $this->em->persist($audi2);
+
+        $audi3 = new Vehicle;
+        $audi3->setTitle('Audi');
+
+        $this->em->persist($audi3);
+        $this->em->flush();
+    }
+
+    protected function getUsedEntityFixtures()
+    {
+        return array(
+            self::VEHICLE,
+            self::CAR
+        );
+    }
+}