/** * {@inheritDoc} */ public function onChangeDecision(SluggableAdapter $ea, array &$config, $object, &$slug, &$needToChangeSlug) { $om = $ea->getObjectManager(); $isInsert = $om->getUnitOfWork()->isScheduledForInsert($object); $this->options = array_merge(array('separator' => '-', 'dateField' => 'date', 'format' => 'Y', 'check_included' => true), $config['handlers'][get_called_class()]); if (!$isInsert && !$needToChangeSlug) { $changeSet = $ea->getObjectChangeSet($om->getUnitOfWork(), $object); if (isset($changeSet[$this->options['dateField']])) { $needToChangeSlug = true; } } }
/** * {@inheritDoc} */ public function onChangeDecision(SluggableAdapter $ea, $config, $object, &$slug, &$needToChangeSlug) { $this->om = $ea->getObjectManager(); $this->isInsert = $this->om->getUnitOfWork()->isScheduledForInsert($object); $options = $config['handlers'][get_called_class()]; $this->usedPathSeparator = isset($options['separator']) ? $options['separator'] : self::SEPARATOR; if (!$this->isInsert && !$needToChangeSlug) { $changeSet = $ea->getObjectChangeSet($this->om->getUnitOfWork(), $object); if (isset($changeSet[$options['parentRelationField']])) { $needToChangeSlug = true; } } }
/** * Creates the slug for object being flushed * * @param SluggableAdapter $ea * @param object $object * @throws UnexpectedValueException - if parameters are missing * or invalid * @return void */ private function generateSlug(SluggableAdapter $ea, $object) { $om = $ea->getObjectManager(); $meta = $om->getClassMetadata(get_class($object)); $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]; // collect the slug from fields $slug = ''; $needToChangeSlug = false; foreach ($fields as $sluggableField) { if (isset($changeSet[$sluggableField['field']])) { $needToChangeSlug = true; } $slug .= $meta->getReflectionProperty($sluggableField['field'])->getValue($object) . ' '; } // notify slug handlers --> onChangeDecision if (isset($config['handlers'])) { foreach ($config['handlers'] as $class => $options) { $this->getHandler($class)->onChangeDecision($ea, $slugFieldConfig, $object, $slug, $needToChangeSlug); } } // if slug is changed, do further processing if ($needToChangeSlug) { if (!strlen(trim($slug))) { 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) { $this->getHandler($class)->postSlugBuild($ea, $slugFieldConfig, $object, $slug); } } // build the slug $slug = call_user_func_array($this->transliterator, array($slug, $slugFieldConfig['separator'], $object)); // stylize the slug switch ($slugFieldConfig['style']) { case 'camel': $slug = preg_replace_callback('@^[a-z]|' . $slugFieldConfig['separator'] . '[a-z]@smi', create_function('$m', 'return strtoupper($m[0]);'), $slug); break; default: // leave it as is break; } // cut slug if exceeded in length $mapping = $meta->getFieldMapping($slugFieldConfig['slug']); if (isset($mapping['length']) && strlen($slug) > $mapping['length']) { $slug = substr($slug, 0, $mapping['length']); } // make unique slug if requested if ($slugFieldConfig['unique']) { $this->exponent = 0; $arrayConfig = $slugFieldConfig; $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) { $this->getHandler($class)->onSlugCompletion($ea, $slugFieldConfig, $object, $slug); } } // set the final slug $meta->getReflectionProperty($slugFieldConfig['slug'])->setValue($object, $slug); // recompute changeset $ea->recomputeSingleObjectChangeSet($uow, $meta, $object); } } }
/** * Creates the slug for object being flushed * * @param SluggableAdapter $ea * @param object $object * @throws UnexpectedValueException - if parameters are missing * or invalid * @return void */ private function generateSlug(SluggableAdapter $ea, $object) { $om = $ea->getObjectManager(); $meta = $om->getClassMetadata(get_class($object)); $uow = $om->getUnitOfWork(); $changeSet = $ea->getObjectChangeSet($uow, $object); $isInsert = $uow->isScheduledForInsert($object); $config = $this->getConfiguration($om, $meta->name); foreach ($config['slugs'] as $slugField => $options) { $hasHandlers = count($options['handlers']); $options['useObjectClass'] = $config['useObjectClass']; // collect the slug from fields $slug = $meta->getReflectionProperty($slugField)->getValue($object); // if slug should not be updated, skip it if (!$options['updatable'] && !$isInsert && (!isset($changeSet[$slugField]) || $slug === '__id__')) { continue; } // must fetch the old slug from changeset, since $object holds the new version $oldSlug = isset($changeSet[$slugField]) ? $changeSet[$slugField][0] : $slug; $needToChangeSlug = false; // if slug is null, regenerate it, or needs an update if (null === $slug || $slug === '__id__' || !isset($changeSet[$slugField])) { $slug = ''; foreach ($options['fields'] as $sluggableField) { if (isset($changeSet[$sluggableField]) || isset($changeSet[$slugField])) { $needToChangeSlug = true; } $value = $meta->getReflectionProperty($sluggableField)->getValue($object); $slug .= $value instanceof \DateTime ? $value->format($options['dateFormat']) : $value; $slug .= ' '; } // trim generated slug as it will have unnecessary trailing space $slug = trim($slug); } else { // slug was set manually $needToChangeSlug = true; } // notify slug handlers --> onChangeDecision if ($hasHandlers) { foreach ($options['handlers'] as $class => $handlerOptions) { $this->getHandler($class)->onChangeDecision($ea, $options, $object, $slug, $needToChangeSlug); } } // if slug is changed, do further processing if ($needToChangeSlug) { $mapping = $meta->getFieldMapping($slugField); // notify slug handlers --> postSlugBuild $urlized = false; if ($hasHandlers) { foreach ($options['handlers'] as $class => $handlerOptions) { $this->getHandler($class)->postSlugBuild($ea, $options, $object, $slug); if ($this->getHandler($class)->handlesUrlization()) { $urlized = true; } } } // build the slug // Step 1: transliteration, changing 北京 to 'Bei Jing' $slug = call_user_func_array($this->transliterator, array($slug, $options['separator'], $object)); // Step 2: urlization (replace spaces by '-' etc...) if (!$urlized) { $slug = call_user_func_array($this->urlizer, array($slug, $options['separator'], $object)); } // add suffix/prefix $slug = $options['prefix'] . $slug . $options['suffix']; // Step 3: stylize the slug switch ($options['style']) { case 'camel': $slug = preg_replace_callback('/^[a-z]|' . $options['separator'] . '[a-z]/smi', function ($m) { return strtoupper($m[0]); }, $slug); break; case 'lower': if (function_exists('mb_strtolower')) { $slug = mb_strtolower($slug); } else { $slug = strtolower($slug); } break; case 'upper': if (function_exists('mb_strtoupper')) { $slug = mb_strtoupper($slug); } else { $slug = strtoupper($slug); } break; default: // leave it as is break; } // cut slug if exceeded in length if (isset($mapping['length']) && strlen($slug) > $mapping['length']) { $slug = substr($slug, 0, $mapping['length']); } if (isset($mapping['nullable']) && $mapping['nullable'] && !$slug) { $slug = null; } // make unique slug if requested if ($options['unique'] && null !== $slug) { $this->exponent = 0; $slug = $this->makeUniqueSlug($ea, $object, $slug, false, $options); } // notify slug handlers --> onSlugCompletion if ($hasHandlers) { foreach ($options['handlers'] as $class => $handlerOptions) { $this->getHandler($class)->onSlugCompletion($ea, $options, $object, $slug); } } // set the final slug $meta->getReflectionProperty($slugField)->setValue($object, $slug); $uow->propertyChanged($object, $slugField, $oldSlug, $slug); // recompute changeset $ea->recomputeSingleObjectChangeSet($uow, $meta, $object); } } }
/** * Creates the slug for object being flushed * * @param SluggableAdapter $ea * @param object $object * @throws UnexpectedValueException - if parameters are missing * or invalid * @return void */ private function generateSlug(SluggableAdapter $ea, $object) { $om = $ea->getObjectManager(); $meta = $om->getClassMetadata(get_class($object)); $uow = $om->getUnitOfWork(); $changeSet = $ea->getObjectChangeSet($uow, $object); $config = $this->getConfiguration($om, $meta->name); foreach ($config['slugs'] as $slugField => $options) { $options['useObjectClass'] = $config['useObjectClass']; $fields = $options['fields']; //$slugFieldConfig = $config['slugFields'][$slugField]; // collect the slug from fields $slug = ''; $needToChangeSlug = false; foreach ($options['fields'] as $sluggableField) { if (isset($changeSet[$sluggableField])) { $needToChangeSlug = true; } $slug .= $meta->getReflectionProperty($sluggableField)->getValue($object) . ' '; } // if slug is changed, do further processing if ($needToChangeSlug) { $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."); } // build the slug $slug = call_user_func_array($this->transliterator, array($slug, $options['separator'], $object)); $slug = Util\Urlizer::urlize($slug, $options['separator']); // stylize the slug switch ($options['style']) { case 'camel': $slug = preg_replace_callback('/^[a-z]|' . $options['separator'] . '[a-z]/smi', function ($m) { return strtoupper($m[0]); }, $slug); break; default: // leave it as is break; } // cut slug if exceeded in length if (isset($mapping['length']) && strlen($slug) > $mapping['length']) { $slug = substr($slug, 0, $mapping['length']); } if (isset($mapping['nullable']) && $mapping['nullable'] && !$slug) { $slug = null; } // make unique slug if requested if ($options['unique'] && !is_null($slug)) { $this->exponent = 0; $slug = $this->makeUniqueSlug($ea, $object, $slug, false, $options); } // set the final slug $meta->getReflectionProperty($slugField)->setValue($object, $slug); // recompute changeset $ea->recomputeSingleObjectChangeSet($uow, $meta, $object); } } }
/** * {@inheritDoc} */ public function onChangeDecision(SluggableAdapter $ea, $slugFieldConfig, $object, &$slug, &$needToChangeSlug) { $this->om = $ea->getObjectManager(); $this->isInsert = $this->om->getUnitOfWork()->isScheduledForInsert($object); if (!$this->isInsert && !$needToChangeSlug) { $changeSet = $ea->getObjectChangeSet($this->om->getUnitOfWork(), $object); $options = $this->getOptions($object); if (isset($changeSet[$options['parentRelationField']])) { $needToChangeSlug = true; } } }