/vendor/gedmo/doctrine-extensions/lib/Gedmo/Sluggable/Mapping/Event/Adapter/ODM.php

https://bitbucket.org/hanutimes/hanutimes · PHP · 120 lines · 88 code · 9 blank · 23 comment · 9 complexity · cf112c4bd8a21023c8a225af57b116b4 MD5 · raw file

  1. <?php
  2. namespace Gedmo\Sluggable\Mapping\Event\Adapter;
  3. use Gedmo\Mapping\Event\Adapter\ODM as BaseAdapterODM;
  4. use Doctrine\ODM\MongoDB\Cursor;
  5. use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
  6. use Gedmo\Tool\Wrapper\AbstractWrapper;
  7. /**
  8. * Doctrine event adapter for ODM adapted
  9. * for sluggable behavior
  10. *
  11. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  12. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  13. */
  14. final class ODM extends BaseAdapterODM implements SluggableAdapter
  15. {
  16. /**
  17. * {@inheritDoc}
  18. */
  19. public function getSimilarSlugs($object, $meta, array $config, $slug)
  20. {
  21. $dm = $this->getObjectManager();
  22. $wrapped = AbstractWrapper::wrap($object, $dm);
  23. $qb = $dm->createQueryBuilder($config['useObjectClass']);
  24. if (($identifier = $wrapped->getIdentifier()) && !$meta->isIdentifier($config['slug'])) {
  25. $qb->field($meta->identifier)->notEqual($identifier);
  26. }
  27. $qb->field($config['slug'])->equals(new \MongoRegex('/^' . preg_quote($slug, '/') . '/'));
  28. // use the unique_base to restrict the uniqueness check
  29. if ($config['unique'] && isset($config['unique_base'])) {
  30. if (is_object($reflectValue = $wrapped->getPropertyValue($config['unique_base']))) {
  31. $qb->field($config['unique_base'] . '.$id')->equals(new \MongoId($reflectValue->getId()));
  32. } else {
  33. $qb->where('/^' . preg_quote($reflectValue, '/') . '/.test(this.' . $config['unique_base'] . ')');
  34. }
  35. }
  36. $q = $qb->getQuery();
  37. $q->setHydrate(false);
  38. $result = $q->execute();
  39. if ($result instanceof Cursor) {
  40. $result = $result->toArray();
  41. }
  42. return $result;
  43. }
  44. /**
  45. * This query can couse some data integrity failures since it does not
  46. * execute atomicaly
  47. *
  48. * {@inheritDoc}
  49. */
  50. public function replaceRelative($object, array $config, $target, $replacement)
  51. {
  52. $dm = $this->getObjectManager();
  53. $meta = $dm->getClassMetadata($config['useObjectClass']);
  54. $q = $dm
  55. ->createQueryBuilder($config['useObjectClass'])
  56. ->where("function() {
  57. return this.{$config['slug']}.indexOf('{$target}') === 0;
  58. }")
  59. ->getQuery()
  60. ;
  61. $q->setHydrate(false);
  62. $result = $q->execute();
  63. if ($result instanceof Cursor) {
  64. $result = $result->toArray();
  65. foreach ($result as $targetObject) {
  66. $slug = preg_replace("@^{$target}@smi", $replacement.$config['pathSeparator'], $targetObject[$config['slug']]);
  67. $dm
  68. ->createQueryBuilder()
  69. ->update($config['useObjectClass'])
  70. ->field($config['slug'])->set($slug)
  71. ->field($meta->identifier)->equals($targetObject['_id'])
  72. ->getQuery()
  73. ->execute()
  74. ;
  75. }
  76. }
  77. }
  78. /**
  79. * This query can couse some data integrity failures since it does not
  80. * execute atomicaly
  81. *
  82. * {@inheritDoc}
  83. */
  84. public function replaceInverseRelative($object, array $config, $target, $replacement)
  85. {
  86. $dm = $this->getObjectManager();
  87. $wrapped = AbstractWrapper::wrap($object, $dm);
  88. $meta = $dm->getClassMetadata($config['useObjectClass']);
  89. $q = $dm
  90. ->createQueryBuilder($config['useObjectClass'])
  91. ->field($config['mappedBy'].'.'.$meta->identifier)->equals($wrapped->getIdentifier())
  92. ->getQuery()
  93. ;
  94. $q->setHydrate(false);
  95. $result = $q->execute();
  96. if ($result instanceof Cursor) {
  97. $result = $result->toArray();
  98. foreach ($result as $targetObject) {
  99. $slug = preg_replace("@^{$replacement}@smi", $target, $targetObject[$config['slug']]);
  100. $dm
  101. ->createQueryBuilder()
  102. ->update($config['useObjectClass'])
  103. ->field($config['slug'])->set($slug)
  104. ->field($meta->identifier)->equals($targetObject['_id'])
  105. ->getQuery()
  106. ->execute()
  107. ;
  108. }
  109. }
  110. }
  111. }