فهرست منبع

[sluggable] allow nullable slugs when empty, if slug column is nullable, closes #131

gediminasm 13 سال پیش
والد
کامیت
c7fe160fbe

+ 6 - 3
lib/Gedmo/Sluggable/SluggableListener.php

@@ -213,7 +213,8 @@ class SluggableListener extends MappedEventSubscriber
             }
             // if slug is changed, do further processing
             if ($needToChangeSlug) {
-                if (!strlen(trim($slug))) {
+                $mapping = $meta->getFieldMapping($slugFieldConfig['slug']);
+                if (!strlen(trim($slug)) && !$mapping['nullable']) {
                     throw new \Gedmo\Exception\UnexpectedValueException("Unable to find any non empty sluggable fields for slug [{$slugField}] , make sure they have something at least.");
                 }
 
@@ -248,13 +249,15 @@ class SluggableListener extends MappedEventSubscriber
                 }
 
                 // cut slug if exceeded in length
-                $mapping = $meta->getFieldMapping($slugFieldConfig['slug']);
                 if (isset($mapping['length']) && strlen($slug) > $mapping['length']) {
                     $slug = substr($slug, 0, $mapping['length']);
                 }
 
+                if ($mapping['nullable'] && !$slug) {
+                    $slug = null;
+                }
                 // make unique slug if requested
-                if ($slugFieldConfig['unique']) {
+                if ($slugFieldConfig['unique'] && !is_null($slug)) {
                     $this->exponent = 0;
                     $arrayConfig = $slugFieldConfig;
                     $arrayConfig['useObjectClass'] = $config['useObjectClass'];

+ 51 - 0
tests/Gedmo/Sluggable/Fixture/Issue131/Article.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace Sluggable\Fixture\Issue131;
+
+use Gedmo\Mapping\Annotation as Gedmo;
+use Doctrine\ORM\Mapping as ORM;
+
+/**
+ * @ORM\Entity
+ */
+class Article
+{
+    /**
+     * @ORM\Id
+     * @ORM\GeneratedValue
+     * @ORM\Column(type="integer")
+     */
+    private $id;
+
+    /**
+     * @Gedmo\Sluggable
+     * @ORM\Column(length=64)
+     */
+    private $title;
+
+    /**
+     * @Gedmo\Slug(updatable=true, unique=true)
+     * @ORM\Column(length=64, unique=true, nullable=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;
+    }
+}

tests/Gedmo/Sluggable/Issue104Test.php → tests/Gedmo/Sluggable/Issue/Issue104Test.php


+ 1 - 1
tests/Gedmo/Sluggable/Issue116Test.php

@@ -34,7 +34,7 @@ class Issue116Test extends BaseTestCaseORM
     {
         $chain = new DriverChain;
         $chain->addDriver(
-            new YamlDriver(array(__DIR__ . '/Fixture/Issue116/Mapping')),
+            new YamlDriver(array(__DIR__ . '/../Fixture/Issue116/Mapping')),
             'Sluggable\Fixture\Issue116'
         );
         return $chain;

+ 56 - 0
tests/Gedmo/Sluggable/Issue/Issue131Test.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace Gedmo\Sluggable;
+
+use Doctrine\Common\EventManager;
+use Tool\BaseTestCaseORM;
+use Sluggable\Fixture\Issue131\Article;
+
+/**
+ * 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 Issue131Test extends BaseTestCaseORM
+{
+    const TARGET = 'Sluggable\\Fixture\\Issue131\\Article';
+
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $evm = new EventManager;
+        $evm->addEventSubscriber(new SluggableListener);
+
+        $this->getMockSqliteEntityManager($evm);
+    }
+
+    public function testSlugGeneration()
+    {
+        $test = new Article;
+        $test->setTitle('');
+
+        $this->em->persist($test);
+        $this->em->flush();
+
+        $this->assertEquals(null, $test->getSlug());
+
+        $test2 = new Article;
+        $test2->setTitle('');
+
+        $this->em->persist($test2);
+        $this->em->flush();
+
+        $this->assertEquals(null, $test2->getSlug());
+    }
+
+    protected function getUsedEntityFixtures()
+    {
+        return array(
+            self::TARGET
+        );
+    }
+}