diff --git a/core/lib/Thelia/Action/Currency.php b/core/lib/Thelia/Action/Currency.php index 68cc5904a..7f9c3281f 100644 --- a/core/lib/Thelia/Action/Currency.php +++ b/core/lib/Thelia/Action/Currency.php @@ -107,6 +107,7 @@ class Currency extends BaseAction implements EventSubscriberInterface CurrencyQuery::create()->filterByByDefault(true)->update(array('ByDefault' => false)); $currency + ->setDispatcher($this->getDispatcher()) ->setByDefault($event->getIsDefault()) ->save() ; @@ -139,7 +140,7 @@ class Currency extends BaseAction implements EventSubscriberInterface $rates_url = ConfigQuery::read('currency_rate_update_url', 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml'); - $rate_data = file_get_contents($rates_url); + $rate_data = @file_get_contents($rates_url); if ($rate_data && $sxe = new \SimpleXMLElement($rate_data)) { @@ -149,12 +150,16 @@ class Currency extends BaseAction implements EventSubscriberInterface $rate = floatval($last['rate']); if (null !== $currency = CurrencyQuery::create()->findOneByCode($code)) { - $currency->setRate($rate)->save(); + $currency + ->setDispatcher($this->getDispatcher()) + ->setRate($rate) + ->save() + ; } } } else { - throw new \RuntimeException(sprintf("Failed to get currency rates data from URL %s", $url)); + throw new \RuntimeException(sprintf("Failed to get currency rates data from URL %s", $rates_url)); } } @@ -165,12 +170,18 @@ class Currency extends BaseAction implements EventSubscriberInterface */ public function updatePosition(CurrencyUpdatePositionEvent $event) { - if (null !== $category = CurrencyQuery::create()->findOneById($event->getObjectId())) { + if (null !== $currency = CurrencyQuery::create()->findOneById($event->getObjectId())) { - if ($event->getMode() == BaseChangePositionEvent::POSITION_ABSOLUTE) - return $category->changeAbsolutePosition($event->getPosition()); - else - return $this->exchangePosition($event->getMode()); + $currency->setDispatcher($this->getDispatcher()); + + $mode = $event->getMode(); + + if ($mode == CurrencyUpdatePositionEvent::POSITION_ABSOLUTE) + return $currency->changeAbsolutePosition($event->getPosition()); + else if ($mode == CurrencyUpdatePositionEvent::POSITION_UP) + return $currency->movePositionUp(); + else if ($mode == CurrencyUpdatePositionEvent::POSITION_DOWN) + return $currency->movePositionDown(); } } diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index ac652017c..313fb3a57 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -113,7 +113,7 @@ Thelia\Controller\Admin\CurrencyController::deleteAction - + Thelia\Controller\Admin\CurrencyController::updatePositionAction diff --git a/core/lib/Thelia/Controller/Admin/CurrencyController.php b/core/lib/Thelia/Controller/Admin/CurrencyController.php index caa3d1bed..56acfb89d 100644 --- a/core/lib/Thelia/Controller/Admin/CurrencyController.php +++ b/core/lib/Thelia/Controller/Admin/CurrencyController.php @@ -316,17 +316,22 @@ class CurrencyController extends BaseAdminController if (null !== $response = $this->checkAuth("admin.configuration.currencies.update")) return $response; try { - $id = $this->getRequest()->get('currency_id', 0); $mode = $this->getRequest()->get('mode', null); + + if ($mode == 'up') + $mode = CurrencyUpdatePositionEvent::POSITION_UP; + else if ($mode == 'down') + $mode = CurrencyUpdatePositionEvent::POSITION_DOWN; + else + $mode = CurrencyUpdatePositionEvent::POSITION_ABSOLUTE; + $position = $this->getRequest()->get('position', null); - $event = new CurrencyUpdatePositionEvent(); - - $event - ->setObjectId($this->getRequest()->get('currency_id', 0)) - ->setPosition($this->getRequest()->get('position', 0)) - ->setMode($mode) - ; + $event = new CurrencyUpdatePositionEvent( + $this->getRequest()->get('currency_id', null), + $mode, + $this->getRequest()->get('position', null) + ); $this->dispatch(TheliaEvents::CURRENCY_UPDATE_POSITION, $event); } diff --git a/core/lib/Thelia/Core/Event/BaseUpdatePositionEvent.php b/core/lib/Thelia/Core/Event/BaseUpdatePositionEvent.php index 3587a0757..41907c29c 100644 --- a/core/lib/Thelia/Core/Event/BaseUpdatePositionEvent.php +++ b/core/lib/Thelia/Core/Event/BaseUpdatePositionEvent.php @@ -74,14 +74,4 @@ class BaseUpdatePositionEvent extends ActionEvent $this->object_id = $object_id; return $this; } - - public function getObjectId() - { - return $this->object_id; - } - - public function setObjectId($object_id) - { - $this->object_id = $object_id; - } } diff --git a/core/lib/Thelia/Core/Event/CurrencyUpdatePositionEvent.php b/core/lib/Thelia/Core/Event/CurrencyUpdatePositionEvent.php index 655e24c9a..3a3dbb18f 100644 --- a/core/lib/Thelia/Core/Event/CurrencyUpdatePositionEvent.php +++ b/core/lib/Thelia/Core/Event/CurrencyUpdatePositionEvent.php @@ -23,6 +23,6 @@ namespace Thelia\Core\Event; -class CategoryChangePositionEvent extends BaseChangePositionEvent +class CurrencyUpdatePositionEvent extends BaseUpdatePositionEvent { } \ No newline at end of file diff --git a/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php b/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php index c5995e3de..fbb93440a 100755 --- a/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php +++ b/core/lib/Thelia/Core/Template/Assets/AsseticHelper.php @@ -106,17 +106,50 @@ class AsseticHelper $factory->setDebug($debug); - $factory->addWorker(new CacheBustingWorker()); + $factory->addWorker(new CacheBustingWorker('-')); - // Prepare the assets writer - $writer = new AssetWriter($output_path); + // We do not pass the filter list here, juste to get the asset file name + $asset = $factory->createAsset($asset_name); - $asset = $factory->createAsset($asset_name, $filter_list); + $asset_target_path = $asset->getTargetPath(); + $target_file = sprintf("%s/%s", $output_path, $asset_target_path); - $cache = new AssetCache($asset, new FilesystemCache($output_path)); + // As it seems that assetic cannot handle a real file cache, let's do the job ourselves. + // It works only if the CacheBustingWorker is used, as a new file name is generated for each version. + // + // the previous version of the file is deleted, by getting the first part of the ouput file name + // (the one before '-'), and delete aby file beginning with the same string. Example: + // old name: 3bc974a-dfacc1f.css + // new name: 3bc974a-ad3ef47.css + // + // before generating 3bc974a-ad3ef47.css, delete 3bc974a-* files. + // + if (! file_exists($target_file)) { - $writer->writeAsset($cache); + // Delete previous version of the file + list($commonPart, $dummy) = explode('-', $asset_target_path); - return rtrim($output_url, '/').'/'.$asset->getTargetPath(); + foreach (glob("$output_path/$commonPart-*") as $filename) { + @unlink($filename); + } + + // Apply filters now + foreach ($filter_list as $filter) { + if ('?' != $filter[0]) { + $asset->ensureFilter($fm->get($filter)); + } + elseif (!$debug) { + $asset->ensureFilter($fm->get(substr($filter, 1))); + } + } + + //$cache = new AssetCache($asset, new FilesystemCache($output_path)); + + $writer = new AssetWriter($output_path); + + $writer->writeAsset($asset); + } + + return rtrim($output_url, '/').'/'.$asset_target_path; } } diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php index fcea9ffd6..12ac13276 100644 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/AdminUtilities.php @@ -71,11 +71,11 @@ class AdminUtilities extends AbstractSmartyPlugin if ($permissions == null || $this->securityContext->isGranted("ADMIN", array($permission))) { return sprintf( '%s', - URL::getInstance()->absoluteUrl("$path/positionUp", array($url_parameter => $id)), + URL::getInstance()->absoluteUrl($path, array('mode' => 'up', $url_parameter => $id)), $in_place_edit_class, $id, $position, - URL::getInstance()->absoluteUrl("$path/positionDown", array($url_parameter => $id)) + URL::getInstance()->absoluteUrl($path, array('mode' => 'down', $url_parameter => $id)) ); } else { diff --git a/core/lib/Thelia/Model/Currency.php b/core/lib/Thelia/Model/Currency.php index 20c36782d..ef8d73735 100755 --- a/core/lib/Thelia/Model/Currency.php +++ b/core/lib/Thelia/Model/Currency.php @@ -20,6 +20,9 @@ class Currency extends BaseCurrency { { $this->dispatchEvent(TheliaEvents::BEFORE_CREATECURRENCY, new CurrencyEvent($this)); + // Set the current position for the new object + $this->setPosition($this->getNextPosition()); + return true; } diff --git a/core/lib/Thelia/Model/Tools/ModelEventDispatcherTrait.php b/core/lib/Thelia/Model/Tools/ModelEventDispatcherTrait.php index 7e2e34d83..17af1e44d 100644 --- a/core/lib/Thelia/Model/Tools/ModelEventDispatcherTrait.php +++ b/core/lib/Thelia/Model/Tools/ModelEventDispatcherTrait.php @@ -44,6 +44,11 @@ trait ModelEventDispatcherTrait { return $this; } + public function getDispatcher() + { + return $this->dispatcher; + } + protected function dispatchEvent($eventName, ActionEvent $event) { if (!is_null($this->dispatcher)) { diff --git a/core/lib/Thelia/Model/Tools/PositionManagementTrait.php b/core/lib/Thelia/Model/Tools/PositionManagementTrait.php index eccbb00dd..9e0b1f35c 100644 --- a/core/lib/Thelia/Model/Tools/PositionManagementTrait.php +++ b/core/lib/Thelia/Model/Tools/PositionManagementTrait.php @@ -25,6 +25,7 @@ namespace Thelia\Model\Tools; use Propel\Runtime\ActiveQuery\PropelQuery; use Propel\Runtime\ActiveQuery\Criteria; +use Propel\Runtime\Propel; trait PositionManagementTrait { @@ -48,13 +49,15 @@ trait PositionManagementTrait { /** * Get the position of the next inserted object */ - public function getNextPosition($parent) { + public function getNextPosition($parent = null) { - $last = $this->createQuery() - ->filterByParent($parent) + $query = $this->createQuery() ->orderByPosition(Criteria::DESC) - ->limit(1) - ->findOne() + ->limit(1); + + if ($parent !== null) $last->filterByParent($parent); + + $last = $query->findOne() ; return $last != null ? $last->getPosition() + 1 : 1; @@ -63,14 +66,14 @@ trait PositionManagementTrait { /** * Move up a object */ - protected function movePositionUp() { + public function movePositionUp() { $this->movePositionUpOrDown(true); } /** * Move down a object */ - protected function movePositionDown() { + public function movePositionDown() { $this->movePositionUpOrDown(false); } @@ -85,8 +88,9 @@ trait PositionManagementTrait { $my_position = $this->getPosition(); // Find object to exchange position with - $search = $this->createQuery() - ->filterByParent($this->getParent()); + $search = $this->createQuery(); + + if (method_exists($this, 'getParent')) $search->filterByParent($this->getParent()); // Up or down ? if ($up === true) { @@ -103,18 +107,17 @@ trait PositionManagementTrait { // If we found the proper object, exchange their positions if ($result) { - $cnx = Propel::getWriteConnection(CategoryTableMap::DATABASE_NAME); + $cnx = Propel::getWriteConnection($this->getDatabaseName()); $cnx->beginTransaction(); try { $this - ->setDispatcher($this->getDispatcher()) ->setPosition($result->getPosition()) ->save() ; - $result->setPosition($my_position)->save(); + $result->setDispatcher($this->getDispatcher())->setPosition($my_position)->save(); $cnx->commit(); } catch (Exception $e) { @@ -123,12 +126,22 @@ trait PositionManagementTrait { } } + /** + * Simply return the database name, from the constant in the MAP class. + */ + protected function getDatabaseName() { + // Find DATABASE_NAME constant + $mapClassName = self::TABLE_MAP; + + return $mapClassName::DATABASE_NAME; + } + /** * Changes object position * * @param newPosition */ - protected function changeAbsolutePosition($newPosition) + public function changeAbsolutePosition($newPosition) { // The current position $current_position = $this->getPosition(); @@ -136,7 +149,9 @@ trait PositionManagementTrait { if ($newPosition != null && $newPosition > 0 && $newPosition != $current_position) { // Find categories to offset - $search = $this->createQuery()->filterByParent($this->getParent()); + $search = $this->createQuery(); + + if (method_exists($this, 'getParent')) $search->filterByParent($this->getParent()); if ($newPosition > $current_position) { // The new position is after the current position -> we will offset + 1 all categories located between us and the new position @@ -152,17 +167,16 @@ trait PositionManagementTrait { $results = $search->find(); - $cnx = Propel::getWriteConnection(CategoryTableMap::DATABASE_NAME); + $cnx = Propel::getWriteConnection($this->getDatabaseName()); $cnx->beginTransaction(); try { foreach ($results as $result) { - $result->setPosition($result->getPosition() + $delta)->save($cnx); + $result->setDispatcher($this->getDispatcher())->setPosition($result->getPosition() + $delta)->save($cnx); } $this - ->setDispatcher($this->getDispatcher()) ->setPosition($newPosition) ->save($cnx) ; diff --git a/core/lib/Thelia/Tests/Action/ImageTest.php b/core/lib/Thelia/Tests/Action/ImageTest.php index 526f7cb86..8cc6e5644 100755 --- a/core/lib/Thelia/Tests/Action/ImageTest.php +++ b/core/lib/Thelia/Tests/Action/ImageTest.php @@ -37,7 +37,7 @@ use Thelia\Tools\URL; * * @package Thelia\Tests\Action\ImageTest */ -class ImageTest extends \PHPUnit_Framework_TestCase +class ImageTest extends \Thelia\Tests\TestCaseWithURLToolSetup { protected $request; @@ -49,10 +49,7 @@ class ImageTest extends \PHPUnit_Framework_TestCase $dispatcher = $this->getMock("Symfony\Component\EventDispatcher\EventDispatcherInterface"); - $url = new URL($container, 'dev'); - $container->set("event_dispatcher", $dispatcher); - $container->set("thelia.url.manager", $dispatcher); $request = new Request(); $request->setSession($this->session); diff --git a/core/lib/Thelia/Tests/Core/Template/Element/BaseLoopTestor.php b/core/lib/Thelia/Tests/Core/Template/Element/BaseLoopTestor.php index c4b0192bc..7d14fbbc5 100755 --- a/core/lib/Thelia/Tests/Core/Template/Element/BaseLoopTestor.php +++ b/core/lib/Thelia/Tests/Core/Template/Element/BaseLoopTestor.php @@ -34,7 +34,7 @@ use Thelia\Core\HttpFoundation\Session\Session; * @author Etienne Roudeix * */ -abstract class BaseLoopTestor extends \PHPUnit_Framework_TestCase +abstract class BaseLoopTestor extends \Thelia\Tests\TestCaseWithURLToolSetup { protected $request; protected $dispatcher; diff --git a/core/lib/Thelia/Tests/TestCaseWithURLToolSetup.php b/core/lib/Thelia/Tests/TestCaseWithURLToolSetup.php new file mode 100644 index 000000000..927f7cf62 --- /dev/null +++ b/core/lib/Thelia/Tests/TestCaseWithURLToolSetup.php @@ -0,0 +1,64 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Tests; + +/** + * This class provides URL Tool class initialisation + * + * @package Thelia\Tests\TestCaseWithURLSetup + */ +class TestCaseWithURLToolSetup extends \PHPUnit_Framework_TestCase { + + + public function __construct() { + $this->setupURLTool(); + } + + protected function setupURLTool() { + + $container = new \Symfony\Component\DependencyInjection\ContainerBuilder(); + + $context = new \Symfony\Component\Routing\RequestContext( + '/thelia/index.php', + 'GET', + 'localhost', + 'http', + 80, + 443, + '/path/to/action' + ); + + $router = $this->getMockBuilder("Symfony\Component\Routing\Router") + ->disableOriginalConstructor() + ->getMock(); + + $router->expects($this->any()) + ->method('getContext') + ->will($this->returnValue($context)); + + $container->set("router.admin", $router); + + new \Thelia\Tools\URL($container); + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Tests/Tools/URLTest.php b/core/lib/Thelia/Tests/Tools/URLTest.php index 0c99651b4..86804f5c0 100755 --- a/core/lib/Thelia/Tests/Tools/URLTest.php +++ b/core/lib/Thelia/Tests/Tools/URLTest.php @@ -28,10 +28,208 @@ use Thelia\Tools\URL; /** * * @author Etienne Roudeix + * @author Franck Allimant * */ class URLTest extends \PHPUnit_Framework_TestCase { + protected $context; + + public function setUp() + { + $container = new \Symfony\Component\DependencyInjection\ContainerBuilder(); + + $router = $this->getMockBuilder("Symfony\Component\Routing\Router") + ->disableOriginalConstructor() + ->getMock(); + + $this->context = new \Symfony\Component\Routing\RequestContext( + '/thelia/index.php', + 'GET', + 'localhost', + 'http', + 80, + 443, + '/path/to/action' + ); + + $router->expects($this->any()) + ->method('getContext') + ->will($this->returnValue($this->context)); + + $container->set("router.admin", $router); + + new \Thelia\Tools\URL($container); + } + + public function testGetIndexPage() { + + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->getIndexPage(); + $this->assertEquals('http://localhost/thelia/index.php', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->getIndexPage(); + $this->assertEquals('http://localhost/thelia/', $url); + + $this->context->setBaseUrl('/thelia'); + $url = \Thelia\Tools\URL::getInstance()->getIndexPage(); + $this->assertEquals('http://localhost/thelia', $url); + + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->getIndexPage(); + $this->assertEquals('http://localhost/', $url); + } + + public function testGetBaseUrl() { + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->getBaseUrl(); + $this->assertEquals('http://localhost/thelia/index.php', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->getBaseUrl(); + $this->assertEquals('http://localhost/thelia/', $url); + + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->getBaseUrl(); + $this->assertEquals('http://localhost/', $url); + } + + public function testAbsoluteUrl() { + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action'); + $this->assertEquals('http://localhost/path/to/action', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action'); + $this->assertEquals('http://localhost/thelia/path/to/action', $url); + + $this->context->setBaseUrl('/thelia'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action'); + $this->assertEquals('http://localhost/thelia/path/to/action', $url); + + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action'); + $this->assertEquals('http://localhost/thelia/index.php/path/to/action', $url); + } + + public function testAbsoluteUrlOnAbsolutePath() { + + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('http://myhost/path/to/action'); + $this->assertEquals('http://myhost/path/to/action', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('http://myhost/path/to/action'); + $this->assertEquals('http://myhost/path/to/action', $url); + + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('http://myhost/path/to/action'); + $this->assertEquals('http://myhost/path/to/action', $url); + } + + public function testAbsoluteUrlOnAbsolutePathWithParameters() { + + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('http://myhost/path/to/action', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://myhost/path/to/action?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('http://myhost/path/to/action', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://myhost/path/to/action?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('http://myhost/path/to/action', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://myhost/path/to/action?p1=v1&p2=v2', $url); + } + + public function testAbsoluteUrlOnAbsolutePathWithParametersAddParameters() { + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('http://myhost/path/to/action?p0=v0', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://myhost/path/to/action?p0=v0&p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('http://myhost/path/to/action?p0=v0', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://myhost/path/to/action?p0=v0&p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('http://myhost/path/to/action?p0=v0', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://myhost/path/to/action?p0=v0&p1=v1&p2=v2', $url); + } + + public function testAbsoluteUrlWithParameters() { + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://localhost/thelia/index.php/path/to/action?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://localhost/thelia/path/to/action?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/thelia'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://localhost/thelia/path/to/action?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/thelia'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('path/to/action', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://localhost/thelia/path/to/action?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://localhost/path/to/action?p1=v1&p2=v2', $url); + } + + public function testAbsoluteUrlPathOnly() { + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action', array(), URL::PATH_TO_FILE); + $this->assertEquals('http://localhost/thelia/path/to/action', $url); + } + + public function testAbsoluteUrlPathOnlyWithParameters() { + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action', array("p1" => "v1", "p2" => "v2"), URL::PATH_TO_FILE); + $this->assertEquals('http://localhost/thelia/path/to/action?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action', array("p1" => "v1", "p2" => "v2"), URL::PATH_TO_FILE); + $this->assertEquals('http://localhost/thelia/path/to/action?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/path/to/action', array("p1" => "v1", "p2" => "v2"), URL::PATH_TO_FILE); + $this->assertEquals('http://localhost/path/to/action?p1=v1&p2=v2', $url); + + } + + public function testAbsoluteUrlFromIndexWithParameters() { + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://localhost/thelia/index.php/?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://localhost/thelia/?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/', array("p1" => "v1", "p2" => "v2")); + $this->assertEquals('http://localhost/?p1=v1&p2=v2', $url); + + } + + public function testAbsoluteUrlPathOnlyFromIndexWithParameters() { + $this->context->setBaseUrl('/thelia/index.php'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/', array("p1" => "v1", "p2" => "v2"), URL::PATH_TO_FILE); + $this->assertEquals('http://localhost/thelia/?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/thelia/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/', array("p1" => "v1", "p2" => "v2"), URL::PATH_TO_FILE); + $this->assertEquals('http://localhost/thelia/?p1=v1&p2=v2', $url); + + $this->context->setBaseUrl('/'); + $url = \Thelia\Tools\URL::getInstance()->absoluteUrl('/', array("p1" => "v1", "p2" => "v2"), URL::PATH_TO_FILE); + $this->assertEquals('http://localhost/?p1=v1&p2=v2', $url); + + } + public function testRetrieve() { diff --git a/core/lib/Thelia/Tools/URL.php b/core/lib/Thelia/Tools/URL.php index f234f9086..152f82895 100755 --- a/core/lib/Thelia/Tools/URL.php +++ b/core/lib/Thelia/Tools/URL.php @@ -27,33 +27,30 @@ use Thelia\Model\ConfigQuery; use Thelia\Rewriting\RewritingResolver; use Thelia\Rewriting\RewritingRetriever; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Thelia\Core\HttpFoundation\Request; -use Symfony\Component\DependencyInjection\ContainerAware; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\Routing\RequestContext; class URL { protected $resolver = null; protected $retriever = null; - protected $container; - protected $environment; + protected $requestContext; const PATH_TO_FILE = true; const WITH_INDEX_PAGE = false; - private static $instance = null; + protected static $instance = null; - public function __construct(ContainerInterface $container, $environment) + public function __construct(ContainerInterface $container) { // Allow singleton style calls once intanciated. // For this to work, the URL service has to be instanciated very early. This is done manually // in TheliaHttpKernel, by calling $this->container->get('thelia.url.manager'); self::$instance = $this; - $this->container = $container; - $this->environment = $environment; + $this->requestContext = $container->get('router.admin')->getContext(); $this->retriever = new RewritingRetriever(); $this->resolver = new RewritingResolver(); @@ -79,49 +76,31 @@ class URL */ public function getBaseUrl() { - $request = $this->container->get('request'); - $lang = $request->getSession()->getLang(); + if ($host = $this->requestContext->getHost()) { - // Check if we have a specific URL for each lang. - $one_domain_foreach_lang = ConfigQuery::read("one_domain_foreach_lang", false); + $scheme = $this->requestContext->getScheme(); - if ($one_domain_foreach_lang == true) { - // If it's the case, get the current lang URL - $base_url = $lang->getUrl(); + $port = ''; - $err_msg_part = 'base_url'; - } - else { - // Get the base URL - $base_url = ConfigQuery::read('base_url', $request->getSchemeAndHttpHost()); + if ('http' === $scheme && 80 != $this->requestContext->getHttpPort()) { + $port = ':'.$this->requestContext->getHttpPort(); + } elseif ('https' === $scheme && 443 != $this->requestContext->getHttpsPort()) { + $port = ':'.$this->requestContext->getHttpsPort(); + } - $err_msg_part = sprintf('base_url for lang %s', $lang->getCode()); + $schemeAuthority = "$scheme://$host"."$port"; } - // Be sure that base-url starts with http, give up if it's not the case. - if (substr($base_url, 0, 4) != 'http') { - throw new \InvalidArgumentException( - sprintf("The %s configuration parameter shoud contains the URL of your shop, starting with http or https.", $err_msg_part)); - } - - // Normalize the base_url - return rtrim($base_url, '/').'/'; + return $schemeAuthority.$this->requestContext->getBaseUrl(); } /** - * @return string the index page, which is basically the base_url in prod environment. + * @return string the index page, which is in fact the base URL. */ public function getIndexPage() { - // Get the base URL - $base_url = $this->getBaseUrl(); - - // For dev environment, add the proper page. - if ($this->environment == 'dev') { - $base_url .= "index_dev.php"; - } - - return $base_url; + // The index page is the base URL :) + return $this->getBaseUrl(); } /** @@ -140,14 +119,16 @@ class URL // Already absolute ? if (substr($path, 0, 4) != 'http') { - /** - * @etienne : can't be done here for it's already done in ::viewUrl / ::adminViewUrl - * @franck : should be done, as absoluteUrl() is sometimes called directly (see UrlGenerator::generateUrlFunction()) - */ - $root = $path_only == self::PATH_TO_FILE ? $this->getBaseUrl() : $this->getIndexPage(); + $base_url = $this->getBaseUrl(); - // Normalize root path - $base = rtrim($root, '/') . '/' . ltrim($path, '/'); + // If only a path is requested, be sure to remove the script name (index.php or index_dev.php), if any. + if ($path_only == self::PATH_TO_FILE) { + // As the base_url always ends with '/', if we don't find / at the end, we have a script. + if (substr($base_url, -1) != '/') $base_url = dirname($base_url); + } + + // Normalize the given path + $base = rtrim($base_url, '/') . '/' . ltrim($path, '/'); } else $base = $path; diff --git a/templates/admin/default/assets/less/main.less b/templates/admin/default/assets/less/main.less index 7ad14e013..862810f6d 100644 --- a/templates/admin/default/assets/less/main.less +++ b/templates/admin/default/assets/less/main.less @@ -3,4 +3,6 @@ /* Thelia Admin */ @import "thelia/thelia.less"; -// @import "thelia/responsive.less"; \ No newline at end of file +// @import "thelia/responsive.less"; + +//mmm \ No newline at end of file diff --git a/templates/admin/default/currencies.html b/templates/admin/default/currencies.html index 550c8b973..7a8eff05d 100644 --- a/templates/admin/default/currencies.html +++ b/templates/admin/default/currencies.html @@ -28,7 +28,7 @@ {intl l='Currencies'} {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.currencies.create"} - + @@ -114,7 +114,7 @@ {intl l='Actions'} - + {loop name="currencies" type="currency" backend_context="1" lang=$lang_id order=$order} @@ -138,7 +138,7 @@ {admin_position_block permission="admin.currencies.edit" - path="/admin/configuration/currencies" + path="/admin/configuration/currencies/update-position" url_parameter="currency_id" in_place_edit_class="currencyPositionChange" position="$POSITION" @@ -186,6 +186,7 @@ + {module_include location='currencies_bottom'} @@ -216,19 +217,15 @@ {/form_field} - {* We do not allow users to create secured currencies from here *} -