diff --git a/admin-dev/functions.php b/admin-dev/functions.php index a68793d76..a8ccfa83a 100644 --- a/admin-dev/functions.php +++ b/admin-dev/functions.php @@ -75,7 +75,6 @@ function includeDatepicker($id, $time = false) function rewriteSettingsFile($baseUrls = NULL, $theme = NULL, $arrayDB = NULL) { $defines = array(); - $defines['_PS_DIRECTORY_'] = ($baseUrls AND $baseUrls['_PS_DIRECTORY_']) ? $baseUrls['_PS_DIRECTORY_'] : _PS_DIRECTORY_; $defines['_MEDIA_SERVER_1_'] = ($baseUrls AND isset($baseUrls['_MEDIA_SERVER_1_'])) ? $baseUrls['_MEDIA_SERVER_1_'] : _MEDIA_SERVER_1_; $defines['_MEDIA_SERVER_2_'] = ($baseUrls AND isset($baseUrls['_MEDIA_SERVER_2_'])) ? $baseUrls['_MEDIA_SERVER_2_'] : _MEDIA_SERVER_2_; $defines['_MEDIA_SERVER_3_'] = ($baseUrls AND isset($baseUrls['_MEDIA_SERVER_3_'])) ? $baseUrls['_MEDIA_SERVER_3_'] : _MEDIA_SERVER_3_; diff --git a/admin-dev/init.php b/admin-dev/init.php index a2a479631..63e58134f 100644 --- a/admin-dev/init.php +++ b/admin-dev/init.php @@ -34,8 +34,7 @@ if (isset($_GET['logout'])) if (!$cookie->isLoggedBack()) { - $destination = substr($_SERVER['REQUEST_URI'], strlen(dirname($_SERVER['SCRIPT_NAME'])) + 1); - Tools::redirectAdmin('login.php'.(empty($destination) || ($destination == 'index.php?logout') ? '' : '?redirect='.$destination)); + Tools::redirectAdmin('login.php?redirect='.$_SERVER['REQUEST_URI']); } // Set current index diff --git a/admin-dev/login.php b/admin-dev/login.php index e2ff575f5..34550de3b 100644 --- a/admin-dev/login.php +++ b/admin-dev/login.php @@ -51,10 +51,8 @@ if ((empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) == 'off') .'https://'.Tools::getServerName().$_SERVER['REQUEST_URI'].''; } -$cookie = new Cookie('psAdmin', substr($_SERVER['PHP_SELF'], strlen(__PS_BASE_URI__), -10)); -if (!isset($cookie->id_lang)) - $cookie->id_lang = Configuration::get('PS_LANG_DEFAULT'); -$iso = strtolower(Language::getIsoById((int)($cookie->id_lang))); +$cookie = Context::getContext()->cookie; +$iso = strtolower(Language::getIsoById(Context::getContext()->language->id)); include(_PS_TRANSLATIONS_DIR_.$iso.'/admin.php'); include(_PS_TRANSLATIONS_DIR_.$iso.'/errors.php'); diff --git a/admin-dev/tabs/AdminLanguages.php b/admin-dev/tabs/AdminLanguages.php index 0030353f9..636d5c42d 100644 --- a/admin-dev/tabs/AdminLanguages.php +++ b/admin-dev/tabs/AdminLanguages.php @@ -38,17 +38,19 @@ class AdminLanguages extends AdminTab $this->fieldImageSettings = array(array('name' => 'flag', 'dir' => 'l'), array('name' => 'no-picture', 'dir' => 'p')); $this->fieldsDisplay = array( - 'id_lang' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), - 'flag' => array('title' => $this->l('Logo'), 'align' => 'center', 'image' => 'l', 'orderby' => false, 'search' => false), - 'name' => array('title' => $this->l('Name'), 'width' => 120), - 'iso_code' => array('title' => $this->l('ISO code'), 'width' => 70, 'align' => 'center'), - 'language_code' => array('title' => $this->l('Language code'), 'width' => 70, 'align' => 'center'), - 'active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool')); + 'id_lang' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'flag' => array('title' => $this->l('Logo'), 'align' => 'center', 'image' => 'l', 'orderby' => false, 'search' => false), + 'name' => array('title' => $this->l('Name'), 'width' => 120), + 'iso_code' => array('title' => $this->l('ISO code'), 'width' => 70, 'align' => 'center'), + 'language_code' => array('title' => $this->l('Language code'), 'width' => 70, 'align' => 'center'), + 'active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool'), + ); $this->optionTitle = $this->l('Languages options'); $this->_fieldsOptions = array( - 'PS_LANG_DEFAULT' => array('title' => $this->l('Default language:'), 'desc' => $this->l('The default language used in shop'), 'cast' => 'intval', 'type' => 'select', 'identifier' => 'id_lang', 'list' => Language::getlanguages(false)), + 'PS_LANG_DEFAULT' => array('title' => $this->l('Default language:'), 'desc' => $this->l('The default language used in shop'), 'cast' => 'intval', 'type' => 'select', 'identifier' => 'id_lang', 'list' => Language::getlanguages(false)), ); + $this->_group = 'GROUP BY a.id_lang'; parent::__construct(); } diff --git a/admin-dev/tabs/AdminPreferences.php b/admin-dev/tabs/AdminPreferences.php index c81d3d183..87d169947 100644 --- a/admin-dev/tabs/AdminPreferences.php +++ b/admin-dev/tabs/AdminPreferences.php @@ -172,7 +172,7 @@ class AdminPreferences extends AdminTab { $languages = Language::getLanguages(false); - Tools::clearCache($smarty); + Tools::clearCache($this->context->smarty); /* Check required fields */ foreach ($fields AS $field => $values) @@ -289,7 +289,6 @@ class AdminPreferences extends AdminTab else $tab[$key] = Tools::getValue($key, Configuration::get($key)); } - $tab['_PS_DIRECTORY_'] = _PS_DIRECTORY_; $tab['_MEDIA_SERVER_1_'] = _MEDIA_SERVER_1_; $tab['_MEDIA_SERVER_2_'] = _MEDIA_SERVER_2_; $tab['_MEDIA_SERVER_3_'] = _MEDIA_SERVER_3_; diff --git a/admin-dev/tabs/AdminShopUrl.php b/admin-dev/tabs/AdminShopUrl.php index f69ef3744..4349af5aa 100755 --- a/admin-dev/tabs/AdminShopUrl.php +++ b/admin-dev/tabs/AdminShopUrl.php @@ -34,19 +34,19 @@ class AdminShopUrl extends AdminTab $this->className = 'ShopUrl'; $this->edit = true; $this->delete = true; - $this->_select = 's.name shop_name'; + $this->_select = 's.name AS shop_name, CONCAT(a.physical_uri, a.virtual_uri) AS uri'; $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'shop` s ON (s.id_shop = a.id_shop)'; $this->_listSkipDelete = array(1); $this->fieldsDisplay = array( - 'id_shop_url' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), - 'domain' => array('title' => $this->l('Domain'), 'width' => 130, 'filter_key' => 'domain'), - 'domain_ssl' => array('title' => $this->l('Domain SSL'), 'width' => 130, 'filter_key' => 'domain'), - 'uri' => array('title' => $this->l('Uri'), 'width' => 130, 'filter_key' => 'uri'), - 'shop_name' => array('title' => $this->l('Shop name'), 'width' => 70), - 'main' => array('title' => $this->l('Main URL'), 'align' => 'center', 'activeVisu' => 'main', 'type' => 'bool', 'orderby' => false, 'filter_key' => 'main'), - 'active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false, 'filter_key' => 'active')); - $this->_fieldsOptions = array('_PS_DIRECTORY_' => array('title' => $this->l('PS directory'), 'desc' => $this->l('Name of the PrestaShop directory on your Web server, bracketed by forward slashes (e.g., /shop/)'), 'validation' => 'isUrl', 'type' => 'text', 'size' => 20, 'default' => _PS_DIRECTORY_, 'visibility' => Shop::CONTEXT_ALL)); + 'id_shop_url' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'domain' => array('title' => $this->l('Domain'), 'width' => 130, 'filter_key' => 'domain'), + 'domain_ssl' => array('title' => $this->l('Domain SSL'), 'width' => 130, 'filter_key' => 'domain'), + 'uri' => array('title' => $this->l('Uri'), 'width' => 130, 'filter_key' => 'uri'), + 'shop_name' => array('title' => $this->l('Shop name'), 'width' => 70), + 'main' => array('title' => $this->l('Main URL'), 'align' => 'center', 'activeVisu' => 'main', 'type' => 'bool', 'orderby' => false, 'filter_key' => 'main'), + 'active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false, 'filter_key' => 'active'), + ); parent::__construct(); } @@ -66,15 +66,6 @@ class AdminShopUrl extends AdminTab Tools::generateHtaccess(dirname(__FILE__).'/../../.htaccess', Configuration::get('PS_REWRITING_SETTINGS'), Configuration::get('PS_HTACCESS_CACHE_CONTROL'), Configuration::get('PS_HTACCESS_SPECIFIC')); } - - if (Tools::isSubmit('submitOptions'.$this->table)) - { - $baseUrls = array(); - if ($_PS_DIRECTORY_ = Tools::getValue('_PS_DIRECTORY_')) - $baseUrls['_PS_DIRECTORY_'] = $_PS_DIRECTORY_; - rewriteSettingsFile($baseUrls, NULL, NULL); - unset($this->_fieldsGeneral['_PS_DIRECTORY_']); - } return parent::postProcess(); } @@ -90,6 +81,30 @@ class AdminShopUrl extends AdminTab if (!($obj = $this->loadObject(true))) return; + + echo << + // + +EOF; echo ' @@ -103,11 +118,20 @@ class AdminShopUrl extends AdminTab - '.$this->l('URI').' + '.$this->l('Physical URI').' - + '.$this->l('Folder of your store ex: ipods for http://yourshopname.com/ipods/, leave empty if no folder.').''.$this->l('URL Rewrite must be activated to use this feature.').' + '.$this->l('Virtual URI').' + + + '.$this->l('Folder of your store ex: ipods for http://yourshopname.com/ipods/, leave empty if no folder.').''.$this->l('URL Rewrite must be activated to use this feature.').' + + '.$this->l('Your final URL will be').' + + + '.$this->l('Shop').' '; diff --git a/classes/Cart.php b/classes/Cart.php index d074b3a7a..83581769c 100644 --- a/classes/Cart.php +++ b/classes/Cart.php @@ -1167,7 +1167,7 @@ class CartCore extends ObjectModel $id_carrier = Configuration::get('PS_CARRIER_DEFAULT'); if (!isset(self::$_carriers[$id_carrier])) - self::$_carriers[$id_carrier] = new Carrier((int)($id_carrier), Configuration::get('PS_LANG_DEFAULT')); + self::$_carriers[$id_carrier] = new Carrier($id_carrier, Configuration::get('PS_LANG_DEFAULT')); $carrier = self::$_carriers[$id_carrier]; if (!Validate::isLoadedObject($carrier)) die(Tools::displayError('Fatal error: "no default carrier"')); diff --git a/classes/Cookie.php b/classes/Cookie.php index 7766d8125..1228f3dfd 100644 --- a/classes/Cookie.php +++ b/classes/Cookie.php @@ -64,7 +64,7 @@ class CookieCore $this->_content = array(); $this->_expire = isset($expire) ? (int)($expire) : (time() + 1728000); $this->_name = md5($name); - $this->_path = trim(__PS_BASE_URI__.$path, '/\\').'/'; + $this->_path = trim(Context::getContext()->shop->getPhysicalURI().$path, '/\\').'/'; if ($this->_path{0} != '/') $this->_path = '/'.$this->_path; $this->_path = rawurlencode($this->_path); $this->_path = str_replace('%2F', '/', $this->_path); diff --git a/classes/Dispatcher.php b/classes/Dispatcher.php index b70de4da6..3511a65bf 100644 --- a/classes/Dispatcher.php +++ b/classes/Dispatcher.php @@ -36,6 +36,8 @@ class DispatcherCore public static $instance = null; /** + * List of default routes + * * @var array */ protected $defaultRoutes = array( @@ -70,16 +72,22 @@ class DispatcherCore ); /** + * If true, use routes to build URL (mod rewrite must be activated) + * * @var $useRoutes bool */ protected $useRoutes = false; /** + * List of loaded routes + * * @var $routes array */ protected $routes = array(); /** + * List of allowed keywords in routes + * * @var array */ protected $keywords = array( @@ -88,11 +96,25 @@ class DispatcherCore ); /** + * Current controller name + * * @var string */ protected $controller; - - public static $controllers = array(); + + /** + * Current request uri + * + * @var string + */ + protected $requestURI; + + /** + * Store empty route (a route with an empty rule) + * + * @var array + */ + protected $emptyRoute; /** * Get current instance of dispatcher (singleton) @@ -113,18 +135,34 @@ class DispatcherCore { $this->useRoutes = (bool)Configuration::get('PS_REWRITING_SETTINGS'); $this->loadRoutes(); + + // Get request uri (HTTP_X_REWRITE_URL is used by IIS) + if (isset($_SERVER['REQUEST_URI'])) + $this->requestURI = $_SERVER['REQUEST_URI']; + else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) + $this->requestURI = $_SERVER['HTTP_X_REWRITE_URL']; } /** - * "main" method of dispatcher, call the controller + * Find the controller and instantiate it */ public function dispatch() { - $this->getController(); + $this->requestURI = preg_replace('#^'.preg_quote(Context::getContext()->shop->getBaseURI(), '#').'#i', '/', $this->requestURI); + // If there are several languages, get language from uri + if ($this->useRoutes && Language::isMultiLanguageActivated()) + if (preg_match('#^/([a-z]{2})/#', $this->requestURI, $m)) + { + $_GET['isolang'] = $m[1]; + $this->requestURI = substr($this->requestURI, 3); + } + + // Get and instantiate controller + $this->getController(); $controllers = Dispatcher::getControllers(); if (!isset($controllers[$this->controller])) - $this->controller = 'index'; + $this->controller = 'pagenotfound'; ControllerFactory::getController($controllers[$this->controller])->run(); } @@ -146,7 +184,16 @@ class DispatcherCore WHERE id_lang = '.(int)$context->language->id; if ($results = Db::getInstance()->ExecuteS($sql)) foreach ($results as $row) - $this->addRoute($row['page'], $row['url_rewrite'], $row['page']); + { + if ($row['url_rewrite']) + $this->addRoute($row['page'], $row['url_rewrite'], $row['page']); + else + $this->emptyRoute = array( + 'routeID' => $row['page'], + 'rule' => $row['url_rewrite'], + 'controller' => $row['page'], + ); + } } } @@ -178,17 +225,6 @@ class DispatcherCore 'required' => $required, ); } - - /** - * Check if a route is defined - * - * @param string $routeID - * @return bool - */ - public function routeExists($routeID) - { - return isset($this->routes[$routeID]); - } /** * Create an url from @@ -259,17 +295,16 @@ class DispatcherCore // Use routes ? (for url rewriting) if ($this->useRoutes && !$controller) { - // Get request uri (HTTP_X_REWRITE_URL is used by IIS) - if (isset($_SERVER['REQUEST_URI'])) - $request = $_SERVER['REQUEST_URI']; - else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) - $request = $_SERVER['HTTP_X_REWRITE_URL']; - else - return 'index'; - + if (!$this->requestURI) + return 'pagenotfound'; $controller = 'index'; + + // Add empty route as last route to prevent this greedy regexp to match request uri before right time + if ($this->emptyRoute) + $this->addRoute($this->emptyRoute['routeID'], $this->emptyRoute['rule'], $this->emptyRoute['controller']); + foreach ($this->routes as $route) - if (preg_match($route['regexp'], $request, $m)) + if (preg_match($route['regexp'], $this->requestURI, $m)) { // Route found ! Now fill $_GET with parameters of uri $controller = $route['controller']; @@ -278,7 +313,7 @@ class DispatcherCore $_GET[$k] = $v; break; } - + $this->controller = $controller; } // Default mode, take controller from url diff --git a/classes/FrontController.php b/classes/FrontController.php index 8b547eb2d..a86638147 100755 --- a/classes/FrontController.php +++ b/classes/FrontController.php @@ -136,7 +136,7 @@ class FrontControllerCore $protocol_content = ((isset($useSSL) AND $useSSL AND Configuration::get('PS_SSL_ENABLED')) OR (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://'; $link = new Link($protocol_link, $protocol_content); $this->context->link = $link; - + if ($this->auth AND !$cookie->isLogged($this->guestAllowed)) Tools::redirect('index.php?controller=authentication'.($this->authRedirection ? '&back='.$this->authRedirection : '')); @@ -398,7 +398,7 @@ class FrontControllerCore { header('HTTP/1.0 301 Moved'); $params = ''; - $excludedKey = array('isolang', 'id_lang'); + $excludedKey = array('isolang', 'id_lang', 'controller'); foreach ($_GET as $key => $value) if (!in_array($key, $excludedKey)) $params .= ($params == '' ? '?' : '&').$key.'='.$value; diff --git a/classes/Language.php b/classes/Language.php index 007ab68dd..5ce90ddce 100644 --- a/classes/Language.php +++ b/classes/Language.php @@ -662,4 +662,15 @@ class LanguageCore extends ObjectModel self::$countActiveLanguages = Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'lang` WHERE `active` = 1'); return self::$countActiveLanguages; } + + /** + * Check if more on than one language is activated + * + * @since 1.5.0 + * @return bool + */ + public static function isMultiLanguageActivated() + { + return (Language::countActiveLanguages() > 1); + } } diff --git a/classes/Link.php b/classes/Link.php index e5adc7ab7..4ccc1f3ab 100644 --- a/classes/Link.php +++ b/classes/Link.php @@ -73,11 +73,12 @@ class LinkCore public function getProductLink($id_product, $alias = null, $category = null, $ean13 = null, $id_lang = null, $id_shop = null) { $url = _PS_BASE_URL_.__PS_BASE_URI__; - + // @todo use specific method ? if ($id_shop && ($shop = Shop::getShop($id_shop))) - $url = 'http://'.$shop['domain'].'/'.$shop['uri'].$this->getLangLink($id_lang); - + $url = 'http://'.$shop['domain'].'/'.$shop['uri']; + $url .= $this->getLangLink($id_lang); + if (is_object($id_product)) { $product = clone($id_product); @@ -86,7 +87,7 @@ class LinkCore $alias = $product->link_rewrite; $ean13 = $product->ean13; } - + if ($category AND $category != 'home') return $url.Dispatcher::getInstance()->createUrl('product_rule2', array( 'id_product' => $id_product, @@ -269,7 +270,7 @@ class LinkCore * @param string $controller * @param bool $ssl * @param int $id_lang - * @param string $request + * @param string|array $request * @param Context $context */ public function getPageLink($controller, $ssl = false, $id_lang = null, $request = null) @@ -278,6 +279,11 @@ class LinkCore if (!$id_lang) $id_lang = (int)Context::getContext()->language->id; + if (is_array($request)) + { + unset($request['controller']); + $request = http_build_query($request); + } $uri_path = Dispatcher::getInstance()->createUrl($controller); $url = ($ssl AND Configuration::get('PS_SSL_ENABLED')) ? Tools::getShopDomainSsl(true) : Tools::getShopDomain(true); @@ -313,24 +319,13 @@ class LinkCore $request = str_replace($rewrite, $url_rewrite, $request); } - $queryTab = array(); parse_str($_SERVER['QUERY_STRING'], $queryTab); - unset($queryTab['isolang']); - $query = http_build_query($queryTab); - - if (!empty($query) OR !$this->allow) - $query = '?'.$query; - - $switchLangLink = $this->getPageLink(substr($_SERVER['PHP_SELF'], strlen(__PS_BASE_URI__)), false, $id_lang).$query; + unset($queryTab['isolang'], $queryTab['controller']); + if (!$this->allow) - if ($id_lang != $context->language->id) - { - if (strpos($switchLangLink,'id_lang')) - $switchLangLink = preg_replace('`id_lang=[0-9]*`','id_lang='.$id_lang,$switchLangLink); - else - $switchLangLink = $switchLangLink.'&id_lang='.$id_lang; - } - return $switchLangLink; + $queryTab['id_lang'] = $id_lang; + + return $this->getPageLink(Dispatcher::getInstance()->getController(), false, $id_lang, $queryTab); } public function goPage($url, $p) @@ -382,7 +377,7 @@ class LinkCore { if (!$context) $context = Context::getContext(); - if (!$this->allow OR Language::countActiveLanguages() <= 1) + if (!$this->allow OR !Language::isMultiLanguageActivated()) return ''; if (!$id_lang) diff --git a/classes/Product.php b/classes/Product.php index 42d43eb41..4000bff09 100644 --- a/classes/Product.php +++ b/classes/Product.php @@ -1509,7 +1509,7 @@ class ProductCore extends ObjectModel DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new FROM `'._DB_PREFIX_.'product` p '.$context->shop->sqlAsso('product', 'p').' - '.Product::sqlStock('p', 0, false, $context).' + '.Product::sqlStock('p', 0, false, $context->shop).' LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.$context->shop->sqlLang('pl').') LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') diff --git a/classes/Shop.php b/classes/Shop.php index 23e54174c..a339251ce 100644 --- a/classes/Shop.php +++ b/classes/Shop.php @@ -37,8 +37,9 @@ class ShopCore extends ObjectModel public $id_category; public $deleted; - protected $base_uri; protected $theme_name; + protected $physical_uri; + protected $virtual_uri; /** * @var GroupShop @@ -179,37 +180,26 @@ class ShopCore extends ObjectModel $excluded_uris[] = $directory; // Parse request_uri - preg_match('/^'.Tools::pRegexp(_PS_DIRECTORY_, '/').'([a-z0-9]+)\/.*$/Ui', $_SERVER['REQUEST_URI'], $res); - $uri = (isset($res[1]) AND !in_array($res[1], $excluded_uris)) ? $res[1] : ''; - if (!$id_shop = Tools::getValue('id_shop')) { // Find current shop from URL - $db = Db::getInstance(); - $sql = 'SELECT s.id_shop, su.uri + $sql = 'SELECT s.id_shop, CONCAT(su.physical_uri, su.virtual_uri) AS uri FROM '._DB_PREFIX_.'shop_url su LEFT JOIN '._DB_PREFIX_.'shop s ON (s.id_shop = su.id_shop) WHERE su.domain=\''.pSQL(Tools::getHttpHost()).'\' AND s.active = 1 - AND s.deleted = 0'; - $default = false; + AND s.deleted = 0 + ORDER BY LENGTH(uri) DESC'; if ($results = Db::getInstance()->executeS($sql)) foreach ($results as $row) - { - if (!$default) - $default = $row; - else if (!$row['uri']) - $default = $row; - - if ($uri == $row['uri']) + if (preg_match('#^'.preg_quote($row['uri'], '#').'#', $_SERVER['REQUEST_URI'])) { $id_shop = $row['id_shop']; break; } - } if (!$id_shop) - $id_shop = ($default) ? $default['id_shop'] : (int)Db::getInstance()->getValue('SELECT value FROM '._DB_PREFIX_.'configuration WHERE name = \'PS_SHOP_DEFAULT\''); + die('Shop not found ... redirect me please !'); } // Get instance of found shop @@ -226,7 +216,7 @@ class ShopCore extends ObjectModel */ protected function loadShopInfos() { - $sql = 'SELECT su.uri, t.name + $sql = 'SELECT su.physical_uri, su.virtual_uri, t.name FROM '._DB_PREFIX_.'shop s LEFT JOIN '._DB_PREFIX_.'shop_url su ON (s.id_shop = su.id_shop) LEFT JOIN '._DB_PREFIX_.'theme t ON (t.id_theme = s.id_theme) @@ -238,7 +228,8 @@ class ShopCore extends ObjectModel return false; $this->theme_name = $row['name']; - $this->base_uri = ($row['uri']) ? $row['uri'].'/' : ''; + $this->physical_uri = $row['physical_uri']; + $this->virtual_uri = $row['virtual_uri']; return true; } @@ -258,14 +249,18 @@ class ShopCore extends ObjectModel * * Get shop URI * - * @param bool $with_base * @return string */ - public function getBaseURI($with_base = true) + public function getBaseURI() { if (!$this->theme_name) $this->loadShopInfos(); - return ($with_base ? _PS_DIRECTORY_ : '').$this->base_uri; + return $this->physical_uri.$this->virtual_uri.'/'; + } + + public function getPhysicalURI() + { + return $this->physical_uri; } /** @@ -356,7 +351,7 @@ class ShopCore extends ObjectModel if (self::$shops && !$refresh) return; - $sql = 'SELECT gs.*, s.*, gs.name AS group_name, s.name AS shop_name, s.active, su.domain, su.domain_ssl, su.uri + $sql = 'SELECT gs.*, s.*, gs.name AS group_name, s.name AS shop_name, s.active, su.domain, su.domain_ssl, su.physical_uri, su.virtual_uri FROM '._DB_PREFIX_.'group_shop gs LEFT JOIN '._DB_PREFIX_.'shop s ON s.id_group_shop = gs.id_group_shop @@ -387,7 +382,7 @@ class ShopCore extends ObjectModel 'id_category' => $row['id_category'], 'domain' => $row['domain'], 'domain_ssl' => $row['domain_ssl'], - 'uri' => $row['uri'], + 'uri' => $row['physical_uri'].$row['virtual_uri'], 'active' => $row['active'], ); } diff --git a/classes/ShopUrl.php b/classes/ShopUrl.php index 10b66af2f..dd7633f46 100755 --- a/classes/ShopUrl.php +++ b/classes/ShopUrl.php @@ -30,7 +30,8 @@ class ShopUrlCore extends ObjectModel public $id_shop; public $domain; public $domain_ssl; - public $uri; + public $physical_uri; + public $virtual_uri; public $main; public $active; @@ -39,7 +40,7 @@ class ShopUrlCore extends ObjectModel protected $fieldsRequired = array('domain', 'id_shop'); - protected $fieldsSize = array('domain' => 255, 'uri' => 64); + protected $fieldsSize = array('domain' => 255, 'physical_uri' => 64, 'virtual_uri' => 64); protected $fieldsValidate = array('active' => 'isBool'); protected $table = 'shop_url'; @@ -48,15 +49,35 @@ class ShopUrlCore extends ObjectModel public function getFields() { parent::validateFields(); + + $this->physical_uri = trim($this->physical_uri, '/'); + $this->physical_uri .= '/'.$this->physical_uri; + if ($this->physical_uri) + $this->physical_uri = preg_replace('#/+#', '/', $this->physical_uri); + + $this->virtual_uri = trim($this->virtual_uri, '/'); + if ($this->virtual_uri) + $this->virtual_uri = '/'.preg_replace('#/+#', '/', trim($this->virtual_uri, '/')); + $fields['domain'] = pSQL($this->domain); $fields['domain_ssl'] = pSQL($this->domain_ssl); - $fields['uri'] = pSQL($this->uri); + $fields['physical_uri'] = pSQL($this->physical_uri); + $fields['virtual_uri'] = pSQL($this->virtual_uri); $fields['id_shop'] = (int)$this->id_shop; $fields['main'] = (int)$this->main; $fields['active'] = (int)$this->active; return $fields; } + public function getURL($ssl = false) + { + if (!$this->id) + return ; + + $url = ($ssl) ? 'https://'.$this->domain_ssl : 'http://'.$this->domain; + return $url.$this->physical_uri.$this->virtual_uri; + } + public static function getShopUrls($id_shop = false) { $sql = 'SELECT * diff --git a/classes/Tools.php b/classes/Tools.php index d05fa69ad..464a53d7b 100644 --- a/classes/Tools.php +++ b/classes/Tools.php @@ -1538,144 +1538,103 @@ class ToolsCore public static function generateHtaccess($path, $rewrite_settings, $cache_control, $specific = '', $disableMuliviews = false) { + // Check current content of .htaccess and save all code outside of prestashop comments + $specificBefore = $specificAfter = ''; + if (file_exists($path)) + { + $content = file_get_contents($path); + if (preg_match('#^(.*)\# ~~start~~.*\# ~~end~~[^\n]*(.*)$#s', $content, $m)) + { + $specificBefore = $m[1]; + $specificAfter = $m[2]; + } + else + $specificBefore = $content; + } + + // Write .htaccess data if (!$writeFd = @fopen($path, 'w')) return false; - - $tab = array('ErrorDocument' => array(), 'RewriteEngine' => array(), 'RewriteRule' => array()); - $multilang = (Language::countActiveLanguages() > 1); - $shop_urls = ShopUrl::getShopUrls(); - - foreach ($shop_urls AS &$url) + fwrite($writeFd, trim($specificBefore)."\n\n"); + + $domains = array(); + foreach (ShopUrl::getShopUrls() as $shopUrl) { - $url['uri'] .= (!empty($url['uri']) ? '/' : ''); - $domains[$url['domain']][] = $url; + $domains[$shopUrl['domain']] = array( + 'physical' => $shopUrl['physical_uri'], + 'virtual' => $shopUrl['virtual_uri'], + ); } - foreach ($domains AS $domain => $row) - { - foreach ($row AS $uri) - { - // ErrorDocument - $tab['ErrorDocument'][$domain]['comment'] = '# Catch 404 errors'; - $tab['ErrorDocument'][$domain]['content'] = '404 '.$uri['uri'].'404.php'; - - // Compatibility with the old image filesystem - if (Configuration::get('PS_LEGACY_IMAGES')) - { - $tab['RewriteRule'][$domain]['content']['^([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1-$2$3.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^([0-9]+)\-([0-9]+)/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1-$2.jpg [L]'; - } - - // Rewriting for product image id < 100 millions - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9])(\-[_a-zA-Z0-9-]*)?/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1/$1$2.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1/$2/$1$2$3.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1/$2/$3/$1$2$3$4.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1/$2/$3/$4/$1$2$3$4$5.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1/$2/$3/$4/$5/$1$2$3$4$5$6.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'c/([0-9]+)(\-[_a-zA-Z0-9-]*)/[_a-zA-Z0-9-]*\.jpg$'] = 'img/c/$1$2.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'c/([a-zA-Z-]+)/[a-zA-Z0-9-]+\.jpg$'] = 'img/c/$1.jpg [L]'; - - if ($multilang) - { - //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([a-z]{2})/[a-zA-Z0-9-]*/([0-9]+)\-[a-zA-Z0-9-]*\.html'] = 'index.php?controller=product&id_product=$2&isolang=$1&id_shop='.$uri['id_shop'].' [QSA,L]'; - //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([a-z]{2})/([0-9]+)\-[a-zA-Z0-9-]*\.html'] = 'index.php?controller=product&id_product=$2&isolang=$1&id_shop='.$uri['id_shop'].' [QSA,L]'; - //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([a-z]{2})/([0-9]+)\-[a-zA-Z0-9-]*'] = 'index.php?controller=category&id_category=$2&isolang=$1&id_shop='.$uri['id_shop'].' [QSA,L]'; - //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([a-z]{2})/content/([0-9]+)\-[a-zA-Z0-9-]*'] = 'index.php?controller=cms&isolang=$1&id_cms=$2&id_shop='.$uri['id_shop'].' [QSA,L]'; - //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([a-z]{2})/content/category/([0-9]+)\-[a-zA-Z0-9-]*'] = 'index.php?controller=cms&isolang=$1&id_cms_category=$2&id_shop='.$uri['id_shop'].' [QSA,L]'; - //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([a-z]{2})/([0-9]+)__[a-zA-Z0-9-]*'] = 'index.php?controller=supplier&isolang=$1&id_supplier=$2&id_shop='.$uri['id_shop'].' [QSA,L]'; - //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([a-z]{2})/([0-9]+)_[a-zA-Z0-9-]*'] = 'index.php?controller=manufacturer&isolang=$1&id_manufacturer=$2&id_shop='.$uri['id_shop'].' [QSA,L]'; - } - - // PS BASE URI automaticaly prepend the string, do not use PS defines for the image directories - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1-$2$3.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9]+)\-([0-9]+)/[_a-zA-Z0-9-]*\.jpg$'] = _PS_PROD_IMG_.'$1-$2.jpg [L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9]+)(\-[_a-zA-Z0-9-]*)/[_a-zA-Z0-9-]*\.jpg$'] = 'img/c/$1$2.jpg [L]'; - - Language::loadLanguages(); - $default_meta = Meta::getMetasByIdLang((int)Configuration::get('PS_LANG_DEFAULT'), new Shop($uri['id_shop'])); - - if ($multilang) - foreach (Language::getLanguages() as $language) - { - foreach (Meta::getMetasByIdLang((int)$language['id_lang'], new Shop($uri['id_shop'])) as $key => $meta) - if (!empty($meta['url_rewrite']) AND Validate::isLinkRewrite($meta['url_rewrite'])) - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').''.$language['iso_code'].'/'.$meta['url_rewrite'].'$'] = 'index.php?controller='.$meta['page'].'&isolang='.$language['iso_code'].'&id_shop='.$uri['id_shop'].' [QSA,L]'; - elseif (array_key_exists($key, $default_meta) && $default_meta[$key]['url_rewrite'] != '') - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').''.$language['iso_code'].'/'.$default_meta[$key]['url_rewrite'].'$'] = 'index.php?controller='.$default_meta[$key]['page'].'&isolang='.$language['iso_code'].'&id_shop='.$uri['id_shop'].' [QSA,L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').''.$language['iso_code'].'$'] = $language['iso_code'].'&id_shop='.$uri['id_shop'].' [QSA,L]'; - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').''.$language['iso_code'].'/([^?&]*)$'] = '$2?isolang='.$language['iso_code'].'&id_shop='.$uri['id_shop'].' [QSA,L]'; - } - else - foreach ($default_meta as $key => $meta) - if (!empty($meta['url_rewrite'])) - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').''.$meta['url_rewrite'].'$'] = 'index.php?controller='.$meta['page'].'&id_shop='.$uri['id_shop'].' [QSA,L]'; - else if (array_key_exists($key, $default_meta) && $default_meta[$key]['url_rewrite'] != '') - $tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').''.$default_meta[$key]['url_rewrite'].'$'] = 'index.php?controller='.$default_meta[$key]['page'].'&id_shop='.$uri['id_shop'].' [QSA,L]'; - } - } - /* - if (!Configuration::get('PS_INSTALL_VERSION') OR version_compare(Configuration::get('PS_INSTALL_VERSION'), '1.4.0.7') == -1) - { - // This is a nasty copy/paste of the previous links, but with "lang-en" instead of "en" - // Do not update it when you add something in the one at the top, it's only for the old links - $tab['RewriteRule'][$domain]['content']['^lang-([a-z]{2})/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html'] = 'product.php?id_product=$4&isolang=$2 [QSA,L]'; - $tab['RewriteRule'][$domain]['content']['^lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)\.html'] = 'product.php?id_product=$3&isolang=$2 [QSA,L]'; - $tab['RewriteRule'][$domain]['content']['^lang-([a-z]{2})/([0-9]+)\-([a-zA-Z0-9-]*)'] = 'category.php?id_category=$3&isolang=$2 [QSA,L]'; - $tab['RewriteRule'][$domain]['content']['^content/([0-9]+)\-([a-zA-Z0-9-]*)'] = 'cms.php?id_cms=$2 [QSA,L]'; - $tab['RewriteRule'][$domain]['content']['^content/category/([0-9]+)\-([a-zA-Z0-9-]*)'] = 'cms.php?id_cms_category=$2 [QSA,L]'; - } - */ - // PS Comments + // Write data in .htaccess file + fwrite($writeFd, "# ~~start~~ Do not remove this comment, Prestashop will keep automatically the code outside this comment when .htaccess will be generated again\n"); fwrite($writeFd, "# .htaccess automaticaly generated by PrestaShop e-commerce open-source solution\n"); - fwrite($writeFd, "# WARNING: PLEASE DO NOT MODIFY THIS FILE MANUALLY. IF NECESSARY, ADD YOUR SPECIFIC CONFIGURATION WITH THE HTACCESS GENERATOR IN BACK OFFICE\n"); fwrite($writeFd, "# http://www.prestashop.com - http://www.prestashop.com/forums\n\n"); - if (!empty($specific)) - fwrite($writeFd, $specific); - // RewriteEngine - fwrite($writeFd, "\n\n"); + // RewriteEngine + fwrite($writeFd, "\n"); + + // Disable multiviews ? if ($disableMuliviews) fwrite($writeFd, "\n# Disable Multiviews\nOptions -Multiviews\n\n"); - - fwrite($writeFd, $tab['RewriteEngine']['comment']."\nRewriteEngine on\n\n"); - fwrite($writeFd, $tab['RewriteRule']['comment']."\n"); - // Webservice - fwrite($writeFd, 'RewriteRule ^api/?(.*)$ '.__PS_BASE_URI__."webservice/dispatcher.php?url=$1 [QSA,L]\n"); - - fwrite($writeFd, "RewriteCond %{REQUEST_FILENAME} -s [OR]\nRewriteCond %{REQUEST_FILENAME} -l [OR]\nRewriteCond %{REQUEST_FILENAME} -d\nRewriteRule ^.*$ - [NC,L]\nRewriteRule ^.*\$ index.php [NC,L]\n"); - foreach ($domains AS $domain => $row) + + fwrite($writeFd, "RewriteEngine on\n\n"); + foreach ($domains as $domain => $uri) { - foreach ($row AS $uri) + // Rewrite virtual multishop uri + if ($uri['virtual']) { - fwrite($writeFd, 'RewriteCond %{HTTP_HOST} ^'.$domain.'$'."\n"); - fwrite($writeFd, $tab['ErrorDocument'][$domain]['comment']."\nErrorDocument ".$tab['ErrorDocument'][$domain]['content']."\n"); - // Classic URL rewriting - if ($rewrite_settings) - foreach ($tab['RewriteRule'][$domain]['content'] as $rule => $url) - { - fwrite($writeFd, 'RewriteCond %{HTTP_HOST} ^'.$domain.'$'."\n"); - fwrite($writeFd, 'RewriteRule '.$rule.' '.$url."\n"); - } - if (Tools::strlen(ltrim($uri['uri'], '/')) > 0) - { - fwrite($writeFd, 'RewriteCond %{HTTP_HOST} ^'.$domain.'$'."\n"); - fwrite($writeFd, 'RewriteRule ^'.ltrim($uri['uri'], '/').'(.*) $1?id_shop='.$uri['id_shop'].' [QSA,L]'."\n"); - } + fwrite($writeFd, 'RewriteCond %{HTTP_HOST} ^'.$domain.'$'."\n"); + fwrite($writeFd, "RewriteRule ^".ltrim($uri['virtual'], '/')."/(.*) ".$uri['physical']."/$1 [L]\n\n"); } - } + + // Webservice + fwrite($writeFd, 'RewriteRule ^api/?(.*)$ '.$uri['physical']."webservice/dispatcher.php?url=$1 [QSA,L]\n\n"); + + if ($rewrite_settings) + { + // Compatibility with the old image filesystem + fwrite($writeFd, "# Images\n"); + if (Configuration::get('PS_LEGACY_IMAGES')) + { + fwrite($writeFd, 'RewriteRule ^([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/[_a-zA-Z0-9-]*\.jpg$ '._PS_PROD_IMG_.'$1-$2$3.jpg [L]'."\n"); + fwrite($writeFd, 'RewriteRule ^([0-9]+)\-([0-9]+)/[_a-zA-Z0-9-]*\.jpg$ '._PS_PROD_IMG_.'$1-$2.jpg [L]'."\n"); + } + + // Rewrite product images < 100 millions + for ($i = 1; $i <= 8; $i++) + { + $imgPath = $imgName = ''; + for ($j = 1; $j <= $i; $j++) + { + $imgPath .= '$'.$j.'/'; + $imgName .= '$'.$j; + } + $imgName .= '$'.$j; + fwrite($writeFd, 'RewriteRule ^'.str_repeat('([0-9])', $i).'(\-[_a-zA-Z0-9-]*)?/[_a-zA-Z0-9-]*\.jpg$ '._PS_PROD_IMG_.$imgPath.$imgName.".jpg [L]\n"); + } + fwrite($writeFd, 'RewriteRule ^c/([0-9]+)(\-[_a-zA-Z0-9-]*)/[_a-zA-Z0-9-]*\.jpg$ img/c/$1$2.jpg [L]'."\n"); + fwrite($writeFd, 'RewriteRule ^c/([a-zA-Z-]+)/[a-zA-Z0-9-]+\.jpg$ img/c/$1.jpg [L]'."\n"); + } + + // Redirections to dispatcher + if ($rewrite_settings) + { + fwrite($writeFd, "\n# Dispatcher\n"); + fwrite($writeFd, "RewriteCond %{REQUEST_FILENAME} -s [OR]\n"); + fwrite($writeFd, "RewriteCond %{REQUEST_FILENAME} -l [OR]\n"); + fwrite($writeFd, "RewriteCond %{REQUEST_FILENAME} -d\n"); + fwrite($writeFd, "RewriteRule ^.*$ - [NC,L]\n"); + fwrite($writeFd, "RewriteRule ^.*\$ index.php [NC,L]\n"); + } + fwrite($writeFd, "\n\n"); - - // ErrorDocument - + // Cache control if ($cache_control) { - $cacheControl = " - + $cacheControl = " ExpiresActive On ExpiresByType image/gif \"access plus 1 month\" ExpiresByType image/jpeg \"access plus 1 month\" @@ -1694,10 +1653,12 @@ FileETag INode MTime Size AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript - - "; +\n\n"; fwrite($writeFd, $cacheControl); } + + fwrite($writeFd, "# ~~end~~ Do not remove this comment, Prestashop will keep automatically the code outside this comment when .htaccess will be generated again\n"); + fwrite($writeFd, "\n\n".trim($specificAfter)); fclose($writeFd); Module::hookExec('afterCreateHtaccess'); diff --git a/config/config.inc.php b/config/config.inc.php index 6ff9f4e19..af289d040 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -100,18 +100,11 @@ Language::loadLanguages(); $defaultCountry = new Country(Configuration::get('PS_COUNTRY_DEFAULT'), Configuration::get('PS_LANG_DEFAULT')); /* Instantiate cookie */ +$cookieLifetime = (time() + (((int)Configuration::get('PS_COOKIE_LIFETIME_BO') > 0 ? (int)Configuration::get('PS_COOKIE_LIFETIME_BO') : 1)* 3600)); if (defined('PS_ADMIN_DIR')) -{ - $currentFileName = array_reverse(explode("/", $_SERVER['SCRIPT_NAME'])); - $cookieLifetime = (time() + (((int)Configuration::get('PS_COOKIE_LIFETIME_BO') > 0 ? (int)Configuration::get('PS_COOKIE_LIFETIME_BO') : 1)* 3600)); - $cookie = new Cookie('psAdmin', substr($_SERVER['SCRIPT_NAME'], strlen(__PS_BASE_URI__), -strlen($currentFileName['0'])), $cookieLifetime); -} + $cookie = new Cookie('psAdmin', '', $cookieLifetime); else -{ - $defaultCountry = new Country((int)Configuration::get('PS_COUNTRY_DEFAULT'), Configuration::get('PS_LANG_DEFAULT')); - $cookieLifetime = (time() + (((int)Configuration::get('PS_COOKIE_LIFETIME_FO') > 0 ? (int)Configuration::get('PS_COOKIE_LIFETIME_FO') : 1)* 3600)); $cookie = new Cookie('ps', '', $cookieLifetime); -} Context::getContext()->cookie = $cookie; /* Instantiate language */ diff --git a/install-dev/sql/db.sql b/install-dev/sql/db.sql index 3c834156b..a1b44d67c 100644 --- a/install-dev/sql/db.sql +++ b/install-dev/sql/db.sql @@ -1735,18 +1735,19 @@ CREATE TABLE IF NOT EXISTS `PREFIX_shop` ( KEY `id_theme` (`id_theme`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; -CREATE TABLE IF NOT EXISTS `PREFIX_shop_url` ( - `id_shop_url` int(11) unsigned NOT NULL AUTO_INCREMENT, - `id_shop` int(11) unsigned NOT NULL, - `domain` varchar(255) NOT NULL, - `domain_ssl` varchar(255) NOT NULL, - `uri` varchar(64) NOT NULL, - `main` TINYINT(1) NOT NULL, - `active` TINYINT(1) NOT NULL, - PRIMARY KEY (`id_shop_url`), - KEY `id_shop` (`id_shop`), - UNIQUE KEY `shop_url` (`domain`, `uri`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + CREATE TABLE IF NOT EXISTS `PREFIX_shop_url` ( + `id_shop_url` int(11) unsigned NOT NULL AUTO_INCREMENT, + `id_shop` int(11) unsigned NOT NULL, + `domain` varchar(255) NOT NULL, + `domain_ssl` varchar(255) NOT NULL, + `physical_uri` varchar(64) NOT NULL, + `virtual_uri` varchar(64) NOT NULL, + `main` TINYINT(1) NOT NULL, + `active` TINYINT(1) NOT NULL, + PRIMARY KEY (`id_shop_url`), + KEY `id_shop` (`id_shop`), + UNIQUE KEY `shop_url` (`domain`, `virtual_uri`) + ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `PREFIX_theme` ( `id_theme` int(11) NOT NULL AUTO_INCREMENT, diff --git a/install-dev/sql/upgrade/1.5.0.0.sql b/install-dev/sql/upgrade/1.5.0.0.sql index c150315a9..153b93200 100755 --- a/install-dev/sql/upgrade/1.5.0.0.sql +++ b/install-dev/sql/upgrade/1.5.0.0.sql @@ -37,12 +37,13 @@ CREATE TABLE IF NOT EXISTS `PREFIX_shop_url` ( `id_shop` int(11) unsigned NOT NULL, `domain` varchar(255) NOT NULL, `domain_ssl` varchar(255) NOT NULL, - `uri` varchar(64) NOT NULL, + `physical_uri` varchar(64) NOT NULL, + `virtual_uri` varchar(64) NOT NULL, `main` TINYINT(1) NOT NULL, `active` TINYINT(1) NOT NULL, PRIMARY KEY (`id_shop_url`), KEY `id_shop` (`id_shop`), - UNIQUE KEY `shop_url` (`domain`, `uri`) + UNIQUE KEY `shop_url` (`domain`, `virtual_uri`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `PREFIX_theme` ( diff --git a/modules/blocklanguages/blocklanguages.tpl b/modules/blocklanguages/blocklanguages.tpl index 5ee5a0ab5..72ce067c4 100644 --- a/modules/blocklanguages/blocklanguages.tpl +++ b/modules/blocklanguages/blocklanguages.tpl @@ -34,7 +34,7 @@ {if isset($lang_rewrite_urls.$indice_lang)} {else} - + {/if} {/if} diff --git a/modules/ganalytics/ganalytics.php b/modules/ganalytics/ganalytics.php index 9302de3b5..7e20c45f0 100644 --- a/modules/ganalytics/ganalytics.php +++ b/modules/ganalytics/ganalytics.php @@ -131,7 +131,7 @@ class GAnalytics extends Module // Otherwise, create Google Analytics stats $ganalytics_id = Configuration::get('GANALYTICS_ID'); - $multilang = (Language::countActiveLanguages() > 1); + $multilang = Language::isMultiLanguageActivated(); $defaultMetaOrder = Meta::getMetaByPage('order',$this->context->language->id); $order = ($multilang?((string)Tools::getValue('isolang').'/'):'').$defaultMetaOrder['url_rewrite']; $pageTrack = ((strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.'order.php') === 0 || strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.($multilang?((string)Tools::getValue('isolang').'/'):'').$defaultMetaOrder['url_rewrite']) === 0) ? '/order/step'.(int)(Tools::getValue('step')).'.html' : '');
'.$this->l('Folder of your store ex: ipods for http://yourshopname.com/ipods/, leave empty if no folder.').''.$this->l('URL Rewrite must be activated to use this feature.').'