rewritten url update
This commit is contained in:
@@ -27,6 +27,8 @@ class UrlRewritingException extends \Exception
|
|||||||
{
|
{
|
||||||
const UNKNOWN_EXCEPTION = 0;
|
const UNKNOWN_EXCEPTION = 0;
|
||||||
|
|
||||||
|
const URL_ALREADY_EXISTS = 100;
|
||||||
|
|
||||||
const URL_NOT_FOUND = 404;
|
const URL_NOT_FOUND = 404;
|
||||||
|
|
||||||
const RESOLVER_NULL_SEARCH = 800;
|
const RESOLVER_NULL_SEARCH = 800;
|
||||||
|
|||||||
@@ -26,8 +26,10 @@ namespace Thelia\Model\Tools;
|
|||||||
use Thelia\Core\Event\GenerateRewrittenUrlEvent;
|
use Thelia\Core\Event\GenerateRewrittenUrlEvent;
|
||||||
use Thelia\Core\Event\TheliaEvents;
|
use Thelia\Core\Event\TheliaEvents;
|
||||||
use Thelia\Exception\UrlRewritingException;
|
use Thelia\Exception\UrlRewritingException;
|
||||||
|
use Thelia\Model\RewritingArgumentQuery;
|
||||||
use Thelia\Model\RewritingUrlQuery;
|
use Thelia\Model\RewritingUrlQuery;
|
||||||
use Thelia\Model\RewritingUrl;
|
use Thelia\Model\RewritingUrl;
|
||||||
|
use Thelia\Rewriting\RewritingResolver;
|
||||||
use Thelia\Tools\URL;
|
use Thelia\Tools\URL;
|
||||||
/**
|
/**
|
||||||
* A trait for managing Rewritten URLs from model classes
|
* A trait for managing Rewritten URLs from model classes
|
||||||
@@ -140,12 +142,78 @@ trait UrlRewritingTrait {
|
|||||||
* Set the rewritten URL for the given locale
|
* Set the rewritten URL for the given locale
|
||||||
*
|
*
|
||||||
* @param string $locale a valid locale (e.g. en_US)
|
* @param string $locale a valid locale (e.g. en_US)
|
||||||
* @param $url the wanted url
|
* @param $url
|
||||||
* @return $this
|
* @return $this
|
||||||
|
* @throws UrlRewritingException
|
||||||
|
* @throws \Thelia\Exception\UrlRewritingException
|
||||||
*/
|
*/
|
||||||
public function setRewrittenUrl($locale, $url)
|
public function setRewrittenUrl($locale, $url)
|
||||||
{
|
{
|
||||||
// TODO - code me !
|
$currentUrl = $this->getRewrittenUrl($locale);
|
||||||
|
if($currentUrl == $url) {
|
||||||
|
/* no url update */
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$resolver = new RewritingResolver($url);
|
||||||
|
|
||||||
|
/* we can reassign old url */
|
||||||
|
if(null === $resolver->redirectedToUrl) {
|
||||||
|
/* else ... */
|
||||||
|
if($resolver->view == $this->getRewrittenUrlViewName() && $resolver->viewId == $this->getId()) {
|
||||||
|
/* it's an url related to the current object */
|
||||||
|
|
||||||
|
if($resolver->locale != $locale) {
|
||||||
|
/* it is an url related to this product for another locale */
|
||||||
|
throw new UrlRewritingException('URL_ALREADY_EXISTS', UrlRewritingException::URL_ALREADY_EXISTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($resolver->otherParameters) > 0) {
|
||||||
|
/* it is an url related to this product but with more arguments */
|
||||||
|
throw new UrlRewritingException('URL_ALREADY_EXISTS', UrlRewritingException::URL_ALREADY_EXISTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* here it must be a deprecated url */
|
||||||
|
} else {
|
||||||
|
/* already related to another object */
|
||||||
|
throw new UrlRewritingException('URL_ALREADY_EXISTS', UrlRewritingException::URL_ALREADY_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(UrlRewritingException $e) {
|
||||||
|
/* It's all good if URL is not found */
|
||||||
|
if($e->getCode() !== UrlRewritingException::URL_NOT_FOUND) {
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set the new URL */
|
||||||
|
if(isset($resolver)) {
|
||||||
|
/* erase the old one */
|
||||||
|
$rewritingUrl = RewritingUrlQuery::create()->findOneByUrl($url);
|
||||||
|
$rewritingUrl->setView($this->getRewrittenUrlViewName())
|
||||||
|
->setViewId($this->getId())
|
||||||
|
->setViewLocale($locale)
|
||||||
|
->setRedirected(null)
|
||||||
|
->save()
|
||||||
|
;
|
||||||
|
|
||||||
|
/* erase additional arguments if any : only happens in case it erases a deprecated url */
|
||||||
|
RewritingArgumentQuery::create()->filterByRewritingUrl($rewritingUrl)->deleteAll();
|
||||||
|
} else {
|
||||||
|
/* just create it */
|
||||||
|
$rewritingUrl = new RewritingUrl();
|
||||||
|
$rewritingUrl->setUrl($url)
|
||||||
|
->setView($this->getRewrittenUrlViewName())
|
||||||
|
->setViewId($this->getId())
|
||||||
|
->setViewLocale($locale)
|
||||||
|
->save()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* deprecate the old one if needed */
|
||||||
|
$oldRewritingUrl = RewritingUrlQuery::create()->findOneByUrl($currentUrl);
|
||||||
|
$oldRewritingUrl->setRedirected($rewritingUrl->getId())->save();
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user