diff --git a/core/lib/Thelia/Core/Event/GenerateRewrittenUrlEvent.php b/core/lib/Thelia/Core/Event/GenerateRewrittenUrlEvent.php new file mode 100644 index 000000000..7ee22cddd --- /dev/null +++ b/core/lib/Thelia/Core/Event/GenerateRewrittenUrlEvent.php @@ -0,0 +1,60 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Event; + + +/** + * Class GenerateRewrittenUrlEvent + * @package Thelia\Core\Event + * @author Manuel Raynaud + */ +class GenerateRewrittenUrlEvent extends ActionEvent { + + protected $object; + protected $locale; + + protected $url; + + public function __construct($object, $locale) + { + $this->object; + $this->locale; + } + + public function setUrl($url) + { + $this->url = $url; + } + + public function isRewritten() + { + return null !== $this->url; + } + + public function getUrl() + { + return $this->url; + } + +} \ No newline at end of file diff --git a/core/lib/Thelia/Core/Event/TheliaEvents.php b/core/lib/Thelia/Core/Event/TheliaEvents.php index dab2db208..6a024f33b 100755 --- a/core/lib/Thelia/Core/Event/TheliaEvents.php +++ b/core/lib/Thelia/Core/Event/TheliaEvents.php @@ -441,4 +441,9 @@ final class TheliaEvents */ const MAILTRANSPORTER_CONFIG = 'action.mailertransporter.config'; + /** + * sent when Thelia try to generate a rewriten url + */ + const GENERATE_REWRITTENURL = 'action.generate_rewritenurl'; + } diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/UrlGenerator.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/UrlGenerator.php index 56c853d00..aa96a0014 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/UrlGenerator.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/UrlGenerator.php @@ -27,6 +27,7 @@ use Thelia\Core\Template\Smarty\SmartyPluginDescriptor; use Thelia\Core\Template\Smarty\AbstractSmartyPlugin; use Thelia\Tools\URL; use Thelia\Core\HttpFoundation\Request; +use Thelia\Core\Translation\Translator; class UrlGenerator extends AbstractSmartyPlugin { @@ -47,11 +48,27 @@ class UrlGenerator extends AbstractSmartyPlugin public function generateUrlFunction($params, &$smarty) { // the path to process - $path = $this->getParam($params, 'path'); + $path = $this->getParam($params, 'path', null); + $file = $this->getParam($params, 'file', null); + + if ($file !== null) { + $path = $file; + $mode = URL::PATH_TO_FILE; + } + else if ($path !== null) { + $mode = URL::WITH_INDEX_PAGE; + } + else { + throw \InvalidArgumentException(Translator::getInstance()->trans("Please specify either 'path' or 'file' parameter in {url} function.")); + } $target = $this->getParam($params, 'target', null); - $url = URL::getInstance()->absoluteUrl($path, $this->getArgsFromParam($params, array('path', 'target'))); + $url = URL::getInstance()->absoluteUrl( + $path, + $this->getArgsFromParam($params, array('path', 'file', 'target')), + $mode + ); if ($target != null) $url .= '#'.$target; diff --git a/core/lib/Thelia/Model/ConfigQuery.php b/core/lib/Thelia/Model/ConfigQuery.php index 7df592fd2..7f65b103d 100755 --- a/core/lib/Thelia/Model/ConfigQuery.php +++ b/core/lib/Thelia/Model/ConfigQuery.php @@ -56,9 +56,15 @@ class ConfigQuery extends BaseConfigQuery { public static function getPageNotFoundView() { - return self::read("page_not_found_view", '404.html'); + return self::read("page_not_found_view", '404'); } + public static function getPassedUrlView() + { + return self::read('passed_url_view', 'passed-url'); + } + + public static function getActiveTemplate() { return self::read('active-template', 'default'); diff --git a/core/lib/Thelia/Model/Product.php b/core/lib/Thelia/Model/Product.php index 825668cd0..cbb6c0051 100755 --- a/core/lib/Thelia/Model/Product.php +++ b/core/lib/Thelia/Model/Product.php @@ -200,6 +200,12 @@ class Product extends BaseProduct */ public function postDelete(ConnectionInterface $con = null) { + RewritingUrlQuery::create() + ->filterByView($this->getRewrittenUrlViewName()) + ->filterByViewId($this->getId()) + ->update(array( + "View" => ConfigQuery::getPassedUrlView() + )); $this->dispatchEvent(TheliaEvents::AFTER_DELETEPRODUCT, new ProductEvent($this)); } } diff --git a/core/lib/Thelia/Model/Tools/UrlRewritingTrait.php b/core/lib/Thelia/Model/Tools/UrlRewritingTrait.php index 182dbcaf3..19947efa6 100644 --- a/core/lib/Thelia/Model/Tools/UrlRewritingTrait.php +++ b/core/lib/Thelia/Model/Tools/UrlRewritingTrait.php @@ -23,6 +23,8 @@ namespace Thelia\Model\Tools; +use Thelia\Core\Event\GenerateRewrittenUrlEvent; +use Thelia\Core\Event\TheliaEvents; use Thelia\Exception\UrlRewritingException; use Thelia\Model\RewritingUrlQuery; use Thelia\Model\RewritingUrl; @@ -61,7 +63,21 @@ trait UrlRewritingTrait { $this->setLocale($locale); - $title = $this->getTitle() ?: $this->getRef(); + $generateEvent = new GenerateRewrittenUrlEvent($this, $locale); + + $this->dispatchEvent(TheliaEvents::GENERATE_REWRITTENURL, $generateEvent); + + + if($generateEvent->isRewritten()) + { + return $generateEvent->getUrl(); + } + + $title = $this->getTitle(); + + if(null == $title) { + throw new \RuntimeException('Impossible to create an url if title is null'); + } // Replace all weird characters with dashes $string = preg_replace('/[^\w\-~_\.]+/u', '-', $title); @@ -104,7 +120,7 @@ trait UrlRewritingTrait { ->filterByViewLocale($locale) ->filterByView($this->getRewrittenUrlViewName()) ->filterByViewId($this->getId()) - ->filterByRedirected(0) + ->filterByRedirected(null) ->findOne() ; diff --git a/core/lib/Thelia/Tests/Rewriting/BaseRewritingObject.php b/core/lib/Thelia/Tests/Rewriting/BaseRewritingObject.php new file mode 100644 index 000000000..449a9162d --- /dev/null +++ b/core/lib/Thelia/Tests/Rewriting/BaseRewritingObject.php @@ -0,0 +1,108 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Tests\Rewriting; + + +/** + * Class BaseRewritingObject + * @package Thelia\Tests\Rewriting + * @author Manuel Raynaud + */ +abstract class BaseRewritingObject extends \PHPUnit_Framework_TestCase +{ + + /** + * @return mixed an instance of Product, Folder, Content or Category Model + */ + abstract function getObject(); + + /** + * @covers Thelia\Model\Tools\UrlRewritingTrait::generateRewrittenUrl + */ + public function testSimpleFrenchRewrittenUrl() + { + $object = $this->getObject(); + $object->setVisible(1) + ->setPosition(1) + ->setLocale('fr_FR') + ->setTitle('Mon super titre en français') + ->save(); + + $this->assertRegExp('/^mon-super-titre-en-français(-[0-9]+)?\.html$/', $object->getRewrittenUrl('fr_FR')); + + $rewrittenUrl = $object->generateRewrittenUrl('fr_FR'); + $this->assertNotNull($rewrittenUrl, "rewritten url can not be null"); + $this->assertRegExp('/^mon-super-titre-en-français(-[0-9]+)?\.html$/', $rewrittenUrl); + //mon-super-titre-en-français-2.html + + $object->delete(); + } + + /** + * @covers Thelia\Model\Tools\UrlRewritingTrait::generateRewrittenUrl + */ + public function testSimpleEnglishRewrittenUrl() + { + $object = $this->getObject(); + $object->setVisible(1) + ->setPosition(1) + ->setLocale('en_US') + ->setTitle('My english super Title') + ->save(); + + $this->assertRegExp('/^my-english-super-title(-[0-9]+)?\.html$/', $object->getRewrittenUrl('en_US')); + + $rewrittenUrl = $object->generateRewrittenUrl('en_US'); + $this->assertNotNull($rewrittenUrl, "rewritten url can not be null"); + $this->assertRegExp('/^my-english-super-title(-[0-9]+)?\.html$/', $rewrittenUrl); + + $object->delete(); + } + + /** + * @covers Thelia\Model\Tools\UrlRewritingTrait::generateRewrittenUrl + * @expectedException \RuntimeException + * @expectedExceptionMessage Impossible to create an url if title is null + */ + public function testRewrittenWithoutTitle() + { + $object = $this->getObject(); + $object->setVisible(1) + ->setPosition(1) + ->setLocale('en_US') + ->setDescription('My english super Description') + ->save(); + } + + /** + * @covers Thelia\Model\Tools\UrlRewritingTrait::generateRewrittenUrl + * @expectedException \RuntimeException + */ + public function testOnNotSavedObject() + { + $object = $this->getObject(); + + $object->generateRewrittenUrl('fr_FR'); + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Tests/Rewriting/CategoryRewritingTest.php b/core/lib/Thelia/Tests/Rewriting/CategoryRewritingTest.php new file mode 100644 index 000000000..247fdc8a9 --- /dev/null +++ b/core/lib/Thelia/Tests/Rewriting/CategoryRewritingTest.php @@ -0,0 +1,43 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Tests\Rewriting; +use Thelia\Model\Category; + + +/** + * Class CategoryRewritingTest + * @package Thelia\Tests\Rewriting + * @author Manuel Raynaud + */ +class CategoryRewritingTest extends BaseRewritingObject +{ + + /** + * @return \Thelia\Model\Category + */ + function getObject() + { + return new Category(); + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Tests/Rewriting/ContentRewritingTest.php b/core/lib/Thelia/Tests/Rewriting/ContentRewritingTest.php new file mode 100644 index 000000000..e06ff62b2 --- /dev/null +++ b/core/lib/Thelia/Tests/Rewriting/ContentRewritingTest.php @@ -0,0 +1,43 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Tests\Rewriting; +use Thelia\Model\Content; + + +/** + * Class ContentRewritingTest + * @package Thelia\Tests\Rewriting + * @author Manuel Raynaud + */ +class ContentRewritingTest extends BaseRewritingObject +{ + + /** + * @return \Thelia\Model\Content + */ + function getObject() + { + return new Content(); + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Tests/Rewriting/FolderRewritingTest.php b/core/lib/Thelia/Tests/Rewriting/FolderRewritingTest.php new file mode 100644 index 000000000..db0dbc897 --- /dev/null +++ b/core/lib/Thelia/Tests/Rewriting/FolderRewritingTest.php @@ -0,0 +1,43 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Tests\Rewriting; +use Thelia\Model\Folder; + + +/** + * Class FolderRewritingTest + * @package Thelia\Tests\Rewriting + * @author Manuel Raynaud + */ +class FolderRewritingTest extends BaseRewritingObject +{ + + /** + * @return mixed an instance of Product, Folder, Content or Category Model + */ + function getObject() + { + return new Folder(); + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Tests/Rewriting/ProductRewriteTest.php b/core/lib/Thelia/Tests/Rewriting/ProductRewriteTest.php index b6601289d..2bff1bf5c 100644 --- a/core/lib/Thelia/Tests/Rewriting/ProductRewriteTest.php +++ b/core/lib/Thelia/Tests/Rewriting/ProductRewriteTest.php @@ -31,59 +31,14 @@ use Thelia\Model\ProductQuery; * @package Thelia\Tests\Rewriting * @author Manuel Raynaud */ -class ProductRewriteTest extends \PHPUnit_Framework_TestCase +class ProductRewriteTest extends BaseRewritingObject { - protected static $productId; - - public static function setUpBeforeClass() - { - $product = new Product(); - $product->setRef(sprintf("TestRewrittenProduct%s",uniqid())) - ->setPosition(1) - ->setVisible(1) - ->setLocale('en_US') - ->setTitle('My english super Title') - ->setLocale('fr_FR') - ->setTitle('Mon super titre en français') - ->save(); - - self::$productId = $product->getId(); - } /** - * @covers Thelia\Model\Tools\UrlRewritingTrait::generateRewrittenUrl + * @return mixed an instance of Product, Folder, Content or Category Model */ - public function testFrenchRewrittenUrl() + function getObject() { - $product = ProductQuery::create()->findPk(self::$productId); - - $rewrittenUrl = $product->generateRewrittenUrl('fr_FR'); - $this->assertNotNull($rewrittenUrl, "rewritten url can not be null"); - $this->assertRegExp('/^mon-super-titre-en-français(-[0-9]+)?\.html$/', $rewrittenUrl); - //mon-super-titre-en-français-2.html - } - - /** - * @covers Thelia\Model\Tools\UrlRewritingTrait::generateRewrittenUrl - */ - public function testEnglishRewrittenUrl() - { - $product = ProductQuery::create()->findPk(self::$productId); - - $rewrittenUrl = $product->generateRewrittenUrl('en_US'); - $this->assertNotNull($rewrittenUrl, "rewritten url can not be null"); - $this->assertRegExp('/^my-english-super-title(-[0-9]+)?\.html$/', $rewrittenUrl); - } - - /** - * @covers Thelia\Model\Tools\UrlRewritingTrait::generateRewrittenUrl - * @expectedException \RuntimeException - * @expectedExceptionMessage Object product must be saved before generating url - */ - public function testOnNotSavedProduct() - { - $product = new Product(); - - $product->generateRewrittenUrl('fr_FR'); + return new Product(); } } \ No newline at end of file diff --git a/install/insert.sql b/install/insert.sql index 79bef3731..9680abd28 100755 --- a/install/insert.sql +++ b/install/insert.sql @@ -19,7 +19,8 @@ INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updat ('image_cache_dir_from_web_root', 'cache/images', 0, 0, NOW(), NOW()), ('document_cache_dir_from_web_root', 'cache/documents', 0, 0, NOW(), NOW()), ('currency_rate_update_url', 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml', 0, 0, NOW(), NOW()), -('page_not_found_view', '404.html', 0, 0, NOW(), NOW()), +('page_not_found_view', '404', 0, 0, NOW(), NOW()), +('passed_url_view', 'passed-url', 0, 0, NOW(), NOW()), ('use_tax_free_amounts', 0, 0, 0, NOW(), NOW()), ('process_assets', '1', 0, 0, NOW(), NOW()), ('thelia_admin_remember_me_cookie_name', 'tarmcn', 0, 0, NOW(), NOW()), diff --git a/templates/admin/default/home.html b/templates/admin/default/home.html index c196ebbe4..c5683620f 100755 --- a/templates/admin/default/home.html +++ b/templates/admin/default/home.html @@ -7,7 +7,7 @@
{module_include location='home_top'} - +
@@ -17,8 +17,8 @@
-
- +
+
@@ -26,11 +26,11 @@ -
+

- +
@@ -42,7 +42,7 @@
- +
@@ -91,10 +91,10 @@ 0 - +
- +
{intl l="Sales statistics"}
@@ -138,7 +138,7 @@ 25.00 € - +
@@ -206,7 +206,7 @@ -
25.00 €
+
@@ -230,7 +230,7 @@ {intl l="Click here"} - + @@ -245,7 +245,7 @@ {javascripts file='assets/js/jqplot/jquery.jqplot.min.js'} - + {javascripts file='assets/js/jqplot/plugins/jqplot.highlighter.min.js'} {/javascripts} @@ -259,19 +259,19 @@