ORM.php 4.4 KB

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