Kaynağa Gözat

[translatable] started work with translate function refactoring

gedi 13 yıl önce
ebeveyn
işleme
196be6f499

+ 32 - 4
lib/Gedmo/Translatable/Entity/Repository/TranslationRepository.php

@@ -6,6 +6,8 @@ use Gedmo\Translatable\TranslationListener;
 use Doctrine\ORM\EntityRepository;
 use Doctrine\ORM\Query;
 use Gedmo\Tool\Wrapper\EntityWrapper;
+use Gedmo\Translatable\Mapping\Event\Adapter\ORM as TranslatableAdapterORM;
+use Doctrine\DBAL\Types\Type;
 
 /**
  * The TranslationRepository has some useful functions
@@ -40,12 +42,38 @@ class TranslationRepository extends EntityRepository
     public function translate($entity, $field, $locale, $value)
     {
         $meta = $this->_em->getClassMetadata(get_class($entity));
-        $config = $this->getTranslationListener()->getConfiguration($this->_em, $meta->name);
+        $listener = $this->getTranslationListener();
+        $config = $listener->getConfiguration($this->_em, $meta->name);
         if (!isset($config['fields']) || !in_array($field, $config['fields'])) {
-            throw new \Gedmo\Exception\InvalidArgumentException("Entity: {$meta->name} does not translate - {$field}");
+            throw new \Gedmo\Exception\InvalidArgumentException("Entity: {$meta->name} does not translate field - {$field}");
+        }
+        if ($this->_em->getUnitOfWork()->isInIdentityMap($entity)) {
+            if ($locale === $listener->getDefaultLocale()) {
+                $meta->getReflectionProperty($field)->setValue($entity, $value);
+                $this->_em->persist($entity);
+            } else {
+                $ea = new TranslatableAdapterORM();
+                $foreignKey = $meta->getReflectionProperty($meta->getSingleIdentifierFieldName())->getValue($entity);
+                $objectClass = $meta->name;
+                $class = $listener->getTranslationClass($ea, $meta->name);
+                $transMeta = $this->_em->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);
+                }
+                $type = Type::getType($meta->getTypeOfField($field));
+                $transformed = $type->convertToDatabaseValue($value, $this->_em->getConnection()->getDatabasePlatform());
+                $transMeta->getReflectionProperty('content')->setValue($trans, $transformed);
+                $this->_em->persist($trans);
+            }
+        } else {
+            $oid = spl_object_hash($entity);
+            $listener->addTranslation($oid, $field, $locale, $value);
         }
-        $oid = spl_object_hash($entity);
-        $this->listener->addTranslation($oid, $field, $locale, $value);
         return $this;
     }
     /**

+ 44 - 11
tests/Gedmo/Translatable/TranslatableEntityCollectionTest.php

@@ -40,19 +40,22 @@ class TranslatableEntityCollectionTest extends BaseTestCaseORM
             'user' => 'root',
             'password' => 'nimda'
         );
-        //$this->getMockCustomEntityManager($conn, $evm);
-        $this->getMockSqliteEntityManager($evm);
+        $this->getMockCustomEntityManager($conn, $evm);
+        //$this->getMockSqliteEntityManager($evm);
         $this->populate();
     }
 
-    public function testMultipleTranslationPersistence()
+    /**
+     * test
+     */
+    function shouldPersistMultipleTranslations()
     {
         $repo = $this->em->getRepository(self::TRANSLATION);
         $sport = $this->em->getRepository(self::ARTICLE)->find(1);
         $translations = $repo->findTranslations($sport);
 
         $this->assertEquals(2, count($translations));
-        
+
         $this->assertArrayHasKey('de_de', $translations);
         $this->assertArrayHasKey('title', $translations['de_de']);
         $this->assertArrayHasKey('content', $translations['de_de']);
@@ -66,21 +69,50 @@ class TranslatableEntityCollectionTest extends BaseTestCaseORM
         $this->assertEquals('content ru', $translations['ru_ru']['content']);
     }
 
-    public function testMultipleTranslationUpdates()
+    /**
+     * test
+     */
+    function shouldUpdateTranslation()
+    {
+        $repo = $this->em->getRepository(self::TRANSLATION);
+        $sport = $this->em->getRepository(self::ARTICLE)->find(1);
+        $repo
+            ->translate($sport, 'title', 'ru_ru', 'sport ru change')
+            ->translate($sport, 'content', 'ru_ru', 'content ru change')
+        ;
+        $this->em->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->em->getRepository(self::TRANSLATION);
         $sport = $this->em->getRepository(self::ARTICLE)->find(1);
-        $sport->setTitle('Changed');
         $repo
             ->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');
-
-        $this->em->persist($sport);
+            ->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->em->flush();
-        $translations = $repo->findTranslations($sport);
 
+        $this->assertEquals('sport en update', $sport->getTitle());
+        $this->assertEquals('content en update', $sport->getContent());
+
+        $translations = $repo->findTranslations($sport);
         $this->assertEquals(3, count($translations));
 
         $this->assertArrayHasKey('de_de', $translations);
@@ -113,7 +145,8 @@ class TranslatableEntityCollectionTest extends BaseTestCaseORM
             ->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->em->persist($sport);
         $this->em->flush();