소스 검색

Fixed failures in getting similar slug and persisted similar slug

Dinoweb 14 년 전
부모
커밋
b92710f6f4
2개의 변경된 파일33개의 추가작업 그리고 8개의 파일을 삭제
  1. 9 8
      lib/Gedmo/Sluggable/SluggableListener.php
  2. 24 0
      tests/Gedmo/Sluggable/TranslatableManySlugTest.php

+ 9 - 8
lib/Gedmo/Sluggable/SluggableListener.php

@@ -118,7 +118,7 @@ class SluggableListener extends MappedEventSubscriber
                 $this->generateSlug($ea, $object);
                 foreach ($config['fields'] as $slugField=>$fieldsForSlugField) {
                     $slug = $meta->getReflectionProperty($slugField)->getValue($object);
-                    $this->persistedSlugs[$config['useObjectClass']][] = $slug;
+                    $this->persistedSlugs[$config['useObjectClass']][$slugField][] = $slug;
                 }
             }
         }
@@ -234,6 +234,7 @@ class SluggableListener extends MappedEventSubscriber
      * @param SluggableAdapter $ea
      * @param object $object
      * @param string $preferedSlug
+     * @param array $config[$slugField]
      * @return string - unique slug
      */
     private function makeUniqueSlug(SluggableAdapter $ea, $object, $preferedSlug, $recursing = false, $config = array())
@@ -244,11 +245,10 @@ class SluggableListener extends MappedEventSubscriber
         {
             $config = $this->getConfiguration($om, $meta->name);
         }
-
         // search for similar slug
         $result = $ea->getSimilarSlugs($object, $meta, $config, $preferedSlug);
         // add similar persisted slugs into account
-        $result += $this->getSimilarPersistedSlugs($config['useObjectClass'], $preferedSlug);
+        $result += $this->getSimilarPersistedSlugs($config['useObjectClass'], $preferedSlug, $config['slug']);
         // leave only right slugs
         if (!$recursing) {
             $this->filterSimilarSlugs($result, $config, $preferedSlug);
@@ -258,7 +258,7 @@ class SluggableListener extends MappedEventSubscriber
             $generatedSlug = $preferedSlug;
             $sameSlugs = array();
             foreach ((array)$result as $list) {
-                $sameSlugs[] = $list[$config['slug']];
+                $sameSlugs[] = $list['slug'];
             }
 
             $i = pow(10, $this->exponent);
@@ -289,14 +289,15 @@ class SluggableListener extends MappedEventSubscriber
      *
      * @param string $class
      * @param string $preferedSlug
+     * @param string $slugField
      * @return array
      */
-    private function getSimilarPersistedSlugs($class, $preferedSlug)
+    private function getSimilarPersistedSlugs($class, $preferedSlug, $slugField)
     {
         $result = array();
-        if (isset($this->persistedSlugs[$class])) {
-            array_walk($this->persistedSlugs[$class], function($val) use ($preferedSlug, &$result) {
-                if (preg_match("/{$preferedSlug}.*/smi", $val)) {
+        if (isset($this->persistedSlugs[$class][$slugField])) {
+            array_walk($this->persistedSlugs[$class][$slugField], function($val) use ($preferedSlug, &$result) {
+                if (preg_match("/^{$preferedSlug}.*/smi", $val)) {
                     $result[] = array('slug' => $val);
                 }
             });

+ 24 - 0
tests/Gedmo/Sluggable/TranslatableManySlugTest.php

@@ -76,6 +76,30 @@ class TranslatableManySlugTest extends BaseTestCaseORM
         $this->assertArrayHasKey('slug', $translations['de_de']);
         $this->assertEquals('title-in-de-code-in-de', $translations['de_de']['slug']);
     }
+    
+    public function testUniqueness()
+    {
+       $a0 = new TransArticleManySlug;
+       $a0->setTitle('the title');
+       $a0->setCode('my code');
+       $a0->setUniqueTitle('title');
+
+       $this->em->persist($a0);
+
+       $a1 = new TransArticleManySlug;
+       $a1->setTitle('the title');
+       $a1->setCode('my code');
+       $a1->setUniqueTitle('title');
+
+       $this->em->persist($a1);
+       $this->em->flush();
+
+       $this->assertEquals('title', $a0->getUniqueSlug());
+       $this->assertEquals('title-1', $a1->getUniqueSlug());
+       // if its translated maybe should be different
+       $this->assertEquals('the-title-my-code-1', $a0->getSlug());
+       $this->assertEquals('the-title-my-code-2', $a1->getSlug());
+    }
 
     protected function getUsedEntityFixtures()
     {