Example #1
0
 /**
  * {@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;
         }
     }
 }
Example #2
0
 /**
  * {@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);
         }
     }
 }
Example #6
0
 /**
  * {@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;
         }
     }
 }