ORM.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. namespace Gedmo\Translatable\Mapping\Event\Adapter;
  3. use Gedmo\Mapping\Event\Adapter\ORM as BaseAdapterORM;
  4. use Doctrine\ORM\Query;
  5. use Gedmo\Translatable\Mapping\Event\TranslatableAdapter;
  6. use Gedmo\Tool\Wrapper\AbstractWrapper;
  7. use Doctrine\DBAL\Types\Type;
  8. /**
  9. * Doctrine event adapter for ORM adapted
  10. * for Translatable behavior
  11. *
  12. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  13. * @package Gedmo\Translatable\Mapping\Event\Adapter
  14. * @subpackage ORM
  15. * @link http://www.gediminasm.org
  16. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  17. */
  18. final class ORM extends BaseAdapterORM implements TranslatableAdapter
  19. {
  20. /**
  21. * {@inheritDoc}
  22. */
  23. public function usesPersonalTranslation($translationClassName)
  24. {
  25. return $this
  26. ->getObjectManager()
  27. ->getClassMetadata($translationClassName)
  28. ->getReflectionClass()
  29. ->isSubclassOf('Gedmo\Translatable\Entity\AbstractPersonalTranslation')
  30. ;
  31. }
  32. /**
  33. * {@inheritDoc}
  34. */
  35. public function getDefaultTranslationClass()
  36. {
  37. return 'Gedmo\\Translatable\\Entity\\Translation';
  38. }
  39. /**
  40. * {@inheritDoc}
  41. */
  42. public function loadTranslations($object, $translationClass, $locale)
  43. {
  44. $em = $this->getObjectManager();
  45. $wrapped = AbstractWrapper::wrapp($object, $em);
  46. // load translated content for all translatable fields
  47. $objectId = $wrapped->getIdentifier();
  48. // construct query
  49. $dql = 'SELECT t.content, t.field FROM ' . $translationClass . ' t';
  50. $dql .= ' WHERE t.foreignKey = :objectId';
  51. $dql .= ' AND t.locale = :locale';
  52. $dql .= ' AND t.objectClass = :objectClass';
  53. // fetch results
  54. $objectClass = $wrapped->getMetadata()->name;
  55. $q = $em->createQuery($dql);
  56. $q->setParameters(compact('objectId', 'locale', 'objectClass'));
  57. return $q->getArrayResult();
  58. }
  59. /**
  60. * {@inheritDoc}
  61. */
  62. public function findTranslation(AbstractWrapper $wrapped, $locale, $field, $translationClass)
  63. {
  64. $em = $this->getObjectManager();
  65. $qb = $em->createQueryBuilder();
  66. $qb->select('trans')
  67. ->from($translationClass, 'trans')
  68. ->where(
  69. 'trans.locale = :locale',
  70. 'trans.field = :field'
  71. )
  72. ;
  73. $qb->setParameters(compact('locale', 'field'));
  74. if ($this->usesPersonalTranslation($translationClass)) {
  75. $qb->andWhere('trans.object = :object');
  76. $qb->setParameter('object', $wrapped->getObject());
  77. } else {
  78. $qb->andWhere('trans.foreignKey = :objectId');
  79. $qb->andWhere('trans.objectClass = :objectClass');
  80. $qb->setParameter('objectId', $wrapped->getIdentifier());
  81. $qb->setParameter('objectClass', $wrapped->getMetadata()->name);
  82. }
  83. $q = $qb->getQuery();
  84. $result = $q->getResult();
  85. if ($result) {
  86. return array_shift($result);
  87. }
  88. return null;
  89. }
  90. /**
  91. * {@inheritDoc}
  92. */
  93. public function removeAssociatedTranslations(AbstractWrapper $wrapped, $transClass)
  94. {
  95. $qb = $this
  96. ->getObjectManager()
  97. ->createQueryBuilder()
  98. ->delete($transClass, 'trans')
  99. ;
  100. if ($this->usesPersonalTranslation($transClass)) {
  101. $qb->where('trans.object = :object');
  102. $qb->setParameter('object', $wrapped->getObject());
  103. } else {
  104. $qb->where(
  105. 'trans.foreignKey = :objectId',
  106. 'trans.objectClass = :class'
  107. );
  108. $qb->setParameter('objectId', $wrapped->getIdentifier());
  109. $qb->setParameter('class', $wrapped->getMetadata()->name);
  110. }
  111. return $qb->getQuery()->getSingleScalarResult();
  112. }
  113. /**
  114. * {@inheritDoc}
  115. */
  116. public function insertTranslationRecord($translation)
  117. {
  118. $em = $this->getObjectManager();
  119. $meta = $em->getClassMetadata(get_class($translation));
  120. $data = array();
  121. foreach ($meta->getReflectionProperties() as $fieldName => $reflProp) {
  122. if (!$meta->isIdentifier($fieldName)) {
  123. $data[$meta->getColumnName($fieldName)] = $reflProp->getValue($translation);
  124. }
  125. }
  126. $table = $meta->getTableName();
  127. if (!$em->getConnection()->insert($table, $data)) {
  128. throw new \Gedmo\Exception\RuntimeException('Failed to insert new Translation record');
  129. }
  130. }
  131. /**
  132. * {@inheritDoc}
  133. */
  134. public function getTranslationValue($object, $field, $value = false)
  135. {
  136. $em = $this->getObjectManager();
  137. $wrapped = AbstractWrapper::wrapp($object, $em);
  138. $meta = $wrapped->getMetadata();
  139. $type = Type::getType($meta->getTypeOfField($field));
  140. if ($value === false) {
  141. $value = $wrapped->getPropertyValue($field);
  142. }
  143. return $type->convertToDatabaseValue($value, $em->getConnection()->getDatabasePlatform());
  144. }
  145. /**
  146. * {@inheritDoc}
  147. */
  148. public function setTranslationValue($object, $field, $value)
  149. {
  150. $em = $this->getObjectManager();
  151. $wrapped = AbstractWrapper::wrapp($object, $em);
  152. $meta = $wrapped->getMetadata();
  153. $type = Type::getType($meta->getTypeOfField($field));
  154. $value = $type->convertToPHPValue($value, $em->getConnection()->getDatabasePlatform());
  155. $wrapped->setPropertyValue($field, $value);
  156. }
  157. }