diff --git a/admin-dev/init.php b/admin-dev/init.php
index 732f83fcf..d7e4d7ffc 100644
--- a/admin-dev/init.php
+++ b/admin-dev/init.php
@@ -28,8 +28,9 @@
ob_start();
$timerStart = microtime(true);
-$currentFileName = array_reverse(explode("/", $_SERVER['SCRIPT_NAME']));
-$cookie = new Cookie('psAdmin', substr($_SERVER['SCRIPT_NAME'], strlen(__PS_BASE_URI__), -strlen($currentFileName['0'])));
+$context = Context::getContext();
+
+$context->cookie = $cookie;
if (isset($_GET['logout']))
$cookie->logout();
@@ -45,21 +46,20 @@ if ($back = Tools::getValue('back'))
$currentIndex .= '&back='.urlencode($back);
AdminTab::$currentIndex = $currentIndex;
-/* Server Params */
-$protocol_link = (Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://';
-$protocol_content = (isset($useSSL) AND $useSSL AND Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://';
-$link = new Link($protocol_link, $protocol_content);
-define('_PS_BASE_URL_', Tools::getShopDomain(true));
-define('_PS_BASE_URL_SSL_', Tools::getShopDomainSsl(true));
-$employee = new Employee($cookie->id_employee);
-$cookie->id_lang = (int)$employee->id_lang;
-$language = new Language($cookie->id_lang ? $cookie->id_lang : Configuration::get('PS_LANG_DEFAULT'));
$iso = $language->iso_code;
include(_PS_TRANSLATIONS_DIR_.$iso.'/errors.php');
include(_PS_TRANSLATIONS_DIR_.$iso.'/fields.php');
include(_PS_TRANSLATIONS_DIR_.$iso.'/admin.php');
+/* Server Params */
+$protocol_link = (Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://';
+$protocol_content = (isset($useSSL) AND $useSSL AND Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://';
+$link = new Link($protocol_link, $protocol_content);
+$context->link = $link;
+define('_PS_BASE_URL_', Tools::getShopDomain(true));
+define('_PS_BASE_URL_SSL_', Tools::getShopDomainSsl(true));
+
$path = dirname(__FILE__).'/themes/';
if (empty($employee->bo_theme) OR !file_exists($path.$employee->bo_theme.'/admin.css'))
{
@@ -88,11 +88,6 @@ if (Tools::isMultiShopActivated() && Tools::getValue('setShopContext') !== false
Tools::redirectAdmin($url['path'] . '?' . http_build_query($parseQuery));
}
-$context = Context::getContext();
-$context->employee = $employee;
-$context->cookie = $cookie;
-$context->link = $link;
-$context->language = $language;
$context->currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT'));
$context->country = $defaultCountry;
$context->shop = new Shop(Shop::getContextID());
\ No newline at end of file
diff --git a/admin-dev/tabs/AdminCMS.php b/admin-dev/tabs/AdminCMS.php
index 2c87173fa..cbee8e4a6 100644
--- a/admin-dev/tabs/AdminCMS.php
+++ b/admin-dev/tabs/AdminCMS.php
@@ -43,7 +43,7 @@ class AdminCMS extends AdminTab
$this->fieldsDisplay = array(
'id_cms' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25),
'link_rewrite' => array('title' => $this->l('URL'), 'width' => 200),
- 'meta_title' => array('title' => $this->l('Title'), 'width' => 300),
+ 'meta_title' => array('title' => $this->l('Title'), 'width' => 300, 'filter_key' => 'b!meta_title'),
'position' => array('title' => $this->l('Position'), 'width' => 40,'filter_key' => 'position', 'align' => 'center', 'position' => 'position'),
'active' => array('title' => $this->l('Enabled'), 'width' => 25, 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false)
);
@@ -155,7 +155,7 @@ class AdminCMS extends AdminTab
if (Tools::isMultiShopActivated())
{
echo '
';
- $this->displayAssoShop();
+ $this->displayAssoShop('meta_title');
echo '
';
}
// SUBMIT
@@ -184,7 +184,7 @@ class AdminCMS extends AdminTab
$context = Context::getContext();
if (($id_cms_category = (int)Tools::getValue('id_cms_category')))
- $currentIndex .= '&id_cms_category='.$id_cms_category;
+ self::$currentIndex .= '&id_cms_category='.$id_cms_category;
$this->getList($context->language->id, !$context->cookie->__get($this->table.'Orderby') ? 'position' : NULL, !$context->cookie->__get($this->table.'Orderway') ? 'ASC' : NULL);
if (!$id_cms_category)
diff --git a/admin-dev/tabs/AdminCMSCategories.php b/admin-dev/tabs/AdminCMSCategories.php
index d41eea8cc..d27c3a82c 100644
--- a/admin-dev/tabs/AdminCMSCategories.php
+++ b/admin-dev/tabs/AdminCMSCategories.php
@@ -74,9 +74,10 @@ class AdminCMSCategories extends AdminTab
public function display($token = NULL)
{
+ $context = Context::getContext();
$id_cms_category = (int)(Tools::getValue('id_cms_category', 1));
- $this->getList((int)($cookie->id_lang), !$context->cookie->__get($this->table.'Orderby') ? 'position' : NULL, !$context->cookie->__get($this->table.'Orderway') ? 'ASC' : NULL);
+ $this->getList((int)($context->cookie->id_lang), !$context->cookie->__get($this->table.'Orderby') ? 'position' : NULL, !$context->cookie->__get($this->table.'Orderway') ? 'ASC' : NULL);
echo ''.(!$this->_listTotal ? ($this->l('There are no subcategories')) : ($this->_listTotal.' '.($this->_listTotal > 1 ? $this->l('subcategories') : $this->l('subCMS Category')))).' '.$this->l('in CMS Category').' "'.stripslashes(CMSCategory::hideCMSCategoryPosition($this->_CMSCategory->getName())).'"
';
echo '
'.$this->l('Add a new sub CMS Category').'
diff --git a/admin-dev/tabs/AdminCMSContent.php b/admin-dev/tabs/AdminCMSContent.php
index 6771c2674..7e117437a 100644
--- a/admin-dev/tabs/AdminCMSContent.php
+++ b/admin-dev/tabs/AdminCMSContent.php
@@ -105,21 +105,21 @@ class AdminCMSContent extends AdminTab
}
else
{
- $id_cms_category = (int)(Tools::getValue('id_cms_category'));
- if (!$id_cms_category)
- $id_cms_category = 1;
- $cms_tabs = array('cms_category', 'cms');
- // Cleaning links
- $catBarIndex = $currentIndex;
- foreach ($cms_tabs AS $tab)
- if (Tools::getValue($tab.'Orderby') && Tools::getValue($tab.'Orderway'))
- $catBarIndex = preg_replace('/&'.$tab.'Orderby=([a-z _]*)&'.$tab.'Orderway=([a-z]*)/i', '', $currentIndex);
- echo ''.$this->l('Current category').' : '.getPath($catBarIndex, $id_cms_category,'','','cms').'
';
- echo ''.$this->l('Categories').'
';
- $this->adminCMSCategories->display($this->token);
- echo '
';
- echo ''.$this->l('Pages in this category').'
';
- $this->adminCMS->display($this->token);
+ $id_cms_category = (int)(Tools::getValue('id_cms_category'));
+ if (!$id_cms_category)
+ $id_cms_category = 1;
+ $cms_tabs = array('cms_category', 'cms');
+ // Cleaning links
+ $catBarIndex = self::$currentIndex;
+ foreach ($cms_tabs AS $tab)
+ if (Tools::getValue($tab.'Orderby') && Tools::getValue($tab.'Orderway'))
+ $catBarIndex = preg_replace('/&'.$tab.'Orderby=([a-z _]*)&'.$tab.'Orderway=([a-z]*)/i', '', self::$currentIndex);
+ echo ''.$this->l('Current category').' : '.getPath($catBarIndex, $id_cms_category,'','','cms').'
';
+ echo ''.$this->l('Categories').'
';
+ $this->adminCMSCategories->display($this->token);
+ echo '
';
+ echo ''.$this->l('Pages in this category').'
';
+ $this->adminCMS->display($this->token);
}
}
diff --git a/admin-dev/tabs/AdminImport.php b/admin-dev/tabs/AdminImport.php
index 480172fef..5790c6fb5 100644
--- a/admin-dev/tabs/AdminImport.php
+++ b/admin-dev/tabs/AdminImport.php
@@ -788,7 +788,7 @@ class AdminImport extends AdminTab
$specificPrice = new SpecificPrice();
$specificPrice->id_product = (int)($product->id);
// @todo multishop specific price import
- $specificPrice->id_shop = $context->shop->getID();
+ $specificPrice->id_shop = $context->shop->getID(true);
$specificPrice->id_currency = 0;
$specificPrice->id_country = 0;
$specificPrice->id_group = 0;
diff --git a/classes/CMSCategory.php b/classes/CMSCategory.php
index a9b86514c..2c33273e3 100644
--- a/classes/CMSCategory.php
+++ b/classes/CMSCategory.php
@@ -209,7 +209,7 @@ class CMSCategoryCore extends ObjectModel
$category['cms'] = Db::getInstance()->ExecuteS($sql);
if ($links == 1)
{
- $category['link'] = $link->getCMSCategoryLink($current, $category['link_rewrite']);
+ $category['link'] = $context->link->getCMSCategoryLink($current, $category['link_rewrite']);
foreach($category['cms'] as $key => $cms)
$category['cms'][$key]['link'] = $context->link->getCMSLink($cms['id_cms'], $cms['link_rewrite']);
}
@@ -477,6 +477,9 @@ class CMSCategoryCore extends ObjectModel
public function getName($id_lang = NULL)
{
+ if (!$context)
+ $context = Context::getContext();
+
if (!$id_lang)
{
if (isset($this->name[Context::getContext()->language->id]))
diff --git a/classes/Dispatcher.php b/classes/Dispatcher.php
index 89fe117af..b70de4da6 100644
--- a/classes/Dispatcher.php
+++ b/classes/Dispatcher.php
@@ -1,5 +1,33 @@
+* @copyright 2007-2011 PrestaShop SA
+* @version Release: $Revision: 6844 $
+* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+/**
+ * @since 1.5.0
+ */
class DispatcherCore
{
/**
@@ -11,36 +39,36 @@ class DispatcherCore
* @var array
*/
protected $defaultRoutes = array(
- 'product' => array(
+ 'product_rule' => array(
'controller' => 'product',
- 'rule' => '{number:id_product}-{word}.html',
+ 'rule' => '{number:id_product}-{text}.html',
),
- 'category' => array(
+ 'category_rule' => array(
'controller' => 'category',
- 'rule' => '{number:id_category}-{word}',
+ 'rule' => '{number:id_category}-{text}',
),
- 'product_alt' => array(
+ 'product_rule2' => array(
'controller' => 'product',
- 'rule' => '{word1}/{number:id_product}-{word2}.html',
+ 'rule' => '{text1}/{number:id_product}-{text2}.html',
),
- 'supplier' => array(
+ 'supplier_rule' => array(
'controller' => 'supplier',
- 'rule' => '{number:id_supplier}__{word}',
+ 'rule' => '{number:id_supplier}__{text}',
),
- 'manufacturer' => array(
+ 'manufacturer_rule' => array(
'controller' => 'manufacturer',
- 'rule' => '{number:id_manufacturer}_{word}',
+ 'rule' => '{number:id_manufacturer}_{text}',
),
- 'cms' => array(
+ 'cms_rule' => array(
'controller' => 'cms',
- 'rule' => 'content/{number:id_cms}-{word}',
+ 'rule' => 'content/{number:id_cms}-{text}',
),
- 'cms_category' => array(
+ 'cms_category_rule' => array(
'controller' => 'cms',
- 'rule' => 'content/category/{number:id_cms_category}-{word}',
+ 'rule' => 'content/category/{number:id_cms_category}-{text}',
),
);
-
+
/**
* @var $useRoutes bool
*/
@@ -50,13 +78,13 @@ class DispatcherCore
* @var $routes array
*/
protected $routes = array();
-
+
/**
* @var array
*/
protected $keywords = array(
'number' => '[0-9]+',
- 'word' => '[a-zA-Z0-9-]*',
+ 'text' => '[a-zA-Z0-9-]*',
);
/**
@@ -105,9 +133,21 @@ class DispatcherCore
*/
protected function loadRoutes()
{
+ $context = Context::getContext();
+ foreach ($this->defaultRoutes as $id => $route)
+ $this->addRoute($id, $route['rule'], $route['controller']);
+
+ // Load routes from meta table
if ($this->useRoutes)
- foreach ($this->defaultRoutes as $id => $route)
- $this->addRoute($id, $route['rule'], $route['controller']);
+ {
+ $sql = 'SELECT m.page, ml.url_rewrite
+ FROM `'._DB_PREFIX_.'meta` m
+ LEFT JOIN `'._DB_PREFIX_.'meta_lang` ml ON (m.id_meta = ml.id_meta'.$context->shop->sqlLang('ml').')
+ 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']);
+ }
}
/**
@@ -138,6 +178,17 @@ 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
@@ -152,7 +203,10 @@ class DispatcherCore
die('Dispatcher::createUrl() $params must be an array');
if (!isset($this->routes[$routeID]))
- return '';
+ {
+ $query = http_build_query($params);
+ return 'index.php?controller='.$routeID.(($query) ? '&'.$query : '');
+ }
$route = $this->routes[$routeID];
// Check required fields
@@ -191,9 +245,19 @@ class DispatcherCore
{
if ($this->controller)
return $this->controller;
-
+
+ $controller = Tools::getValue('controller');
+ if (isset($controller) && preg_match('/^([0-9a-z_-]+)\?(.*)=(.*)$/Ui', $controller, $m))
+ {
+ $controller = $m[1];
+ if (isset($_GET['controller']))
+ $_GET[$m[2]] = $m[3];
+ else if (isset($_POST['controller']))
+ $_POST[$m[2]] = $m[3];
+ }
+
// Use routes ? (for url rewriting)
- if ($this->useRoutes)
+ if ($this->useRoutes && !$controller)
{
// Get request uri (HTTP_X_REWRITE_URL is used by IIS)
if (isset($_SERVER['REQUEST_URI']))
@@ -219,19 +283,8 @@ class DispatcherCore
}
// Default mode, take controller from url
else
- {
- $controller = Tools::getValue('controller');
- if (isset($controller) && preg_match('/^([0-9a-z_-]+)\?(.*)=(.*)$/Ui', $controller, $m))
- {
- $controller = $m[1];
- if (isset($_GET['controller']))
- $_GET[$m[2]] = $m[3];
- else if (isset($_POST['controller']))
- $_POST[$m[2]] = $m[3];
- }
$this->controller = (!empty($controller)) ? $controller : 'index';
- }
-
+
$this->controller = str_replace('-', '', strtolower($this->controller));
return $this->controller;
}
diff --git a/classes/FrontController.php b/classes/FrontController.php
index 8c24c46a1..6cc885654 100755
--- a/classes/FrontController.php
+++ b/classes/FrontController.php
@@ -96,11 +96,6 @@ class FrontControllerCore
$this->context = Context::getContext();
- $protocol_link = (Configuration::get('PS_SSL_ENABLED') OR (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://';
- $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;
-
$this->id_current_shop = Context::getContext()->shop->getID();
$this->id_current_group_shop = Context::getContext()->shop->getGroupID();
@@ -119,9 +114,26 @@ class FrontControllerCore
}
ob_start();
+
+ // Switch language if needed and init cookie language
+ if ($iso = Tools::getValue('isolang') AND Validate::isLanguageIsoCode($iso) AND ($id_lang = (int)(Language::getIdByIso($iso))))
+ $_GET['id_lang'] = $id_lang;
- $cookie = new Cookie('ps');
- $this->context->cookie = $cookie;
+ Tools::switchLanguage();
+ Tools::setCookieLanguage($cookie);
+ $currency = Tools::setCurrency($cookie);
+
+ if (Validate::isLoadedObject($currency))
+ $smarty->ps_currency = $currency;
+ if (!Validate::isLoadedObject($language = new Language($cookie->id_lang)))
+ $language = new Language(Configuration::get('PS_LANG_DEFAULT'));
+ $smarty->ps_language = $language;
+ $this->context->language = $language;
+
+ $protocol_link = (Configuration::get('PS_SSL_ENABLED') OR (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://';
+ $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 : ''));
@@ -134,13 +146,6 @@ class FrontControllerCore
elseif (Configuration::get('PS_GEOLOCATION_ENABLED'))
if (($newDefault = $this->geolocationManagement($defaultCountry)) && Validate::isLoadedObject($newDefault))
$defaultCountry = $newDefault;
-
- // Switch language if needed and init cookie language
- if ($iso = Tools::getValue('isolang') AND Validate::isLanguageIsoCode($iso) AND ($id_lang = (int)(Language::getIdByIso($iso))))
- $_GET['id_lang'] = $id_lang;
-
- Tools::switchLanguage();
- Tools::setCookieLanguage($cookie);
if (isset($_GET['logout']) OR ($cookie->logged AND Customer::isBanned((int)$cookie->id_customer)))
{
@@ -153,7 +158,6 @@ class FrontControllerCore
Tools::redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : NULL);
}
- $currency = Tools::setCurrency($cookie);
$_MODULES = array();
/* Cart already exists */
if ((int)$cookie->id_cart)
@@ -224,13 +228,8 @@ class FrontControllerCore
setlocale(LC_CTYPE, $locale);
setlocale(LC_TIME, $locale);
setlocale(LC_NUMERIC, 'en_US.UTF-8');
-
- if (Validate::isLoadedObject($currency))
- $smarty->ps_currency = $currency;
- if (!Validate::isLoadedObject($language = new Language($cookie->id_lang)))
- $language = new Language(Configuration::get('PS_LANG_DEFAULT'));
+
$smarty->ps_language = $language;
- $this->context->language = $language;
/* get page name to display it in body id */
$pathinfo = pathinfo(__FILE__);
@@ -248,7 +247,6 @@ class FrontControllerCore
if (!defined('_PS_BASE_URL_SSL_'))
define('_PS_BASE_URL_SSL_', Tools::getShopDomainSsl(true));
- $link->preloadPageLinks();
$this->canonicalRedirection();
Product::initPricesComputation();
diff --git a/classes/Link.php b/classes/Link.php
index 24ec645d2..54f665b0a 100644
--- a/classes/Link.php
+++ b/classes/Link.php
@@ -47,104 +47,181 @@ class LinkCore
}
/**
- * This function returns a link to delete a customization picture file
- *
- * @param mixed $product
- * @param mixed $id_picture
- * @return void
+ * Create a link to delete a product
+ *
+ * @param mixed $product ID of the product OR a Product object
+ * @param int $id_picture ID of the picture to delete
+ * @return string
*/
- public function getProductDeletePictureLink($product, $id_picture){
- if (is_object($product))
- return ($this->allow == 1)?(_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink().((isset($product->category) AND !empty($product->category) AND $product->category != 'home') ? $product->category.'/' : '').(int)$product->id.'-'.$product->link_rewrite.($product->ean13 ? '-'.$product->ean13 : '').'.html?deletePicture='.$id_picture) :
- (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=product&id_product='.(int)$product->id).'&deletePicture='.$id_picture;
- else
- return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=product&id_product='.(int)$product.'&deletePicture='.$id_picture;
+ public function getProductDeletePictureLink($product, $id_picture)
+ {
+ $url = $this->getProductLink($product);
+ return $url.((strpos($url, '?')) ? '&' : '?').'&deletePicture='.$id_picture;
}
/**
- * Return the correct link for product/category/supplier/manufacturer
- *
- * @param mixed $id_OBJ Can be either the object or the ID only
- * @param string $alias Friendly URL (only if $id_OBJ is the object)
- * @return string link
- */
+ * Create a link to a product
+ *
+ * @param mixed $id_product ID of the product OR a Product object
+ * @param string $alias If $id_product is not a object, this argument is same as obj->link_rewrite
+ * @param string $category If $id_product is not a object, name of the product category
+ * @param string $ean13
+ * @param int $id_lang
+ * @param int $id_shop (since 1.5.0) ID shop need to be used when we generate a product link for a product in a cart
+ * @return string
+ */
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'];
-
+ $url = 'http://'.$shop['domain'].'/'.$shop['uri'].$this->getLangLink($id_lang);
+
if (is_object($id_product))
- return ($this->allow == 1)?($url.$this->getLangLink((int)$id_lang).((isset($id_product->category) AND !empty($id_product->category) AND $id_product->category != 'home') ? $id_product->category.'/' : '').(int)$id_product->id.'-'.$id_product->link_rewrite.($id_product->ean13 ? '-'.$id_product->ean13 : '').'.html') :
- ($url.'index.php?controller=product&id_product='.(int)$id_product->id);
- elseif ($alias)
- return ($this->allow == 1)?($url.$this->getLangLink((int)$id_lang).(($category AND $category != 'home') ? ($category.'/') : '').(int)$id_product.'-'.$alias.($ean13 ? '-'.$ean13 : '').'.html') :
- ($url.'index.php?controller=product&id_product='.(int)$id_product);
+ {
+ $product = clone($id_product);
+ $id_product = $product->id;
+ $category = $product->category;
+ $alias = $product->link_rewrite;
+ $ean13 = $product->ean13;
+ }
+
+ if ($category AND $category != 'home')
+ return $url.Dispatcher::getInstance()->createUrl('product_rule2', array(
+ 'id_product' => $id_product,
+ 'text1' => $category,
+ 'text2' => $alias.(($ean13) ? '-'.$ean13 : ''),
+ ), ($alias && $this->allow));
else
- return $url.'index.php?controller=product&id_product='.(int)$id_product;
+ return $url.Dispatcher::getInstance()->createUrl('product_rule', array(
+ 'id_product' => $id_product,
+ 'text' => (($alias) ? $alias : '').(($ean13) ? '-'.$ean13 : ''),
+ ), ($alias && $this->allow));
}
+ /**
+ * Create a link to a category
+ *
+ * @param mixed $id_category ID of the category OR a Category object
+ * @param string $alias If $id_category is not a object, this argument is same as obj->link_rewrite
+ * @param int $id_lang
+ * @return string
+ */
public function getCategoryLink($id_category, $alias = NULL, $id_lang = NULL)
{
+ $url = _PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink($id_lang);
if (is_object($id_category))
- return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_category->id).'-'.$id_category->link_rewrite) :
- (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=category&id_category='.(int)($id_category->id));
- if ($alias)
- return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_category).'-'.$alias) :
- (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=category&id_category='.(int)($id_category));
- return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=category&id_category='.(int)($id_category);
+ {
+ $category = clone($id_category);
+ $id_category = $category->id;
+ $alias = $category->link_rewrite;
+ }
+
+ return $url.Dispatcher::getInstance()->createUrl('category_rule', array(
+ 'id_category' => $id_category,
+ 'text' => ($alias) ? $alias : '',
+ ), ($alias && $this->allow));
}
+ /**
+ * Create a link to a CMS category
+ *
+ * @param mixed $id_category ID of the category OR a CmsCategory object
+ * @param string $alias If $id_category is not a object, this argument is same as obj->link_rewrite
+ * @param int $id_lang
+ * @return string
+ */
public function getCMSCategoryLink($id_category, $alias = NULL, $id_lang = NULL)
{
+ $url = _PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink($id_lang);
if (is_object($id_category))
- return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).'content/category/'.(int)($id_category->id).'-'.$id_category->link_rewrite) :
- (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=cms&id_cms_category='.(int)($id_category->id));
- if ($alias)
- return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).'content/category/'.(int)($id_category).'-'.$alias) :
- (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=cms&id_cms_category='.(int)($id_category));
- return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=cms&id_cms_category='.(int)($id_category);
+ {
+ $category = clone($id_category);
+ $id_category = $category->id;
+ $alias = $category->link_rewrite;
+ }
+
+ return $url.Dispatcher::getInstance()->createUrl('cms_category_rule', array(
+ 'id_cms_category' => $id_category,
+ 'text' => ($alias) ? $alias : '',
+ ), ($alias && $this->allow));
}
+ /**
+ * Create a link to a CMS page
+ *
+ * @param mixed $cms ID of the CMS page OR a Cms object
+ * @param string $alias If $cms is not a object, this argument is same as obj->link_rewrite
+ * @param bool $ssl
+ * @param int $id_lang
+ * @return string
+ */
public function getCMSLink($cms, $alias = null, $ssl = false, $id_lang = NULL)
{
$base = (($ssl AND Configuration::get('PS_SSL_ENABLED')) ? Tools::getShopDomainSsl(true) : Tools::getShopDomain(true));
+ $url = $base.__PS_BASE_URI__.$this->getLangLink($id_lang);
if (is_object($cms))
{
- return ($this->allow == 1) ?
- ($base.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).'content/'.(int)($cms->id).'-'.$cms->link_rewrite) :
- ($base.__PS_BASE_URI__.'index.php?controller=cms&id_cms='.(int)($cms->id));
+ $id_cms = $cms->id;
+ $alias = $cms->link_rewrite;
}
+ else
+ $id_cms = $cms;
- if ($alias)
- return ($this->allow == 1) ? ($base.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).'content/'.(int)($cms).'-'.$alias) :
- ($base.__PS_BASE_URI__.'index.php?controller=cms&id_cms='.(int)($cms));
- return $base.__PS_BASE_URI__.'index.php?controller=cms&id_cms='.(int)($cms);
+ return $url.Dispatcher::getInstance()->createUrl('cms_rule', array(
+ 'id_cms' => $id_cms,
+ 'text' => ($alias) ? $alias : '',
+ ), ($alias && $this->allow));
}
+ /**
+ * Create a link to a supplier
+ *
+ * @param mixed $id_supplier ID of the supplier page OR a Supplier object
+ * @param string $alias If $id_supplier is not a object, this argument is same as obj->link_rewrite
+ * @param int $id_lang
+ * @return string
+ */
public function getSupplierLink($id_supplier, $alias = NULL, $id_lang = NULL)
{
+ $url = _PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink($id_lang);
if (is_object($id_supplier))
- return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_supplier->id).'__'.$id_supplier->link_rewrite) :
- (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=supplier&id_supplier='.(int)($id_supplier->id));
- if ($alias)
- return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_supplier).'__'.$alias) :
- (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=supplier&id_supplier='.(int)($id_supplier));
- return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=supplier&id_supplier='.(int)($id_supplier);
+ {
+ $supplier = clone($id_supplier);
+ $id_supplier = $supplier->id;
+ $alias = $supplier->link_rewrite;
+ }
+
+ return $url.Dispatcher::getInstance()->createUrl('supplier_rule', array(
+ 'id_supplier' => $id_supplier,
+ 'text' => ($alias) ? $alias : '',
+ ), ($alias && $this->allow));
}
+ /**
+ * Create a link to a manufacturer
+ *
+ * @param mixed $id_manufacturer ID of the manufacturer page OR a Supplier object
+ * @param string $alias If $id_manufacturer is not a object, this argument is same as obj->link_rewrite
+ * @param int $id_lang
+ * @return string
+ */
public function getManufacturerLink($id_manufacturer, $alias = NULL, $id_lang = NULL)
{
+ $url = _PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink($id_lang);
if (is_object($id_manufacturer))
- return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_manufacturer->id).'_'.$id_manufacturer->link_rewrite) :
- (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=manufacturer&id_manufacturer='.(int)($id_manufacturer->id));
- if ($alias)
- return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_manufacturer).'_'.$alias) :
- (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=manufacturer&id_manufacturer='.(int)($id_manufacturer));
- return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=manufacturer&id_manufacturer='.(int)($id_manufacturer);
+ {
+ $manufacturer = clone($id_manufacturer);
+ $id_manufacturer = $manufacturer->id;
+ $alias = $manufacturer->link_rewrite;
+ }
+
+ return $url.Dispatcher::getInstance()->createUrl('manufacturer_rule', array(
+ 'id_manufacturer' => $id_manufacturer,
+ 'text' => ($alias) ? $alias : '',
+ ), ($alias && $this->allow));
}
/**
@@ -185,59 +262,30 @@ class LinkCore
return Tools::getProtocol().Tools::getMediaServer($filepath).$filepath;
}
- public function preloadPageLinks(Context $context = null)
+ /**
+ * Create a simple link
+ *
+ * @param string $controller
+ * @param bool $ssl
+ * @param int $id_lang
+ * @param string $request
+ * @param Context $context
+ */
+ public function getPageLink($controller, $ssl = false, $id_lang = null, $request = null, Context $context = null)
{
+ $controller = str_replace('.php', '', $controller);
+
if (!$context)
$context = Context::getContext();
- if ($this->allow != 1)
- return;
-
- $result = Db::getInstance()->ExecuteS('
- SELECT page, url_rewrite
- FROM `'._DB_PREFIX_.'meta` m
- LEFT JOIN `'._DB_PREFIX_.'meta_lang` ml ON (m.id_meta = ml.id_meta)
- WHERE id_lang = '.(int)$context->language->id);
- foreach ($result as $row)
- self::$cache['page'][$row['page'].'.php_'.$context->language->id] = $this->getLangLink($context->language->id).$row['url_rewrite'];
- }
-
- public function getPageLink($filename, $ssl = false, $id_lang = NULL, $request = NULL, Context $context = null)
- {
- if (!$context)
- $context = Context::getContext();
- if ($id_lang == NULL)
+ if (!$id_lang)
$id_lang = (int)$context->language->id;
- if (array_key_exists($filename.'_'.$id_lang, self::$cache['page']) AND !empty(self::$cache['page'][$filename.'_'.$id_lang]))
- $uri_path = self::$cache['page'][$filename.'_'.$id_lang];
- else
- {
- if ($this->allow == 1)
- {
- $url_rewrite = '';
- if ($filename != 'index')
- {
- $pagename = $filename;
- $url_rewrite = Db::getInstance()->getValue('
- SELECT url_rewrite
- FROM `'._DB_PREFIX_.'meta` m
- LEFT JOIN `'._DB_PREFIX_.'meta_lang` ml ON (m.id_meta = ml.id_meta)
- WHERE id_lang = '.(int)$id_lang.' AND `page` = \''.pSQL($pagename).'\'');
- $uri_path = $this->getLangLink((int)$id_lang).($url_rewrite ? $url_rewrite : $filename);
- }
- else
- $uri_path = $this->getLangLink((int)$id_lang);
- }
- else
- {
- $uri_path = '';
-
- if ($filename != 'index.php')
- $uri_path = 'index.php?controller='.str_replace('.php', '', $filename);
- }
- self::$cache['page'][$filename.'_'.$id_lang] = $uri_path;
- }
- return (($ssl AND Configuration::get('PS_SSL_ENABLED')) ? Tools::getShopDomainSsl(true) : Tools::getShopDomain(true)).__PS_BASE_URI__.ltrim($uri_path, '/').($request ? (($this->allow ? '?' : '&').trim($request)) : '');
+ $uri_path = Dispatcher::getInstance()->createUrl($controller);
+ $url = ($ssl AND Configuration::get('PS_SSL_ENABLED')) ? Tools::getShopDomainSsl(true) : Tools::getShopDomain(true);
+ $url .= __PS_BASE_URI__.$this->getLangLink($id_lang).ltrim($uri_path, '/');
+ $url .= ($request ? (($this->allow ? '?' : '&').trim($request)) : '');
+
+ return $url;
}
public function getCatImageLink($name, $id_category, $type = null)
diff --git a/classes/Shop.php b/classes/Shop.php
index be94ebca0..938fb428f 100644
--- a/classes/Shop.php
+++ b/classes/Shop.php
@@ -186,15 +186,30 @@ class ShopCore extends ObjectModel
{
// Find current shop from URL
$db = Db::getInstance();
- $sql = 'SELECT s.id_shop
+ $sql = 'SELECT s.id_shop, su.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 uri=\''.pSQL($uri).'\'
AND s.active = 1
AND s.deleted = 0';
- if (!$id_shop = $db->getValue($sql))
- $id_shop = (int)Db::getInstance()->getValue('SELECT value FROM '._DB_PREFIX_.'configuration WHERE name = \'PS_SHOP_DEFAULT\'');
+ $default = false;
+ if ($results = Db::getInstance()->executeS($sql))
+ foreach ($results as $row)
+ {
+ if (!$default)
+ $default = $row;
+ else if (!$row['uri'])
+ $default = $row;
+
+ if ($uri == $row['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\'');
}
// Get instance of found shop
diff --git a/classes/Tools.php b/classes/Tools.php
index 5a3213594..59aa218d3 100644
--- a/classes/Tools.php
+++ b/classes/Tools.php
@@ -90,6 +90,7 @@ class ToolsCore
*/
public static function redirectLink($url)
{
+ $context = Context::getContext();
if (!preg_match('@^https?://@i', $url))
{
if (strpos($url, __PS_BASE_URI__) !== FALSE && strpos($url, __PS_BASE_URI__) == 0)
@@ -1634,13 +1635,6 @@ class ToolsCore
$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'], '/').'([0-9]+)\-[a-zA-Z0-9-]*\.html'] = 'index.php?controller=product&id_product=$1 [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9]+)\-[a-zA-Z0-9-]*'] = 'index.php?controller=category&id_category=$1 [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'[a-zA-Z0-9-]*/([0-9]+)\-[a-zA-Z0-9-]*\.html'] = 'index.php?controller=product&id_product=$1 [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9]+)__([a-zA-Z0-9-]*)'] = 'index.php?controller=supplier&id_supplier=$1 [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9]+)_([a-zA-Z0-9-]*)'] = 'index.php?controller=manufacturer&id_manufacturer=$1 [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'content/([0-9]+)\-([a-zA-Z0-9-]*)'] = 'index.php?controller=cms&id_cms=$1 [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'content/category/([0-9]+)\-([a-zA-Z0-9-]*)'] = 'index.php?controller=cms&id_cms_category=$1 [QSA,L]';
if ($multilang)
{
@@ -1658,14 +1652,6 @@ class ToolsCore
$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]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9]+)\-[a-zA-Z0-9-]*\.html'] = 'index.php?controller=product&id_product=$1&id_shop='.$uri['id_shop'].' [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'[a-zA-Z0-9-]*/([0-9]+)\-[a-zA-Z0-9-]*\.html'] = 'index.php?controller=product&id_product=$1&id_shop='.$uri['id_shop'].' [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9]+)\-[a-zA-Z0-9-]*'] = 'index.php?controller=category&id_category=$1&id_shop='.$uri['id_shop'].' [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9]+)__([a-zA-Z0-9-]*)'] = 'index.php?controller=supplier&id_supplier=$1&id_shop='.$uri['id_shop'].' [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'([0-9]+)_([a-zA-Z0-9-]*)'] = 'index.php?controller=manufacturer&id_manufacturer=$1&id_shop='.$uri['id_shop'].' [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'content/([0-9]+)\-([a-zA-Z0-9-]*)'] = 'index.php?controller=cms&id_cms=$1&id_shop='.$uri['id_shop'].' [QSA,L]';
- //$tab['RewriteRule'][$domain]['content']['^'.ltrim($uri['uri'], '/').'content/category/([0-9]+)\-([a-zA-Z0-9-]*)'] = 'index.php?controller=cms&id_cms_category=$1&id_shop='.$uri['id_shop'].' [QSA,L]';
-
Language::loadLanguages();
$default_meta = Meta::getMetasByIdLang((int)Configuration::get('PS_LANG_DEFAULT'), new Shop($uri['id_shop']));
@@ -1712,6 +1698,8 @@ class ToolsCore
// fwrite($writeFd, $tab['RewriteRule']['comment']."\n");
// Webservice needs apache_mod_rewrite in order to work
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)
{
foreach ($row AS $uri)
diff --git a/config/config.inc.php b/config/config.inc.php
index 9e83230d4..c31ceea48 100644
--- a/config/config.inc.php
+++ b/config/config.inc.php
@@ -99,6 +99,33 @@ Language::loadLanguages();
/* Loading default country */
$defaultCountry = new Country((int)(Configuration::get('PS_COUNTRY_DEFAULT')), Configuration::get('PS_LANG_DEFAULT'));
+/* Instantiate cookie */
+if (defined('PS_ADMIN_DIR'))
+{
+ $currentFileName = array_reverse(explode("/", $_SERVER['SCRIPT_NAME']));
+ $cookie = new Cookie('psAdmin', substr($_SERVER['SCRIPT_NAME'], strlen(__PS_BASE_URI__), -strlen($currentFileName['0'])));
+}
+else
+ $cookie = new Cookie('ps');
+Context::getContext()->cookie = $cookie;
+
+/* Instantiate language */
+if (defined('PS_ADMIN_DIR'))
+{
+ $employee = new Employee($cookie->id_employee);
+ Context::getContext()->employee = $employee;
+
+ $cookie->id_lang = (int)$employee->id_lang;
+ $language = new Language($cookie->id_lang ? $cookie->id_lang : Configuration::get('PS_LANG_DEFAULT'));
+}
+else
+{
+ if (!Validate::isLoadedObject($language = new Language($cookie->id_lang)))
+ $language = new Language(Configuration::get('PS_LANG_DEFAULT'));
+}
+
+Context::getContext()->language = $language;
+
/* It is not safe to rely on the system's timezone settings, and this would generate a PHP Strict Standards notice. */
if (function_exists('date_default_timezone_set'))
@date_default_timezone_set(Configuration::get('PS_TIMEZONE'));