ORM.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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)
  78. {
  79. $em = $this->getObjectManager();
  80. $dql = 'DELETE ' . $transClass . ' trans';
  81. $dql .= ' WHERE trans.foreignKey = :objectId';
  82. $q = $em->createQuery($dql);
  83. $q->setParameters(compact('objectId'));
  84. return $q->getSingleScalarResult();
  85. }
  86. /**
  87. * {@inheritDoc}
  88. */
  89. public function insertTranslationRecord($translation)
  90. {
  91. $em = $this->getObjectManager();
  92. $meta = $em->getClassMetadata(get_class($translation));
  93. $data = array();
  94. foreach ($meta->getReflectionProperties() as $fieldName => $reflProp) {
  95. if (!$meta->isIdentifier($fieldName)) {
  96. $data[$meta->getColumnName($fieldName)] = $reflProp->getValue($translation);
  97. }
  98. }
  99. $table = $meta->getTableName();
  100. if (!$em->getConnection()->insert($table, $data)) {
  101. throw new \Gedmo\Exception\RuntimeException('Failed to insert new Translation record');
  102. }
  103. }
  104. /**
  105. * {@inheritDoc}
  106. */
  107. public function getTranslationValue($object, $field, $value = false)
  108. {
  109. $em = $this->getObjectManager();
  110. $wrapped = AbstractWrapper::wrapp($object, $em);
  111. $meta = $wrapped->getMetadata();
  112. $type = Type::getType($meta->getTypeOfField($field));
  113. if ($value === false) {
  114. $value = $wrapped->getPropertyValue($field);
  115. }
  116. return $type->convertToDatabaseValue($value, $em->getConnection()->getDatabasePlatform());
  117. }
  118. /**
  119. * {@inheritDoc}
  120. */
  121. public function setTranslationValue($object, $field, $value)
  122. {
  123. $em = $this->getObjectManager();
  124. $wrapped = AbstractWrapper::wrapp($object, $em);
  125. $meta = $wrapped->getMetadata();
  126. $type = Type::getType($meta->getTypeOfField($field));
  127. $value = $type->convertToPHPValue($value, $em->getConnection()->getDatabasePlatform());
  128. $wrapped->setPropertyValue($field, $value);
  129. }
  130. }