RelativeSlugHandler.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. namespace Gedmo\Sluggable\Handler;
  3. use Doctrine\Common\Persistence\ObjectManager;
  4. use Doctrine\Common\Persistence\Mapping\ClassMetadata;
  5. use Gedmo\Sluggable\SluggableListener;
  6. use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
  7. use Gedmo\Tool\Wrapper\AbstractWrapper;
  8. use Gedmo\Exception\InvalidMappingException;
  9. class RelativeSlugHandler implements SlugHandlerInterface
  10. {
  11. /**
  12. * @var Doctrine\Common\Persistence\ObjectManager
  13. */
  14. private $om;
  15. /**
  16. * @var Gedmo\Sluggable\SluggableListener
  17. */
  18. private $sluggable;
  19. /**
  20. * Options for relative slug handler
  21. *
  22. * @var array
  23. */
  24. private $options;
  25. private $originalTransliterator;
  26. private $parts = array();
  27. /**
  28. * {@inheritDoc}
  29. */
  30. public function __construct(ObjectManager $om, SluggableListener $sluggable, array $options)
  31. {
  32. $this->om = $om;
  33. $this->sluggable = $sluggable;
  34. $default = array(
  35. 'recursive' => true,
  36. 'separator' => '/'
  37. );
  38. $this->options = array_merge($default, $options);
  39. }
  40. /**
  41. * {@inheritDoc}
  42. */
  43. public function postSlugBuild(SluggableAdapter $ea, $field, $object, &$slug)
  44. {
  45. $this->originalTransliterator = $this->sluggable->getTransliterator();
  46. $this->sluggable->setTransliterator(array($this, 'transliterate'));
  47. $this->parts = array();
  48. $wrapped = AbstractWrapper::wrapp($object, $this->om);
  49. do {
  50. $relation = $wrapped->getPropertyValue($this->options['relation']);
  51. if ($relation) {
  52. $wrappedRelation = AbstractWrapper::wrapp($relation, $this->om);
  53. array_unshift($this->parts, $wrappedRelation->getPropertyValue($this->options['targetField']));
  54. $wrapped = $wrappedRelation;
  55. }
  56. } while ($this->options['recursive'] && $relation);
  57. //var_dump($slug);
  58. }
  59. /**
  60. * {@inheritDoc}
  61. */
  62. public static function validate(array $options, ClassMetadata $meta)
  63. {
  64. if (!$meta->isSingleValuedAssociation($options['relation'])) {
  65. throw new InvalidMappingException("Unable to find slug relation through field - [{$options['relation']}] in class - {$meta->name}");
  66. }
  67. /*if (!$meta->isSingleValuedAssociation($options['relation'])) {
  68. throw new InvalidMappingException("Unable to find slug relation through field - [{$options['relation']}] in class - {$meta->name}");
  69. }*/
  70. }
  71. public function transliterate($text, $separator, $object)
  72. {
  73. foreach ($this->parts as &$part) {
  74. $part = call_user_func_array(
  75. $this->originalTransliterator,
  76. array($part, $separator, $object)
  77. );
  78. }
  79. $this->parts[] = call_user_func_array(
  80. $this->originalTransliterator,
  81. array($text, $separator, $object)
  82. );
  83. $this->sluggable->setTransliterator($this->originalTransliterator);
  84. return implode($this->options['separator'], $this->parts);
  85. }
  86. }