ORM.php 4.6 KB

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