|
@@ -124,7 +124,7 @@ class SluggableListener extends MappedEventSubscriber
|
|
|
if ($config = $this->getConfiguration($om, $meta->name)) {
|
|
|
// generate first to exclude this object from similar persisted slugs result
|
|
|
$this->generateSlug($ea, $object);
|
|
|
- foreach ($config['fields'] as $slugField => $fieldsForSlugField) {
|
|
|
+ foreach ($config['slugs'] as $slugField => $options) {
|
|
|
$slug = $meta->getReflectionProperty($slugField)->getValue($object);
|
|
|
$this->persistedSlugs[$config['useObjectClass']][$slugField][] = $slug;
|
|
|
}
|
|
@@ -135,8 +135,8 @@ class SluggableListener extends MappedEventSubscriber
|
|
|
foreach ($ea->getScheduledObjectUpdates($uow) as $object) {
|
|
|
$meta = $om->getClassMetadata(get_class($object));
|
|
|
if ($config = $this->getConfiguration($om, $meta->name)) {
|
|
|
- foreach ($config['slugFields'] as $slugField) {
|
|
|
- if ($slugField['updatable']) {
|
|
|
+ foreach ($config['slugs'] as $slugField => $options) {
|
|
|
+ if ($options['updatable']) {
|
|
|
$this->generateSlug($ea, $object);
|
|
|
}
|
|
|
}
|
|
@@ -182,48 +182,41 @@ class SluggableListener extends MappedEventSubscriber
|
|
|
$uow = $om->getUnitOfWork();
|
|
|
$changeSet = $ea->getObjectChangeSet($uow, $object);
|
|
|
$config = $this->getConfiguration($om, $meta->name);
|
|
|
- foreach ($config['fields'] as $slugField => $fieldsForSlugField) {
|
|
|
- // sort sluggable fields by position
|
|
|
- $fields = $fieldsForSlugField;
|
|
|
- usort($fields, function($a, $b) {
|
|
|
- if ($a['position'] == $b['position']) {
|
|
|
- return 1;
|
|
|
- }
|
|
|
- return ($a['position'] < $b['position']) ? -1 : 1;
|
|
|
- });
|
|
|
-
|
|
|
- $slugFieldConfig = $config['slugFields'][$slugField];
|
|
|
+ foreach ($config['slugs'] as $slugField => $options) {
|
|
|
+ $hasHandlers = count($options['handlers']);
|
|
|
+ $fields = $options['fields'];
|
|
|
+ //$slugFieldConfig = $config['slugFields'][$slugField];
|
|
|
// collect the slug from fields
|
|
|
$slug = '';
|
|
|
$needToChangeSlug = false;
|
|
|
- foreach ($fields as $sluggableField) {
|
|
|
- if (isset($changeSet[$sluggableField['field']])) {
|
|
|
+ foreach ($options['fields'] as $sluggableField) {
|
|
|
+ if (isset($changeSet[$sluggableField])) {
|
|
|
$needToChangeSlug = true;
|
|
|
}
|
|
|
- $slug .= $meta->getReflectionProperty($sluggableField['field'])->getValue($object) . ' ';
|
|
|
+ $slug .= $meta->getReflectionProperty($sluggableField)->getValue($object) . ' ';
|
|
|
}
|
|
|
// notify slug handlers --> onChangeDecision
|
|
|
- if (isset($config['handlers'])) {
|
|
|
- foreach ($config['handlers'] as $class => $options) {
|
|
|
+ if ($hasHandlers) {
|
|
|
+ foreach ($options['handlers'] as $class => $handlerOptions) {
|
|
|
$this
|
|
|
->getHandler($class)
|
|
|
- ->onChangeDecision($ea, $slugFieldConfig, $object, $slug, $needToChangeSlug)
|
|
|
+ ->onChangeDecision($ea, $options, $object, $slug, $needToChangeSlug)
|
|
|
;
|
|
|
}
|
|
|
}
|
|
|
// if slug is changed, do further processing
|
|
|
if ($needToChangeSlug) {
|
|
|
- $mapping = $meta->getFieldMapping($slugFieldConfig['slug']);
|
|
|
+ $mapping = $meta->getFieldMapping($slugField);
|
|
|
if (!strlen(trim($slug)) && (!isset($mapping['nullable']) || !$mapping['nullable'])) {
|
|
|
throw new \Gedmo\Exception\UnexpectedValueException("Unable to find any non empty sluggable fields for slug [{$slugField}] , make sure they have something at least.");
|
|
|
}
|
|
|
|
|
|
// notify slug handlers --> postSlugBuild
|
|
|
- if (isset($config['handlers'])) {
|
|
|
- foreach ($config['handlers'] as $class => $options) {
|
|
|
+ if ($hasHandlers) {
|
|
|
+ foreach ($options['handlers'] as $class => $handlerOptions) {
|
|
|
$this
|
|
|
->getHandler($class)
|
|
|
- ->postSlugBuild($ea, $slugFieldConfig, $object, $slug)
|
|
|
+ ->postSlugBuild($ea, $options, $object, $slug)
|
|
|
;
|
|
|
}
|
|
|
}
|
|
@@ -231,13 +224,13 @@ class SluggableListener extends MappedEventSubscriber
|
|
|
// build the slug
|
|
|
$slug = call_user_func_array(
|
|
|
$this->transliterator,
|
|
|
- array($slug, $slugFieldConfig['separator'], $object)
|
|
|
+ array($slug, $options['separator'], $object)
|
|
|
);
|
|
|
// stylize the slug
|
|
|
- switch ($slugFieldConfig['style']) {
|
|
|
+ switch ($options['style']) {
|
|
|
case 'camel':
|
|
|
$slug = preg_replace_callback(
|
|
|
- '@^[a-z]|' . $slugFieldConfig['separator'] . '[a-z]@smi',
|
|
|
+ '@^[a-z]|' . $options['separator'] . '[a-z]@smi',
|
|
|
create_function('$m', 'return strtoupper($m[0]);'),
|
|
|
$slug
|
|
|
);
|
|
@@ -257,23 +250,23 @@ class SluggableListener extends MappedEventSubscriber
|
|
|
$slug = null;
|
|
|
}
|
|
|
// make unique slug if requested
|
|
|
- if ($slugFieldConfig['unique'] && !is_null($slug)) {
|
|
|
+ if ($options['unique'] && !is_null($slug)) {
|
|
|
$this->exponent = 0;
|
|
|
- $arrayConfig = $slugFieldConfig;
|
|
|
+ $arrayConfig = $options;
|
|
|
$arrayConfig['useObjectClass'] = $config['useObjectClass'];
|
|
|
$slug = $this->makeUniqueSlug($ea, $object, $slug, false, $arrayConfig);
|
|
|
}
|
|
|
// notify slug handlers --> onSlugCompletion
|
|
|
- if (isset($config['handlers'])) {
|
|
|
- foreach ($config['handlers'] as $class => $options) {
|
|
|
+ if ($hasHandlers) {
|
|
|
+ foreach ($options['handlers'] as $class => $handlerOptions) {
|
|
|
$this
|
|
|
->getHandler($class)
|
|
|
- ->onSlugCompletion($ea, $slugFieldConfig, $object, $slug)
|
|
|
+ ->onSlugCompletion($ea, $options, $object, $slug)
|
|
|
;
|
|
|
}
|
|
|
}
|
|
|
// set the final slug
|
|
|
- $meta->getReflectionProperty($slugFieldConfig['slug'])->setValue($object, $slug);
|
|
|
+ $meta->getReflectionProperty($slugField)->setValue($object, $slug);
|
|
|
// recompute changeset
|
|
|
$ea->recomputeSingleObjectChangeSet($uow, $meta, $object);
|
|
|
}
|
|
@@ -293,10 +286,6 @@ class SluggableListener extends MappedEventSubscriber
|
|
|
{
|
|
|
$om = $ea->getObjectManager();
|
|
|
$meta = $om->getClassMetadata(get_class($object));
|
|
|
- if (count ($config) == 0)
|
|
|
- {
|
|
|
- $config = $this->getConfiguration($om, $meta->name);
|
|
|
- }
|
|
|
// search for similar slug
|
|
|
$result = $ea->getSimilarSlugs($object, $meta, $config, $preferedSlug);
|
|
|
// add similar persisted slugs into account
|