فهرست منبع

[translatable] refactor translate function for ODM repository, references #224

gedi 13 سال پیش
والد
کامیت
398279cfd3

+ 33 - 4
lib/Gedmo/Translatable/Document/Repository/TranslationRepository.php

@@ -6,6 +6,8 @@ use Gedmo\Translatable\TranslationListener;
 use Doctrine\ODM\MongoDB\DocumentRepository;
 use Doctrine\ODM\MongoDB\Cursor;
 use Gedmo\Tool\Wrapper\MongoDocumentWrapper;
+use Gedmo\Translatable\Mapping\Event\Adapter\ODM as TranslatableAdapterODM;
+use Doctrine\ODM\MongoDB\Mapping\Types\Type;
 
 /**
  * The TranslationRepository has some useful functions
@@ -40,12 +42,39 @@ class TranslationRepository extends DocumentRepository
     public function translate($document, $field, $locale, $value)
     {
         $meta = $this->dm->getClassMetadata(get_class($document));
-        $config = $this->getTranslationListener()->getConfiguration($this->dm, $meta->name);
+        $listener = $this->getTranslationListener();
+        $config = $listener->getConfiguration($this->dm, $meta->name);
         if (!isset($config['fields']) || !in_array($field, $config['fields'])) {
-            throw new \Gedmo\Exception\InvalidArgumentException("Document: {$meta->name} does not translate - {$field}");
+            throw new \Gedmo\Exception\InvalidArgumentException("Document: {$meta->name} does not translate field - {$field}");
+        }
+        if ($locale === $listener->getDefaultLocale()) {
+            $meta->getReflectionProperty($field)->setValue($document, $value);
+            $this->dm->persist($document);
+        } else {
+            $ea = new TranslatableAdapterODM();
+            $foreignKey = $meta->getReflectionProperty($meta->identifier)->getValue($document);
+            $objectClass = $meta->name;
+            $class = $listener->getTranslationClass($ea, $meta->name);
+            $transMeta = $this->dm->getClassMetadata($class);
+            $trans = $this->findOneBy(compact('locale', 'field', 'objectClass', 'foreignKey'));
+            if (!$trans) {
+                $trans = new $class();
+                $transMeta->getReflectionProperty('foreignKey')->setValue($trans, $foreignKey);
+                $transMeta->getReflectionProperty('objectClass')->setValue($trans, $objectClass);
+                $transMeta->getReflectionProperty('field')->setValue($trans, $field);
+                $transMeta->getReflectionProperty('locale')->setValue($trans, $locale);
+            }
+            $mapping = $meta->getFieldMapping($field);
+            $type = Type::getType($mapping['type']);
+            $transformed = $type->convertToDatabaseValue($value);
+            $transMeta->getReflectionProperty('content')->setValue($trans, $transformed);
+            if ($this->dm->getUnitOfWork()->isInIdentityMap($document)) {
+                $this->dm->persist($trans);
+            } else {
+                $oid = spl_object_hash($document);
+                $listener->addPendingTranslationInsert($oid, $trans);
+            }
         }
-        $oid = spl_object_hash($document);
-        $this->listener->addTranslation($oid, $field, $locale, $value);
         return $this;
     }
 

+ 1 - 0
lib/Gedmo/Translatable/Entity/Repository/TranslationRepository.php

@@ -76,6 +76,7 @@ class TranslationRepository extends EntityRepository
         }
         return $this;
     }
+
     /**
      * Loads all translations with all translatable
      * fields from the given entity

+ 41 - 5
tests/Gedmo/Translatable/TranslatableDocumentCollectionTest.php

@@ -36,7 +36,10 @@ class TranslatableDocumentCollectionTest extends BaseTestCaseMongoODM
         $this->populate();
     }
 
-    public function testMultipleTranslationPersistence()
+    /**
+     * @test
+     */
+    function shouldPersistMultipleTranslations()
     {
         $repo = $this->dm->getRepository(self::TRANSLATION);
         $sport = $this->dm->getRepository(self::ARTICLE)->find($this->id);
@@ -55,7 +58,33 @@ class TranslatableDocumentCollectionTest extends BaseTestCaseMongoODM
         $this->assertEquals('content ru', $translations['ru_ru']['content']);
     }
 
-    public function testMultipleTranslationUpdates()
+    /**
+     * @test
+     */
+    function shouldUpdateTranslation()
+    {
+        $repo = $this->dm->getRepository(self::TRANSLATION);
+        $sport = $this->dm->getRepository(self::ARTICLE)->find($this->id);
+        $repo
+            ->translate($sport, 'title', 'ru_ru', 'sport ru change')
+            ->translate($sport, 'content', 'ru_ru', 'content ru change')
+        ;
+        $this->dm->flush();
+
+        $translations = $repo->findTranslations($sport);
+        $this->assertEquals(2, count($translations));
+
+        $this->assertArrayHasKey('ru_ru', $translations);
+        $this->assertArrayHasKey('title', $translations['ru_ru']);
+        $this->assertArrayHasKey('content', $translations['ru_ru']);
+        $this->assertEquals('sport ru change', $translations['ru_ru']['title']);
+        $this->assertEquals('content ru change', $translations['ru_ru']['content']);
+    }
+
+    /**
+     * @test
+     */
+    function shouldUpdateMultipleTranslations()
     {
         $repo = $this->dm->getRepository(self::TRANSLATION);
         $sport = $this->dm->getRepository(self::ARTICLE)->find($this->id);
@@ -64,10 +93,16 @@ class TranslatableDocumentCollectionTest extends BaseTestCaseMongoODM
             ->translate($sport, 'title', 'lt_lt', 'sport lt')
             ->translate($sport, 'content', 'lt_lt', 'content lt')
             ->translate($sport, 'title', 'ru_ru', 'sport ru change')
-            ->translate($sport, 'content', 'ru_ru', 'content ru change');
+            ->translate($sport, 'content', 'ru_ru', 'content ru change')
+            ->translate($sport, 'title', 'en_us', 'sport en update')
+            ->translate($sport, 'content', 'en_us', 'content en update')
+        ;
 
-        $this->dm->persist($sport);
         $this->dm->flush();
+
+        $this->assertEquals('sport en update', $sport->getTitle());
+        $this->assertEquals('content en update', $sport->getContent());
+
         $translations = $repo->findTranslations($sport);
 
         $this->assertArrayHasKey('de_de', $translations);
@@ -100,7 +135,8 @@ class TranslatableDocumentCollectionTest extends BaseTestCaseMongoODM
             ->translate($sport, 'title', 'de_de', 'sport de')
             ->translate($sport, 'content', 'de_de', 'content de')
             ->translate($sport, 'title', 'ru_ru', 'sport ru')
-            ->translate($sport, 'content', 'ru_ru', 'content ru');
+            ->translate($sport, 'content', 'ru_ru', 'content ru')
+        ;
 
         $this->dm->persist($sport);
         $this->dm->flush();