ORM.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. /**
  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 getDefaultTranslationClass()
  24. {
  25. return 'Gedmo\\Translatable\\Entity\\Translation';
  26. }
  27. /**
  28. * {@inheritDoc}
  29. */
  30. public function loadTranslations($object, $translationClass, $locale)
  31. {
  32. $em = $this->getObjectManager();
  33. $meta = $em->getClassMetadata(get_class($object));
  34. // load translated content for all translatable fields
  35. $objectId = $this->extractIdentifier($em, $object);
  36. // construct query
  37. $dql = 'SELECT t.content, t.field FROM ' . $translationClass . ' t';
  38. $dql .= ' WHERE t.foreignKey = :objectId';
  39. $dql .= ' AND t.locale = :locale';
  40. $dql .= ' AND t.objectClass = :objectClass';
  41. // fetch results
  42. $objectClass = $meta->name;
  43. $q = $em->createQuery($dql);
  44. $q->setParameters(compact('objectId', 'locale', 'objectClass'));
  45. return $q->getArrayResult();
  46. }
  47. /**
  48. * {@inheritDoc}
  49. */
  50. public function findTranslation($objectId, $objectClass, $locale, $field, $translationClass)
  51. {
  52. $em = $this->getObjectManager();
  53. $qb = $em->createQueryBuilder();
  54. $qb->select('trans')
  55. ->from($translationClass, 'trans')
  56. ->where(
  57. 'trans.foreignKey = :objectId',
  58. 'trans.locale = :locale',
  59. 'trans.field = :field',
  60. 'trans.objectClass = :objectClass'
  61. );
  62. $q = $qb->getQuery();
  63. $result = $q->execute(
  64. compact('field', 'locale', 'objectId', 'objectClass'),
  65. Query::HYDRATE_OBJECT
  66. );
  67. if ($result) {
  68. return array_shift($result);
  69. }
  70. return null;
  71. }
  72. /**
  73. * {@inheritDoc}
  74. */
  75. public function removeAssociatedTranslations($objectId, $transClass)
  76. {
  77. $em = $this->getObjectManager();
  78. $dql = 'DELETE ' . $transClass . ' trans';
  79. $dql .= ' WHERE trans.foreignKey = :objectId';
  80. $q = $em->createQuery($dql);
  81. $q->setParameters(compact('objectId'));
  82. return $q->getSingleScalarResult();
  83. }
  84. /**
  85. * {@inheritDoc}
  86. */
  87. public function insertTranslationRecord($translation)
  88. {
  89. $em = $this->getObjectManager();
  90. $meta = $em->getClassMetadata(get_class($translation));
  91. $data = array();
  92. foreach ($meta->getReflectionProperties() as $fieldName => $reflProp) {
  93. if (!$meta->isIdentifier($fieldName)) {
  94. $data[$meta->getColumnName($fieldName)] = $reflProp->getValue($translation);
  95. }
  96. }
  97. $table = $meta->getTableName();
  98. if (!$em->getConnection()->insert($table, $data)) {
  99. throw new \Gedmo\Exception\RuntimeException('Failed to insert new Translation record');
  100. }
  101. }
  102. }