Actualización

This commit is contained in:
Xes
2025-04-10 12:24:57 +02:00
parent 8969cc929d
commit 45420b6f0d
39760 changed files with 4303286 additions and 0 deletions

View File

@@ -0,0 +1,123 @@
<?php
namespace Gedmo\Sluggable\Mapping\Event\Adapter;
use Gedmo\Mapping\Event\Adapter\ODM as BaseAdapterODM;
use Doctrine\ODM\MongoDB\Cursor;
use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
use Gedmo\Tool\Wrapper\AbstractWrapper;
/**
* Doctrine event adapter for ODM adapted
* for sluggable behavior
*
* @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
final class ODM extends BaseAdapterODM implements SluggableAdapter
{
/**
* {@inheritDoc}
*/
public function getSimilarSlugs($object, $meta, array $config, $slug)
{
$dm = $this->getObjectManager();
$wrapped = AbstractWrapper::wrap($object, $dm);
$qb = $dm->createQueryBuilder($config['useObjectClass']);
if (($identifier = $wrapped->getIdentifier()) && !$meta->isIdentifier($config['slug'])) {
$qb->field($meta->identifier)->notEqual($identifier);
}
$qb->field($config['slug'])->equals(new \MongoRegex('/^'.preg_quote($slug, '/').'/'));
// use the unique_base to restrict the uniqueness check
if ($config['unique'] && isset($config['unique_base'])) {
if (is_object($ubase = $wrapped->getPropertyValue($config['unique_base']))) {
$qb->field($config['unique_base'].'.$id')->equals(new \MongoId($ubase->getId()));
} elseif ($ubase) {
$qb->where('/^'.preg_quote($ubase, '/').'/.test(this.'.$config['unique_base'].')');
} else {
$qb->field($config['unique_base'])->equals(null);
}
}
$q = $qb->getQuery();
$q->setHydrate(false);
$result = $q->execute();
if ($result instanceof Cursor) {
$result = $result->toArray();
}
return $result;
}
/**
* This query can cause some data integrity failures since it does not
* execute automatically
*
* {@inheritDoc}
*/
public function replaceRelative($object, array $config, $target, $replacement)
{
$dm = $this->getObjectManager();
$meta = $dm->getClassMetadata($config['useObjectClass']);
$q = $dm
->createQueryBuilder($config['useObjectClass'])
->where("function() {
return this.{$config['slug']}.indexOf('{$target}') === 0;
}")
->getQuery()
;
$q->setHydrate(false);
$result = $q->execute();
if ($result instanceof Cursor) {
$result = $result->toArray();
foreach ($result as $targetObject) {
$slug = preg_replace("@^{$target}@smi", $replacement.$config['pathSeparator'], $targetObject[$config['slug']]);
$dm
->createQueryBuilder()
->update($config['useObjectClass'])
->field($config['slug'])->set($slug)
->field($meta->identifier)->equals($targetObject['_id'])
->getQuery()
->execute()
;
}
}
}
/**
* This query can cause some data integrity failures since it does not
* execute atomically
*
* {@inheritDoc}
*/
public function replaceInverseRelative($object, array $config, $target, $replacement)
{
$dm = $this->getObjectManager();
$wrapped = AbstractWrapper::wrap($object, $dm);
$meta = $dm->getClassMetadata($config['useObjectClass']);
$q = $dm
->createQueryBuilder($config['useObjectClass'])
->field($config['mappedBy'].'.'.$meta->identifier)->equals($wrapped->getIdentifier())
->getQuery()
;
$q->setHydrate(false);
$result = $q->execute();
if ($result instanceof Cursor) {
$result = $result->toArray();
foreach ($result as $targetObject) {
$slug = preg_replace("@^{$replacement}@smi", $target, $targetObject[$config['slug']]);
$dm
->createQueryBuilder()
->update($config['useObjectClass'])
->field($config['slug'])->set($slug)
->field($meta->identifier)->equals($targetObject['_id'])
->getQuery()
->execute()
;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?php
namespace Gedmo\Sluggable\Mapping\Event\Adapter;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
use Gedmo\Mapping\Event\Adapter\ORM as BaseAdapterORM;
use Doctrine\ORM\Query;
use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
use Gedmo\Tool\Wrapper\AbstractWrapper;
/**
* Doctrine event adapter for ORM adapted
* for sluggable behavior
*
* @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
class ORM extends BaseAdapterORM implements SluggableAdapter
{
/**
* {@inheritDoc}
*/
public function getSimilarSlugs($object, $meta, array $config, $slug)
{
$em = $this->getObjectManager();
$wrapped = AbstractWrapper::wrap($object, $em);
$qb = $em->createQueryBuilder();
$qb->select('rec.'.$config['slug'])
->from($config['useObjectClass'], 'rec')
->where($qb->expr()->like(
'rec.'.$config['slug'],
':slug')
)
;
$qb->setParameter('slug',$slug.'%');
// use the unique_base to restrict the uniqueness check
if ($config['unique'] && isset($config['unique_base'])) {
$ubase = $wrapped->getPropertyValue($config['unique_base']);
if (array_key_exists($config['unique_base'], $wrapped->getMetadata()->getAssociationMappings())) {
$mapping = $wrapped->getMetadata()->getAssociationMapping($config['unique_base']);
} else {
$mapping = false;
}
if (($ubase || $ubase === 0) && !$mapping) {
$qb->andWhere('rec.'.$config['unique_base'].' = :unique_base');
$qb->setParameter(':unique_base', $ubase);
} elseif ($ubase && $mapping && in_array($mapping['type'], array(ClassMetadataInfo::ONE_TO_ONE, ClassMetadataInfo::MANY_TO_ONE))) {
$mappedAlias = 'mapped_'.$config['unique_base'];
$wrappedUbase = AbstractWrapper::wrap($ubase, $em);
$qb->innerJoin('rec.'.$config['unique_base'], $mappedAlias);
foreach (array_keys($mapping['targetToSourceKeyColumns']) as $i => $mappedKey) {
$mappedProp = $wrappedUbase->getMetadata()->fieldNames[$mappedKey];
$qb->andWhere($qb->expr()->eq($mappedAlias.'.'.$mappedProp, ':assoc'.$i));
$qb->setParameter(':assoc'.$i, $wrappedUbase->getPropertyValue($mappedProp));
}
} else {
$qb->andWhere($qb->expr()->isNull('rec.'.$config['unique_base']));
}
}
// include identifiers
foreach ((array) $wrapped->getIdentifier(false) as $id => $value) {
if (!$meta->isIdentifier($config['slug'])) {
$namedId = str_replace('.', '_', $id);
$qb->andWhere($qb->expr()->neq('rec.'.$id, ':'.$namedId));
$qb->setParameter($namedId, $value, $meta->getTypeOfField($namedId));
}
}
$q = $qb->getQuery();
$q->setHydrationMode(Query::HYDRATE_ARRAY);
return $q->execute();
}
/**
* {@inheritDoc}
*/
public function replaceRelative($object, array $config, $target, $replacement)
{
$em = $this->getObjectManager();
$qb = $em->createQueryBuilder();
$qb->update($config['useObjectClass'], 'rec')
->set('rec.'.$config['slug'], $qb->expr()->concat(
$qb->expr()->literal($replacement),
$qb->expr()->substring('rec.'.$config['slug'], mb_strlen($target))
))
->where($qb->expr()->like(
'rec.'.$config['slug'],
$qb->expr()->literal($target.'%'))
)
;
// update in memory
$q = $qb->getQuery();
return $q->execute();
}
/**
* {@inheritDoc}
*/
public function replaceInverseRelative($object, array $config, $target, $replacement)
{
$em = $this->getObjectManager();
$qb = $em->createQueryBuilder();
$qb->update($config['useObjectClass'], 'rec')
->set('rec.'.$config['slug'], $qb->expr()->concat(
$qb->expr()->literal($target),
$qb->expr()->substring('rec.'.$config['slug'], mb_strlen($replacement)+1)
))
->where($qb->expr()->like('rec.'.$config['slug'], $qb->expr()->literal($replacement . '%')))
;
$q = $qb->getQuery();
return $q->execute();
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace Gedmo\Sluggable\Mapping\Event;
use Gedmo\Mapping\Event\AdapterInterface;
/**
* Doctrine event adapter interface
* for Sluggable behavior
*
* @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
interface SluggableAdapter extends AdapterInterface
{
/**
* Loads the similar slugs
*
* @param object $object
* @param object $meta
* @param array $config
* @param string $slug
*
* @return array
*/
public function getSimilarSlugs($object, $meta, array $config, $slug);
/**
* Replace part of slug to all objects
* matching $target pattern
*
* @param object $object
* @param array $config
* @param string $target
* @param string $replacement
*
* @return integer
*/
public function replaceRelative($object, array $config, $target, $replacement);
/**
* Replace part of slug to all objects
* matching $target pattern and having $object
* related
*
* @param object $object
* @param array $config
* @param string $target
* @param string $replacement
*
* @return integer
*/
public function replaceInverseRelative($object, array $config, $target, $replacement);
}