Bläddra i källkod

Merge pull request #253 from khepin/transliteration

Fix transliteration.
Gediminas Morkevicius 13 år sedan
förälder
incheckning
6ce3cbb6a2

+ 8 - 0
lib/Gedmo/Sluggable/Handler/InversedRelativeSlugHandler.php

@@ -71,6 +71,14 @@ class InversedRelativeSlugHandler implements SlugHandlerInterface
             throw new InvalidMappingException("'inverseSlugField' option must be specified for object slug mapping - {$meta->name}");
         }
     }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public function handlesUrlization()
+    {
+        return false;
+    }
 
     /**
      * {@inheritDoc}

+ 10 - 0
lib/Gedmo/Sluggable/Handler/RelativeSlugHandler.php

@@ -7,6 +7,7 @@ use Gedmo\Sluggable\SluggableListener;
 use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
 use Gedmo\Tool\Wrapper\AbstractWrapper;
 use Gedmo\Exception\InvalidMappingException;
+use Gedmo\Sluggable\Util\Urlizer;
 
 /**
 * Sluggable handler which should be used in order to prefix
@@ -78,6 +79,14 @@ class RelativeSlugHandler implements SlugHandlerInterface
         }
         return $this->options[$meta->name];
     }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public function handlesUrlization()
+    {
+        return true;
+    }
 
     /**
      * {@inheritDoc}
@@ -138,6 +147,7 @@ class RelativeSlugHandler implements SlugHandlerInterface
             $this->originalTransliterator,
             array($text, $separator, $object)
         );
+        $result = Urlizer::urlize($result, $separator);
         $wrapped = AbstractWrapper::wrapp($object, $this->om);
         $relation = $wrapped->getPropertyValue($this->usedOptions['relationField']);
         if ($relation) {

+ 7 - 0
lib/Gedmo/Sluggable/Handler/SlugHandlerInterface.php

@@ -62,6 +62,13 @@ interface SlugHandlerInterface
      * @return void
      */
     function onSlugCompletion(SluggableAdapter $ea, array &$config, $object, &$slug);
+    
+    /**
+     * True if the handler also urlizes the slug on its own
+     * 
+     * @return boolean 
+     */
+    function handlesUrlization();
 
     /**
      * Validate handler options

+ 11 - 0
lib/Gedmo/Sluggable/Handler/TreeSlugHandler.php

@@ -7,6 +7,7 @@ use Gedmo\Sluggable\SluggableListener;
 use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
 use Gedmo\Tool\Wrapper\AbstractWrapper;
 use Gedmo\Exception\InvalidMappingException;
+use Gedmo\Sluggable\Util\Urlizer;
 
 /**
 * Sluggable handler which slugs all parent nodes
@@ -103,6 +104,14 @@ class TreeSlugHandler implements SlugHandlerInterface
             $this->parentSlug = $parent->getPropertyValue($config['slug']);
         }
     }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public function handlesUrlization()
+    {
+        return true;
+    }
 
     /**
      * {@inheritDoc}
@@ -164,6 +173,8 @@ class TreeSlugHandler implements SlugHandlerInterface
             $this->originalTransliterator,
             array($text, $separator, $object)
         );
+        // For tree slugs, we "urlize" each part of the slug before appending "/"
+        $slug = Urlizer::urlize($slug, $separator);
         if (strlen($this->parentSlug)) {
             $slug = $this->parentSlug . $this->usedPathSeparator . $slug;
         }

+ 15 - 7
lib/Gedmo/Sluggable/SluggableListener.php

@@ -23,6 +23,7 @@ use Doctrine\Common\Persistence\ObjectManager;
  */
 class SluggableListener extends MappedEventSubscriber
 {
+
     /**
      * The power exponent to jump
      * the slug unique number by tens.
@@ -236,12 +237,16 @@ class SluggableListener extends MappedEventSubscriber
                 }
 
                 // notify slug handlers --> postSlugBuild
+                $urlized = false;
                 if ($hasHandlers) {
                     foreach ($options['handlers'] as $class => $handlerOptions) {
                         $this
                             ->getHandler($class)
                             ->postSlugBuild($ea, $options, $object, $slug)
                         ;
+                        if($this->getHandler($class)->handlesUrlization()){
+                            $urlized = true;
+                        }
                     }
                 }
 
@@ -250,13 +255,15 @@ class SluggableListener extends MappedEventSubscriber
                     $this->transliterator,
                     array($slug, $options['separator'], $object)
                 );
-                $slug = Util\Urlizer::urlize($slug, $options['separator']);
+                if(!$urlized){
+                    $slug = Util\Urlizer::urlize($slug, $options['separator']);
+                }
                 // stylize the slug
                 switch ($options['style']) {
                     case 'camel':
                         $slug = preg_replace_callback(
-                            '@^[a-z]|' . $options['separator'] . '[a-z]@smi',
-                            create_function('$m', 'return strtoupper($m[0]);'),
+                            '@^[a-z]|' . $options['separator'] . '[a-z]@smi', 
+                            create_function('$m', 'return strtoupper($m[0]);'), 
                             $slug
                         );
                         break;
@@ -312,8 +319,8 @@ class SluggableListener extends MappedEventSubscriber
         $meta = $om->getClassMetadata(get_class($object));
         // load similar slugs
         $result = array_merge(
-            (array)$ea->getSimilarSlugs($object, $meta, $config, $preferedSlug),
-            (array)$this->getSimilarPersistedSlugs($config['useObjectClass'], $preferedSlug, $config['slug'])
+            (array) $ea->getSimilarSlugs($object, $meta, $config, $preferedSlug), 
+            (array) $this->getSimilarPersistedSlugs($config['useObjectClass'], $preferedSlug, $config['slug'])
         );
         // leave only right slugs
         if (!$recursing) {
@@ -335,8 +342,8 @@ class SluggableListener extends MappedEventSubscriber
             $mapping = $meta->getFieldMapping($config['slug']);
             if (isset($mapping['length']) && strlen($generatedSlug) > $mapping['length']) {
                 $generatedSlug = substr(
-                    $generatedSlug,
-                    0,
+                    $generatedSlug, 
+                    0, 
                     $mapping['length'] - (strlen($i) + strlen($config['separator']))
                 );
                 $this->exponent = strlen($i) - 1;
@@ -387,4 +394,5 @@ class SluggableListener extends MappedEventSubscriber
             }
         }
     }
+
 }

+ 2 - 1
lib/Gedmo/Sluggable/Util/Urlizer.php

@@ -276,6 +276,7 @@ class Urlizer
         if (preg_match('/[\x80-\xff]/', $text) && self::validUtf8($text)) {
             $text = self::utf8ToAscii($text);
         }
+        return $text;
     }
 
     /**
@@ -418,4 +419,4 @@ class Urlizer
 
         return trim($text, $separator);
     }
-}
+}