// Blocklmayered : Fix bug with creation of layered_filter + On module installation a layered_filter is created

This commit is contained in:
mDeflotte
2012-02-13 09:55:07 +00:00
parent a85e150047
commit f9566b1429
+178 -148
View File
@@ -102,24 +102,23 @@ class BlockLayered extends Module
Configuration::deleteByName('PS_LAYERED_FILTER_PRICE_USETAX'); Configuration::deleteByName('PS_LAYERED_FILTER_PRICE_USETAX');
Configuration::deleteByName('PS_LAYERED_FILTER_CATEGORY_DEPTH'); Configuration::deleteByName('PS_LAYERED_FILTER_CATEGORY_DEPTH');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_price_index'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_price_index');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_friendly_url'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_friendly_url');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_indexable_attribute_group'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_indexable_attribute_group');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_indexable_feature'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_indexable_feature');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_indexable_feature_lang_value'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_indexable_feature_lang_value');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_category'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_category');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_filter'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_filter');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_filter_shop'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_product_attribute');
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_product_attribute');
return parent::uninstall(); return parent::uninstall();
} }
private static function installPriceIndexTable() private static function installPriceIndexTable()
{ {
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_price_index`'); Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_price_index`');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE `'._DB_PREFIX_.'layered_price_index` ( CREATE TABLE `'._DB_PREFIX_.'layered_price_index` (
`id_product` INT NOT NULL, `id_product` INT NOT NULL,
`id_currency` INT NOT NULL, `id_currency` INT NOT NULL,
@@ -133,8 +132,8 @@ class BlockLayered extends Module
private function installFriendlyUrlTable() private function installFriendlyUrlTable()
{ {
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_friendly_url`'); Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_friendly_url`');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE `'._DB_PREFIX_.'layered_friendly_url` ( CREATE TABLE `'._DB_PREFIX_.'layered_friendly_url` (
`id_layered_friendly_url` INT NOT NULL AUTO_INCREMENT, `id_layered_friendly_url` INT NOT NULL AUTO_INCREMENT,
`url_key` varchar(32) NOT NULL, `url_key` varchar(32) NOT NULL,
@@ -143,24 +142,24 @@ class BlockLayered extends Module
PRIMARY KEY (`id_layered_friendly_url`), PRIMARY KEY (`id_layered_friendly_url`),
INDEX `id_lang` (`id_lang`)) ENGINE = '._MYSQL_ENGINE_); INDEX `id_lang` (`id_lang`)) ENGINE = '._MYSQL_ENGINE_);
Db::getInstance()->Execute('CREATE INDEX `url_key` ON `'._DB_PREFIX_.'layered_friendly_url`(url_key(5))'); Db::getInstance()->execute('CREATE INDEX `url_key` ON `'._DB_PREFIX_.'layered_friendly_url`(url_key(5))');
} }
private function installIndexableAttributeTable() private function installIndexableAttributeTable()
{ {
// Attributes Groups // Attributes Groups
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_attribute_group`'); Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_attribute_group`');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE `'._DB_PREFIX_.'layered_indexable_attribute_group` ( CREATE TABLE `'._DB_PREFIX_.'layered_indexable_attribute_group` (
`id_attribute_group` INT NOT NULL, `id_attribute_group` INT NOT NULL,
`indexable` BOOL NOT NULL DEFAULT 0, `indexable` BOOL NOT NULL DEFAULT 0,
PRIMARY KEY (`id_attribute_group`)) ENGINE = '._MYSQL_ENGINE_); PRIMARY KEY (`id_attribute_group`)) ENGINE = '._MYSQL_ENGINE_);
Db::getInstance()->Execute(' Db::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'layered_indexable_attribute_group` INSERT INTO `'._DB_PREFIX_.'layered_indexable_attribute_group`
SELECT id_attribute_group, 1 FROM `'._DB_PREFIX_.'attribute_group`'); SELECT id_attribute_group, 1 FROM `'._DB_PREFIX_.'attribute_group`');
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_attribute_group_lang_value`'); Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_attribute_group_lang_value`');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE `'._DB_PREFIX_.'layered_indexable_attribute_group_lang_value` ( CREATE TABLE `'._DB_PREFIX_.'layered_indexable_attribute_group_lang_value` (
`id_attribute_group` INT NOT NULL, `id_attribute_group` INT NOT NULL,
`id_lang` INT NOT NULL, `id_lang` INT NOT NULL,
@@ -169,8 +168,8 @@ class BlockLayered extends Module
PRIMARY KEY (`id_attribute_group`, `id_lang`)) ENGINE = '._MYSQL_ENGINE_); PRIMARY KEY (`id_attribute_group`, `id_lang`)) ENGINE = '._MYSQL_ENGINE_);
// Attributes // Attributes
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_attribute_lang_value`'); Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_attribute_lang_value`');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE `'._DB_PREFIX_.'layered_indexable_attribute_lang_value` ( CREATE TABLE `'._DB_PREFIX_.'layered_indexable_attribute_lang_value` (
`id_attribute` INT NOT NULL, `id_attribute` INT NOT NULL,
`id_lang` INT NOT NULL, `id_lang` INT NOT NULL,
@@ -180,19 +179,19 @@ class BlockLayered extends Module
// Features // Features
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_feature`'); Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_feature`');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE `'._DB_PREFIX_.'layered_indexable_feature` ( CREATE TABLE `'._DB_PREFIX_.'layered_indexable_feature` (
`id_feature` INT NOT NULL, `id_feature` INT NOT NULL,
`indexable` BOOL NOT NULL DEFAULT 0, `indexable` BOOL NOT NULL DEFAULT 0,
PRIMARY KEY (`id_feature`)) ENGINE = '._MYSQL_ENGINE_); PRIMARY KEY (`id_feature`)) ENGINE = '._MYSQL_ENGINE_);
Db::getInstance()->Execute(' Db::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'layered_indexable_feature` INSERT INTO `'._DB_PREFIX_.'layered_indexable_feature`
SELECT id_feature, 1 FROM `'._DB_PREFIX_.'feature`'); SELECT id_feature, 1 FROM `'._DB_PREFIX_.'feature`');
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_feature_lang_value`'); Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_feature_lang_value`');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE `'._DB_PREFIX_.'layered_indexable_feature_lang_value` ( CREATE TABLE `'._DB_PREFIX_.'layered_indexable_feature_lang_value` (
`id_feature` INT NOT NULL, `id_feature` INT NOT NULL,
`id_lang` INT NOT NULL, `id_lang` INT NOT NULL,
@@ -201,8 +200,8 @@ class BlockLayered extends Module
PRIMARY KEY (`id_feature`, `id_lang`)) ENGINE = '._MYSQL_ENGINE_); PRIMARY KEY (`id_feature`, `id_lang`)) ENGINE = '._MYSQL_ENGINE_);
// Features values // Features values
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_feature_value_lang_value`'); Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_indexable_feature_value_lang_value`');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE `'._DB_PREFIX_.'layered_indexable_feature_value_lang_value` ( CREATE TABLE `'._DB_PREFIX_.'layered_indexable_feature_value_lang_value` (
`id_feature_value` INT NOT NULL, `id_feature_value` INT NOT NULL,
`id_lang` INT NOT NULL, `id_lang` INT NOT NULL,
@@ -217,8 +216,8 @@ class BlockLayered extends Module
*/ */
public function installProductAttributeTable() public function installProductAttributeTable()
{ {
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_product_attribute`'); Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'layered_product_attribute`');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE `'._DB_PREFIX_.'layered_product_attribute` ( CREATE TABLE `'._DB_PREFIX_.'layered_product_attribute` (
`id_attribute` int(10) unsigned NOT NULL, `id_attribute` int(10) unsigned NOT NULL,
`id_product` int(10) unsigned NOT NULL, `id_product` int(10) unsigned NOT NULL,
@@ -238,7 +237,7 @@ class BlockLayered extends Module
else else
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_product_attribute WHERE id_product = '.(int)$id_product); Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_product_attribute WHERE id_product = '.(int)$id_product);
Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'layered_product_attribute` (`id_attribute`, `id_product`, `id_attribute_group`) Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'layered_product_attribute` (`id_attribute`, `id_product`, `id_attribute_group`)
SELECT pac.id_attribute, pa.id_product, ag.id_attribute_group SELECT pac.id_attribute, pa.id_product, ag.id_attribute_group
FROM '._DB_PREFIX_.'product_attribute pa FROM '._DB_PREFIX_.'product_attribute pa
INNER JOIN '._DB_PREFIX_.'product_attribute_combination pac ON pac.id_product_attribute = pa.id_product_attribute INNER JOIN '._DB_PREFIX_.'product_attribute_combination pac ON pac.id_product_attribute = pa.id_product_attribute
@@ -258,7 +257,7 @@ class BlockLayered extends Module
Db::getInstance()->execute('TRUNCATE '._DB_PREFIX_.'layered_friendly_url'); Db::getInstance()->execute('TRUNCATE '._DB_PREFIX_.'layered_friendly_url');
$attributeValuesByLang = array(); $attributeValuesByLang = array();
$filters = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT lc.*, id_lang, name, link_rewrite, cl.id_category $filters = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT lc.*, id_lang, name, link_rewrite, cl.id_category
FROM '._DB_PREFIX_.'layered_category lc FROM '._DB_PREFIX_.'layered_category lc
INNER JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = lc.id_category AND lc.id_category <> 1 ) INNER JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = lc.id_category AND lc.id_category <> 1 )
GROUP BY type, id_value, id_lang'); GROUP BY type, id_value, id_lang');
@@ -269,7 +268,7 @@ class BlockLayered extends Module
switch ($filter['type']) switch ($filter['type'])
{ {
case 'id_attribute_group': case 'id_attribute_group':
$attributes = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' $attributes = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT agl.public_name name, a.id_attribute_group id_name, al.name value, a.id_attribute id_value, al.id_lang, SELECT agl.public_name name, a.id_attribute_group id_name, al.name value, a.id_attribute id_value, al.id_lang,
liagl.url_name name_url_name, lial.url_name value_url_name liagl.url_name name_url_name, lial.url_name value_url_name
FROM '._DB_PREFIX_.'attribute_group ag FROM '._DB_PREFIX_.'attribute_group ag
@@ -300,7 +299,7 @@ class BlockLayered extends Module
break; break;
case 'id_feature': case 'id_feature':
$features = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' $features = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT fl.name name, fl.id_feature id_name, fvl.id_feature_value id_value, fvl.value value, fl.id_lang, fl.id_lang, SELECT fl.name name, fl.id_feature id_name, fvl.id_feature_value id_value, fvl.value value, fl.id_lang, fl.id_lang,
lifl.url_name name_url_name, lifvl.url_name value_url_name lifl.url_name name_url_name, lifvl.url_name value_url_name
FROM '._DB_PREFIX_.'feature_lang fl FROM '._DB_PREFIX_.'feature_lang fl
@@ -330,7 +329,7 @@ class BlockLayered extends Module
break; break;
case 'category': case 'category':
$categories = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' $categories = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT cl.name, cl.id_lang, c.id_category SELECT cl.name, cl.id_lang, c.id_category
FROM '._DB_PREFIX_.'category c FROM '._DB_PREFIX_.'category c
INNER JOIN '._DB_PREFIX_.'category_lang cl ON (c.id_category = cl.id_category) INNER JOIN '._DB_PREFIX_.'category_lang cl ON (c.id_category = cl.id_category)
@@ -348,7 +347,7 @@ class BlockLayered extends Module
break; break;
case 'manufacturer': case 'manufacturer':
$manufacturers = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' $manufacturers = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT m.name as name,l.id_lang as id_lang, id_manufacturer SELECT m.name as name,l.id_lang as id_lang, id_manufacturer
FROM '._DB_PREFIX_.'manufacturer m , '._DB_PREFIX_.'lang l FROM '._DB_PREFIX_.'manufacturer m , '._DB_PREFIX_.'lang l
WHERE l.id_lang = '.(int)$filter['id_lang'].' '); WHERE l.id_lang = '.(int)$filter['id_lang'].' ');
@@ -491,15 +490,15 @@ class BlockLayered extends Module
if (!$params['id_feature'] || Tools::getValue('layered_indexable') === false) if (!$params['id_feature'] || Tools::getValue('layered_indexable') === false)
return; return;
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature WHERE id_feature = '.(int)$params['id_feature']); Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature WHERE id_feature = '.(int)$params['id_feature']);
Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_feature VALUES ('.(int)$params['id_feature'].', '.(int)Tools::getValue('layered_indexable').')'); Db::getInstance()->execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_feature VALUES ('.(int)$params['id_feature'].', '.(int)Tools::getValue('layered_indexable').')');
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature_lang_value WHERE id_feature = '.(int)$params['id_feature']); // don't care about the id_lang Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature_lang_value WHERE id_feature = '.(int)$params['id_feature']); // don't care about the id_lang
foreach (Language::getLanguages(false) as $language) foreach (Language::getLanguages(false) as $language)
{ {
// Data are validated by method "hookPostProcessFeature" // Data are validated by method "hookPostProcessFeature"
$id_lang = (int)$language['id_lang']; $id_lang = (int)$language['id_lang'];
Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_feature_lang_value Db::getInstance()->execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_feature_lang_value
VALUES ('.(int)$params['id_feature'].', '.$id_lang.', \''.pSQL(Tools::link_rewrite(Tools::getValue('url_name_'.$id_lang))).'\', VALUES ('.(int)$params['id_feature'].', '.$id_lang.', \''.pSQL(Tools::link_rewrite(Tools::getValue('url_name_'.$id_lang))).'\',
\''.pSQL(Tools::safeOutput(Tools::getValue('meta_title_'.$id_lang), true)).'\')'); \''.pSQL(Tools::safeOutput(Tools::getValue('meta_title_'.$id_lang), true)).'\')');
} }
@@ -510,12 +509,12 @@ class BlockLayered extends Module
if (!$params['id_feature_value']) if (!$params['id_feature_value'])
return; return;
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature_value_lang_value WHERE id_feature_value = '.(int)$params['id_feature_value']); // don't care about the id_lang Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature_value_lang_value WHERE id_feature_value = '.(int)$params['id_feature_value']); // don't care about the id_lang
foreach (Language::getLanguages(false) as $language) foreach (Language::getLanguages(false) as $language)
{ {
// Data are validated by method "hookPostProcessFeatureValue" // Data are validated by method "hookPostProcessFeatureValue"
$id_lang = (int)$language['id_lang']; $id_lang = (int)$language['id_lang'];
Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_feature_value_lang_value Db::getInstance()->execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_feature_value_lang_value
VALUES ('.(int)$params['id_feature_value'].', '.$id_lang.', \''.pSQL(Tools::link_rewrite(Tools::getValue('url_name_'.$id_lang))).'\', VALUES ('.(int)$params['id_feature_value'].', '.$id_lang.', \''.pSQL(Tools::link_rewrite(Tools::getValue('url_name_'.$id_lang))).'\',
\''.pSQL(Tools::safeOutput(Tools::getValue('meta_title_'.$id_lang), true)).'\')'); \''.pSQL(Tools::safeOutput(Tools::getValue('meta_title_'.$id_lang), true)).'\')');
} }
@@ -525,7 +524,7 @@ class BlockLayered extends Module
{ {
if (!$params['id_feature_value']) if (!$params['id_feature_value'])
return; return;
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature_value_lang_value WHERE id_feature_value = '.(int)$params['id_feature_value']); Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature_value_lang_value WHERE id_feature_value = '.(int)$params['id_feature_value']);
} }
public function hookPostProcessFeatureValue($params) public function hookPostProcessFeatureValue($params)
@@ -547,7 +546,7 @@ class BlockLayered extends Module
else else
$return = ''; $return = '';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS( $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
'SELECT url_name, meta_title, id_lang FROM '._DB_PREFIX_.'layered_indexable_feature_value_lang_value 'SELECT url_name, meta_title, id_lang FROM '._DB_PREFIX_.'layered_indexable_feature_value_lang_value
WHERE id_feature_value = '.(int)$params['id_feature_value']); WHERE id_feature_value = '.(int)$params['id_feature_value']);
if ($result) if ($result)
@@ -597,12 +596,12 @@ class BlockLayered extends Module
if (!$params['id_attribute']) if (!$params['id_attribute'])
return; return;
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_lang_value WHERE id_attribute = '.(int)$params['id_attribute']); // don't care about the id_lang Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_lang_value WHERE id_attribute = '.(int)$params['id_attribute']); // don't care about the id_lang
foreach (Language::getLanguages(false) as $language) foreach (Language::getLanguages(false) as $language)
{ {
// Data are validated by method "hookPostProcessAttribute" // Data are validated by method "hookPostProcessAttribute"
$id_lang = (int)$language['id_lang']; $id_lang = (int)$language['id_lang'];
Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_attribute_lang_value Db::getInstance()->execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_attribute_lang_value
VALUES ('.(int)$params['id_attribute'].', '.$id_lang.', \''.pSQL(Tools::link_rewrite(Tools::getValue('url_name_'.$id_lang))).'\', VALUES ('.(int)$params['id_attribute'].', '.$id_lang.', \''.pSQL(Tools::link_rewrite(Tools::getValue('url_name_'.$id_lang))).'\',
\''.pSQL(Tools::safeOutput(Tools::getValue('meta_title_'.$id_lang), true)).'\')'); \''.pSQL(Tools::safeOutput(Tools::getValue('meta_title_'.$id_lang), true)).'\')');
} }
@@ -612,7 +611,7 @@ class BlockLayered extends Module
{ {
if (!$params['id_attribute']) if (!$params['id_attribute'])
return; return;
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_lang_value WHERE id_attribute = '.(int)$params['id_attribute']); Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_lang_value WHERE id_attribute = '.(int)$params['id_attribute']);
} }
public function hookPostProcessAttribute($params) public function hookPostProcessAttribute($params)
@@ -634,7 +633,7 @@ class BlockLayered extends Module
else else
$return = ''; $return = '';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS( $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
'SELECT url_name, meta_title, id_lang FROM '._DB_PREFIX_.'layered_indexable_attribute_lang_value 'SELECT url_name, meta_title, id_lang FROM '._DB_PREFIX_.'layered_indexable_attribute_lang_value
WHERE id_attribute = '.(int)$params['id_attribute']); WHERE id_attribute = '.(int)$params['id_attribute']);
if ($result) if ($result)
@@ -687,7 +686,7 @@ class BlockLayered extends Module
{ {
if (!$params['id_feature']) if (!$params['id_feature'])
return; return;
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature WHERE id_feature = '.(int)$params['id_feature']); Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_feature WHERE id_feature = '.(int)$params['id_feature']);
} }
public function hookAfterSaveAttributeGroup($params) public function hookAfterSaveAttributeGroup($params)
@@ -695,15 +694,15 @@ class BlockLayered extends Module
if (!$params['id_attribute_group'] || Tools::getValue('layered_indexable') === false) if (!$params['id_attribute_group'] || Tools::getValue('layered_indexable') === false)
return; return;
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_group WHERE id_attribute_group = '.(int)$params['id_attribute_group']); Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_group WHERE id_attribute_group = '.(int)$params['id_attribute_group']);
Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_attribute_group VALUES ('.(int)$params['id_attribute_group'].', '.(int)Tools::getValue('layered_indexable').')'); Db::getInstance()->execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_attribute_group VALUES ('.(int)$params['id_attribute_group'].', '.(int)Tools::getValue('layered_indexable').')');
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value WHERE id_attribute_group = '.(int)$params['id_attribute_group']); // don't care about the id_lang Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value WHERE id_attribute_group = '.(int)$params['id_attribute_group']); // don't care about the id_lang
foreach (Language::getLanguages(false) as $language) foreach (Language::getLanguages(false) as $language)
{ {
// Data are validated by method "hookPostProcessAttributeGroup" // Data are validated by method "hookPostProcessAttributeGroup"
$id_lang = (int)$language['id_lang']; $id_lang = (int)$language['id_lang'];
Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value Db::getInstance()->execute('INSERT INTO '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value
VALUES ('.(int)$params['id_attribute_group'].', '.$id_lang.', \''.pSQL(Tools::link_rewrite(Tools::getValue('url_name_'.$id_lang))).'\', VALUES ('.(int)$params['id_attribute_group'].', '.$id_lang.', \''.pSQL(Tools::link_rewrite(Tools::getValue('url_name_'.$id_lang))).'\',
\''.pSQL(Tools::safeOutput(Tools::getValue('meta_title_'.$id_lang), true)).'\')'); \''.pSQL(Tools::safeOutput(Tools::getValue('meta_title_'.$id_lang), true)).'\')');
} }
@@ -735,8 +734,8 @@ class BlockLayered extends Module
if (!$params['id_attribute_group']) if (!$params['id_attribute_group'])
return; return;
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_group WHERE id_attribute_group = '.(int)$params['id_attribute_group']); Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_group WHERE id_attribute_group = '.(int)$params['id_attribute_group']);
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value WHERE id_attribute_group = '.(int)$params['id_attribute_group']); Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value WHERE id_attribute_group = '.(int)$params['id_attribute_group']);
} }
public function hookAttributeGroupForm($params) public function hookAttributeGroupForm($params)
@@ -747,7 +746,7 @@ class BlockLayered extends Module
WHERE id_attribute_group = '.(int)$params['id_attribute_group']); WHERE id_attribute_group = '.(int)$params['id_attribute_group']);
$langValue = array(); $langValue = array();
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS( $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
'SELECT url_name, meta_title, id_lang FROM '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value 'SELECT url_name, meta_title, id_lang FROM '._DB_PREFIX_.'layered_indexable_attribute_group_lang_value
WHERE id_attribute_group = '.(int)$params['id_attribute_group']); WHERE id_attribute_group = '.(int)$params['id_attribute_group']);
if ($result) if ($result)
@@ -820,7 +819,7 @@ class BlockLayered extends Module
$indexable = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT indexable FROM '._DB_PREFIX_.'layered_indexable_feature WHERE id_feature = '.(int)$params['id_feature']); $indexable = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT indexable FROM '._DB_PREFIX_.'layered_indexable_feature WHERE id_feature = '.(int)$params['id_feature']);
$langValue = array(); $langValue = array();
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS( $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
'SELECT url_name, meta_title, id_lang FROM '._DB_PREFIX_.'layered_indexable_feature_lang_value 'SELECT url_name, meta_title, id_lang FROM '._DB_PREFIX_.'layered_indexable_feature_lang_value
WHERE id_feature = '.(int)$params['id_feature']); WHERE id_feature = '.(int)$params['id_feature']);
if ($result) if ($result)
@@ -983,7 +982,7 @@ class BlockLayered extends Module
WHERE `active` = 1 AND psi.id_product is null WHERE `active` = 1 AND psi.id_product is null
ORDER by id_product LIMIT 0,'.(int)$length; ORDER by id_product LIMIT 0,'.(int)$length;
foreach (Db::getInstance()->ExecuteS($query) as $product) foreach (Db::getInstance()->executeS($query) as $product)
self::indexProductPrices((int)$product['id_product'], ($smart && $full)); self::indexProductPrices((int)$product['id_product'], ($smart && $full));
return (int)($cursor + $length); return (int)($cursor + $length);
@@ -995,7 +994,7 @@ class BlockLayered extends Module
if (is_null($groups)) if (is_null($groups))
{ {
$groups = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT id_group FROM `'._DB_PREFIX_.'group_reduction`'); $groups = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT id_group FROM `'._DB_PREFIX_.'group_reduction`');
if (!$groups) if (!$groups)
$groups = array(); $groups = array();
} }
@@ -1039,7 +1038,7 @@ class BlockLayered extends Module
else else
$maxTaxRate = 0; $maxTaxRate = 0;
$productMinPrices = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' $productMinPrices = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT id_shop, id_currency, id_country, id_group, from_quantity SELECT id_shop, id_currency, id_country, id_group, from_quantity
FROM `'._DB_PREFIX_.'specific_price` FROM `'._DB_PREFIX_.'specific_price`
WHERE id_product = '.(int)$idProduct); WHERE id_product = '.(int)$idProduct);
@@ -1111,7 +1110,7 @@ class BlockLayered extends Module
'.(int)$minPrice[$currency['id_currency']].', '.(int)$minPrice[$currency['id_currency']].',
'.(int)Tools::ps_round($maxPrice[$currency['id_currency']] * (100 + $maxTaxRate) / 100, 0).')'; '.(int)Tools::ps_round($maxPrice[$currency['id_currency']] * (100 + $maxTaxRate) / 100, 0).')';
Db::getInstance()->Execute(' Db::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'layered_price_index` (id_product, id_currency, id_shop, price_min, price_max) INSERT INTO `'._DB_PREFIX_.'layered_price_index` (id_product, id_currency, id_shop, price_min, price_max)
VALUES '.implode(',', $values).' VALUES '.implode(',', $values).'
ON DUPLICATE KEY UPDATE id_product = id_product # avoid duplicate keys'); ON DUPLICATE KEY UPDATE id_product = id_product # avoid duplicate keys');
@@ -1213,7 +1212,17 @@ class BlockLayered extends Module
public function hookCategoryDeletion($params) public function hookCategoryDeletion($params)
{ {
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_category WHERE id_category = '.(int)$params['category']->id); $layered_filter_list = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT * FROM '._DB_PREFIX_.'layered_filter');
foreach ($layered_filter_list as $layered_filter)
{
$data = unserialize($layered_filter_list['filters']);
if (in_array((int)$params['category']->id, $data['categories']))
{
unset($data['categories'][array_search((int)$params['category']->id, $data['categories'])]);
Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'layered_filter` SET `filters` = \''.pSQL(serialize($data)).'\'');
}
}
$this->buildLayeredCategories();
} }
public function getContent() public function getContent()
@@ -1235,12 +1244,15 @@ class BlockLayered extends Module
else else
{ {
if (isset($_POST['id_layered_filter']) && $_POST['id_layered_filter']) if (isset($_POST['id_layered_filter']) && $_POST['id_layered_filter'])
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_filter WHERE id_layered_filter = '.(int)Tools::getValue('id_layered_filter')); {
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_filter WHERE id_layered_filter = '.(int)Tools::getValue('id_layered_filter'));
$this->buildLayeredCategories();
}
if (Tools::getValue('scope') == 1) if (Tools::getValue('scope') == 1)
{ {
Db::getInstance()->Execute('TRUNCATE TABLE '._DB_PREFIX_.'layered_filter'); Db::getInstance()->execute('TRUNCATE TABLE '._DB_PREFIX_.'layered_filter');
$categories = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT id_category FROM '._DB_PREFIX_.'category'); $categories = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT id_category FROM '._DB_PREFIX_.'category');
foreach ($categories as $category) foreach ($categories as $category)
$_POST['categoryBox'][] = (int)$category['id_category']; $_POST['categoryBox'][] = (int)$category['id_category'];
} }
@@ -1275,24 +1287,15 @@ class BlockLayered extends Module
if (isset($_POST['categoryBox']) && is_array($_POST['categoryBox'])) if (isset($_POST['categoryBox']) && is_array($_POST['categoryBox']))
foreach ($_POST['categoryBox'] as &$categoryBoxTmp) foreach ($_POST['categoryBox'] as &$categoryBoxTmp)
$categoryBoxTmp = (int)$categoryBoxTmp; $categoryBoxTmp = (int)$categoryBoxTmp;
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_category
WHERE
id_category IN ('.implode(',', array_map('intval', $_POST['categoryBox'])).')
AND id_shop IN ('.implode(',', $shop_list).')');
$filterValues = array(); $filterValues = array();
foreach ($_POST['categoryBox'] as $idc) foreach ($_POST['categoryBox'] as $idc)
$filterValues['categories'][] = (int)$idc; $filterValues['categories'][] = (int)$idc;
$filterValues['shop_list'] = $shop_list;
$sqlToInsert = 'INSERT INTO '._DB_PREFIX_.'layered_category (id_category, id_shop, id_value, type, position, filter_show_limit, filter_type) VALUES ';
$values = false; $values = false;
foreach ($_POST['categoryBox'] as $id_category_layered) foreach ($_POST['categoryBox'] as $id_category_layered)
{ {
$n = 0;
foreach ($_POST as $key => $value) foreach ($_POST as $key => $value)
if (substr($key, 0, 17) == 'layered_selection' && $value == 'on') if (substr($key, 0, 17) == 'layered_selection' && $value == 'on')
{ {
@@ -1308,32 +1311,8 @@ class BlockLayered extends Module
'filter_type' => (int)$type, 'filter_type' => (int)$type,
'filter_show_limit' => (int)$limit 'filter_show_limit' => (int)$limit
); );
$n++;
foreach ($shop_list as $id_shop)
{
if ($key == 'layered_selection_stock')
$sqlToInsert .= '('.(int)$id_category_layered.', '.(int)$id_shop.', NULL,\'quantity\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_subcategories')
$sqlToInsert .= '('.(int)$id_category_layered.', '.(int)$id_shop.', NULL,\'category\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_condition')
$sqlToInsert .= '('.(int)$id_category_layered.', '.(int)$id_shop.', NULL,\'condition\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_weight_slider')
$sqlToInsert .= '('.(int)$id_category_layered.', '.(int)$id_shop.', NULL,\'weight\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_price_slider')
$sqlToInsert .= '('.(int)$id_category_layered.', '.(int)$id_shop.', NULL,\'price\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_manufacturer')
$sqlToInsert .= '('.(int)$id_category_layered.', '.(int)$id_shop.', NULL,\'manufacturer\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if (substr($key, 0, 21) == 'layered_selection_ag_')
$sqlToInsert .= '('.(int)$id_category_layered.', '.(int)$id_shop.', '.(int)str_replace('layered_selection_ag_', '', $key).',
\'id_attribute_group\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if (substr($key, 0, 23) == 'layered_selection_feat_')
$sqlToInsert .= '('.(int)$id_category_layered.', '.(int)$id_shop.', '.(int)str_replace('layered_selection_feat_', '', $key).',
\'id_feature\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
}
} }
} }
if ($values)
Db::getInstance()->Execute(rtrim($sqlToInsert, ','));
$valuesToInsert = array( $valuesToInsert = array(
'name' => pSQL(Tools::getValue('layered_tpl_name')), 'name' => pSQL(Tools::getValue('layered_tpl_name')),
@@ -1344,16 +1323,7 @@ class BlockLayered extends Module
$valuesToInsert['id_layered_filter'] = (int)Tools::getValue('id_layered_filter'); $valuesToInsert['id_layered_filter'] = (int)Tools::getValue('id_layered_filter');
Db::getInstance()->autoExecute(_DB_PREFIX_.'layered_filter', $valuesToInsert, 'INSERT'); Db::getInstance()->autoExecute(_DB_PREFIX_.'layered_filter', $valuesToInsert, 'INSERT');
$this->buildLayeredCategories();
if (version_compare(_PS_VERSION_,'1.5','>'))
{
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_filter_shop WHERE `id_layered_filter` = '.(int)$id_layered_filter);
if (isset($assos))
foreach ($assos as $asso)
Db::getInstance()->execute('INSERT INTO layered_filter_shop (`id_layered_filter`, `id_shop`)
VALUES('.$id_layered_filter.', '.(int)$asso['id_shop'].')');
}
$html .= '<div class="conf">'.(version_compare(_PS_VERSION_,'1.5','>') ? '' : '<img src="../img/admin/ok2.png" alt="" />'). $html .= '<div class="conf">'.(version_compare(_PS_VERSION_,'1.5','>') ? '' : '<img src="../img/admin/ok2.png" alt="" />').
$this->l('Your filter').' "'.Tools::safeOutput(Tools::getValue('layered_tpl_name')).'" '. $this->l('Your filter').' "'.Tools::safeOutput(Tools::getValue('layered_tpl_name')).'" '.
@@ -1383,7 +1353,8 @@ class BlockLayered extends Module
if ($layeredValues) if ($layeredValues)
{ {
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_filter WHERE id_layered_filter = '.(int)$_GET['id_layered_filter'].' LIMIT 1'); Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'layered_filter WHERE id_layered_filter = '.(int)$_GET['id_layered_filter'].' LIMIT 1');
$this->buildLayeredCategories();
$html .= ' $html .= '
<div class="conf">'.(version_compare(_PS_VERSION_,'1.5','>') ? '' : '<img src="../img/admin/ok2.png" alt="" />').' <div class="conf">'.(version_compare(_PS_VERSION_,'1.5','>') ? '' : '<img src="../img/admin/ok2.png" alt="" />').'
@@ -1422,7 +1393,7 @@ class BlockLayered extends Module
</script>'; </script>';
$categoryList = array(); $categoryList = array();
foreach (Db::getInstance()->ExecuteS('SELECT id_category FROM `'._DB_PREFIX_.'category`') as $category) foreach (Db::getInstance()->executeS('SELECT id_category FROM `'._DB_PREFIX_.'category`') as $category)
if ($category['id_category'] != 1) if ($category['id_category'] != 1)
$categoryList[] = $category['id_category']; $categoryList[] = $category['id_category'];
@@ -1582,7 +1553,7 @@ class BlockLayered extends Module
<fieldset class="width4"> <fieldset class="width4">
<legend><img src="../img/admin/cog.gif" alt="" />'.$this->l('Existing filters templates').'</legend>'; <legend><img src="../img/admin/cog.gif" alt="" />'.$this->l('Existing filters templates').'</legend>';
$filtersTemplates = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT * FROM '._DB_PREFIX_.'layered_filter ORDER BY date_add DESC'); $filtersTemplates = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT * FROM '._DB_PREFIX_.'layered_filter ORDER BY date_add DESC');
if (count($filtersTemplates)) if (count($filtersTemplates))
{ {
$html .= '<p>'.count($filtersTemplates).' '.$this->l('filters templates are configured:').'</p> $html .= '<p>'.count($filtersTemplates).' '.$this->l('filters templates are configured:').'</p>
@@ -2303,7 +2274,7 @@ class BlockLayered extends Module
else else
{ {
$n = (int)Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')); $n = (int)Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE'));
$this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' $this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, SELECT p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`,
p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer,
DATEDIFF(p.`date_add`, DATEDIFF(p.`date_add`,
@@ -2604,7 +2575,7 @@ class BlockLayered extends Module
{ {
if (version_compare(_PS_VERSION_,'1.5','>')) if (version_compare(_PS_VERSION_,'1.5','>'))
$sqlQuery['from'] .= Context::getContext()->shop->addSqlAssociation('product', 'p'); $sqlQuery['from'] .= Context::getContext()->shop->addSqlAssociation('product', 'p');
$products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sqlQuery['select']."\n".$sqlQuery['from']."\n".$sqlQuery['join']."\n".$sqlQuery['where']."\n".$sqlQuery['group']); $products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sqlQuery['select']."\n".$sqlQuery['from']."\n".$sqlQuery['join']."\n".$sqlQuery['where']."\n".$sqlQuery['group']);
} }
foreach ($filters as $filterTmp) foreach ($filters as $filterTmp)
@@ -2620,7 +2591,7 @@ class BlockLayered extends Module
if (!empty($sqlQuery['second_query'])) if (!empty($sqlQuery['second_query']))
{ {
$res = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sqlQuery['second_query']); $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sqlQuery['second_query']);
if ($res) if ($res)
$products = array_merge($products, $res); $products = array_merge($products, $res);
} }
@@ -2914,7 +2885,7 @@ class BlockLayered extends Module
$nonIndexable = array(); $nonIndexable = array();
// Get all non indexable attribute groups // Get all non indexable attribute groups
foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT public_name SELECT public_name
FROM `'._DB_PREFIX_.'attribute_group_lang` agl FROM `'._DB_PREFIX_.'attribute_group_lang` agl
LEFT JOIN `'._DB_PREFIX_.'layered_indexable_attribute_group` liag LEFT JOIN `'._DB_PREFIX_.'layered_indexable_attribute_group` liag
@@ -2924,7 +2895,7 @@ class BlockLayered extends Module
$nonIndexable[] = Tools::link_rewrite($attribute['public_name']); $nonIndexable[] = Tools::link_rewrite($attribute['public_name']);
// Get all non indexable features // Get all non indexable features
foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT name SELECT name
FROM `'._DB_PREFIX_.'feature_lang` fl FROM `'._DB_PREFIX_.'feature_lang` fl
LEFT JOIN `'._DB_PREFIX_.'layered_indexable_feature` lif LEFT JOIN `'._DB_PREFIX_.'layered_indexable_feature` lif
@@ -3244,7 +3215,7 @@ class BlockLayered extends Module
foreach ($categoryBox as &$value) foreach ($categoryBox as &$value)
$value = (int)$value; $value = (int)$value;
$attributeGroups = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' $attributeGroups = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT ag.id_attribute_group, ag.is_color_group, agl.name, COUNT(DISTINCT(a.id_attribute)) n SELECT ag.id_attribute_group, ag.is_color_group, agl.name, COUNT(DISTINCT(a.id_attribute)) n
FROM '._DB_PREFIX_.'attribute_group ag FROM '._DB_PREFIX_.'attribute_group ag
LEFT JOIN '._DB_PREFIX_.'attribute_group_lang agl ON (agl.id_attribute_group = ag.id_attribute_group) LEFT JOIN '._DB_PREFIX_.'attribute_group_lang agl ON (agl.id_attribute_group = ag.id_attribute_group)
@@ -3257,7 +3228,7 @@ class BlockLayered extends Module
(count($categoryBox) ? ' AND cp.id_category IN ('.implode(',', $categoryBox).')' : '').' (count($categoryBox) ? ' AND cp.id_category IN ('.implode(',', $categoryBox).')' : '').'
GROUP BY ag.id_attribute_group'); GROUP BY ag.id_attribute_group');
$features = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' $features = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT fl.id_feature, fl.name, COUNT(DISTINCT(fv.id_feature_value)) n SELECT fl.id_feature, fl.name, COUNT(DISTINCT(fv.id_feature_value)) n
FROM '._DB_PREFIX_.'feature_lang fl FROM '._DB_PREFIX_.'feature_lang fl
LEFT JOIN '._DB_PREFIX_.'feature_value fv ON (fv.id_feature = fl.id_feature) LEFT JOIN '._DB_PREFIX_.'feature_value fv ON (fv.id_feature = fl.id_feature)
@@ -3463,15 +3434,12 @@ class BlockLayered extends Module
$(\'#selected_filters li\').remove(); $(\'#selected_filters li\').remove();
'; ';
foreach ($layeredValues as $key => $layeredValue) foreach ($layeredValues as $key => $layeredValue)
if ($key != 'categories') if ($key != 'categories' && $key != 'shop_list')
{
$html .= ' $html .= '
$(\'#'.$key.'\').click(); $(\'#'.$key.'\').click();
$(\'select[name='.$key.'_filter_type]\').val('.$layeredValue['filter_type'].'); $(\'select[name='.$key.'_filter_type]\').val('.$layeredValue['filter_type'].');
$(\'select[name='.$key.'_filter_show_limit]\').val('.$layeredValue['filter_show_limit'].'); $(\'select[name='.$key.'_filter_show_limit]\').val('.$layeredValue['filter_show_limit'].');
'; ';
}
if (isset($layeredValues['categories']) && count($layeredValues['categories'])) if (isset($layeredValues['categories']) && count($layeredValues['categories']))
{ {
@@ -3663,8 +3631,8 @@ class BlockLayered extends Module
@ini_set('memory_limit', '128M'); @ini_set('memory_limit', '128M');
/* Delete and re-create the layered categories table */ /* Delete and re-create the layered categories table */
Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_category'); Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_category');
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'layered_category` ( CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'layered_category` (
`id_layered_category` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_layered_category` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`id_shop` INT(11) UNSIGNED NOT NULL, `id_shop` INT(11) UNSIGNED NOT NULL,
@@ -3678,26 +3646,21 @@ class BlockLayered extends Module
KEY `id_category` (`id_category`,`type`) KEY `id_category` (`id_category`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;'); /* MyISAM + latin1 = Smaller/faster */ ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;'); /* MyISAM + latin1 = Smaller/faster */
Db::getInstance()->Execute(' Db::getInstance()->execute('
CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'layered_filter` ( CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'layered_filter` (
`id_layered_filter` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `id_layered_filter` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(64) NOT NULL, `name` VARCHAR(64) NOT NULL,
`filters` TEXT NULL, `filters` TEXT NULL,
`n_categories` INT(10) UNSIGNED NOT NULL, `n_categories` INT(10) UNSIGNED NOT NULL,
`date_add` DATETIME NOT NULL)'); `date_add` DATETIME NOT NULL)');
Db::getInstance()->Execute('
CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'layered_filter_shop` (
`id_layered_filter` INT(10) UNSIGNED NOT NULL,
`id_shop` INT(11) UNSIGNED NOT NULL,
PRIMARY KEY (`id_layered_filter`, `id_shop`),
KEY `id_shop` (`id_shop`))');
} }
public function rebuildLayeredCache($productsIds = array(), $categoriesIds = array()) public function rebuildLayeredCache($productsIds = array(), $categoriesIds = array())
{ {
@set_time_limit(0); @set_time_limit(0);
$filter_data = array('categories' => array());
/* Set memory limit to 128M only if current is lower */ /* Set memory limit to 128M only if current is lower */
$memory_limit = @ini_get('memory_limit'); $memory_limit = @ini_get('memory_limit');
if (substr($memory_limit, -1) != 'G' && ((substr($memory_limit, -1) == 'M' && substr($memory_limit, 0, -1) < 128) || is_numeric($memory_limit) && (intval($memory_limit) < 131072))) if (substr($memory_limit, -1) != 'G' && ((substr($memory_limit, -1) == 'M' && substr($memory_limit, 0, -1) < 128) || is_numeric($memory_limit) && (intval($memory_limit) < 131072)))
@@ -3749,6 +3712,7 @@ class BlockLayered extends Module
AND p.id_product IN ('.implode(',', $productsIds).')' : '').' AND (fv.custom IS NULL OR fv.custom = 0) AND p.id_product IN ('.implode(',', $productsIds).')' : '').' AND (fv.custom IS NULL OR fv.custom = 0)
GROUP BY p.id_product'); GROUP BY p.id_product');
$toInsert = false;
while ($product = $db->nextRow($result)) while ($product = $db->nextRow($result))
{ {
$a = $c = $f = array(); $a = $c = $f = array();
@@ -3764,67 +3728,133 @@ class BlockLayered extends Module
else else
$shop_list = array(0); $shop_list = array(0);
$queryCategory = 'INSERT INTO '._DB_PREFIX_.'layered_category (id_category, id_shop, id_value, type, position) VALUES '; $filter_data['shop_list'] = $shop_list;
$toInsert = false;
foreach ($shop_list as $id_shop) foreach ($shop_list as $id_shop)
foreach ($c as $id_category => $category) foreach ($c as $id_category => $category)
{ {
if (!in_array($id_category, $filter_data['categories']))
$filter_data['categories'][] = $id_category;
if (!isset($nCategories[(int)$id_category])) if (!isset($nCategories[(int)$id_category]))
$nCategories[(int)$id_category] = 1; $nCategories[(int)$id_category] = 1;
if (!isset($doneCategories[(int)$id_category]['cat'])) if (!isset($doneCategories[(int)$id_category]['cat']))
{ {
$filter_data['layered_selection_subcategories'] = array('filter_type' => 0, 'filter_show_limit' => 0);
$doneCategories[(int)$id_category]['cat'] = true; $doneCategories[(int)$id_category]['cat'] = true;
$queryCategory .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'category\','.(int)$nCategories[(int)$id_category]++.'),';
$toInsert = true; $toInsert = true;
} }
foreach ($a as $kAttribute => $attribute) foreach ($a as $kAttribute => $attribute)
if (!isset($doneCategories[(int)$id_category]['a'.(int)$attributeGroupsById[(int)$kAttribute]])) if (!isset($doneCategories[(int)$id_category]['a'.(int)$attributeGroupsById[(int)$kAttribute]]))
{ {
$filter_data['layered_selection_ag_'.(int)$attributeGroupsById[(int)$kAttribute]] = array('filter_type' => 0, 'filter_show_limit' => 0);
$doneCategories[(int)$id_category]['a'.(int)$attributeGroupsById[(int)$kAttribute]] = true; $doneCategories[(int)$id_category]['a'.(int)$attributeGroupsById[(int)$kAttribute]] = true;
$queryCategory .= '('.(int)$id_category.', '.(int)$id_shop.','.(int)$attributeGroupsById[(int)$kAttribute].',\'id_attribute_group\','.(int)$nCategories[(int)$id_category]++.'),';
$toInsert = true; $toInsert = true;
} }
foreach ($f as $kFeature => $feature) foreach ($f as $kFeature => $feature)
if (!isset($doneCategories[(int)$id_category]['f'.(int)$featuresById[(int)$kFeature]])) if (!isset($doneCategories[(int)$id_category]['f'.(int)$featuresById[(int)$kFeature]]))
{ {
$filter_data['layered_selection_feat_'.(int)$featuresById[(int)$kFeature]] = array('filter_type' => 0, 'filter_show_limit' => 0);
$doneCategories[(int)$id_category]['f'.(int)$featuresById[(int)$kFeature]] = true; $doneCategories[(int)$id_category]['f'.(int)$featuresById[(int)$kFeature]] = true;
$queryCategory .= '('.(int)$id_category.', '.(int)$id_shop.', '.(int)$featuresById[(int)$kFeature].',\'id_feature\','.(int)$nCategories[(int)$id_category]++.'),';
$toInsert = true; $toInsert = true;
} }
if (!isset($doneCategories[(int)$id_category]['q'])) if (!isset($doneCategories[(int)$id_category]['q']))
{ {
$filter_data['layered_selection_stock'] = array('filter_type' => 0, 'filter_show_limit' => 0);
$doneCategories[(int)$id_category]['q'] = true; $doneCategories[(int)$id_category]['q'] = true;
$queryCategory .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'quantity\','.(int)$nCategories[(int)$id_category]++.'),';
$toInsert = true; $toInsert = true;
} }
if (!isset($doneCategories[(int)$id_category]['m'])) if (!isset($doneCategories[(int)$id_category]['m']))
{ {
$filter_data['layered_selection_manufacturer'] = array('filter_type' => 0, 'filter_show_limit' => 0);
$doneCategories[(int)$id_category]['m'] = true; $doneCategories[(int)$id_category]['m'] = true;
$queryCategory .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'manufacturer\','.(int)$nCategories[(int)$id_category]++.'),';
$toInsert = true; $toInsert = true;
} }
if (!isset($doneCategories[(int)$id_category]['c'])) if (!isset($doneCategories[(int)$id_category]['c']))
{ {
$filter_data['layered_selection_condition'] = array('filter_type' => 0, 'filter_show_limit' => 0);
$doneCategories[(int)$id_category]['c'] = true; $doneCategories[(int)$id_category]['c'] = true;
$queryCategory .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'condition\','.(int)$nCategories[(int)$id_category]++.'),';
$toInsert = true; $toInsert = true;
} }
if (!isset($doneCategories[(int)$id_category]['w'])) if (!isset($doneCategories[(int)$id_category]['w']))
{ {
$filter_data['layered_selection_weight_slider'] = array('filter_type' => 0, 'filter_show_limit' => 0);
$doneCategories[(int)$id_category]['w'] = true; $doneCategories[(int)$id_category]['w'] = true;
$queryCategory .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'weight\','.(int)$nCategories[(int)$id_category]++.'),';
$toInsert = true; $toInsert = true;
} }
if (!isset($doneCategories[(int)$id_category]['p'])) if (!isset($doneCategories[(int)$id_category]['p']))
{ {
$filter_data['layered_selection_price_slider'] = array('filter_type' => 0, 'filter_show_limit' => 0);
$doneCategories[(int)$id_category]['p'] = true; $doneCategories[(int)$id_category]['p'] = true;
$queryCategory .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'price\','.(int)$nCategories[(int)$id_category]++.'),';
$toInsert = true; $toInsert = true;
} }
} }
}
if ($toInsert) if ($toInsert)
Db::getInstance()->Execute(rtrim($queryCategory, ',')); {
Db::getInstance()->execute('INSERT INTO '._DB_PREFIX_.'layered_filter(name, filters, n_categories, date_add)
VALUES (\''.$this->l('My template').' '.date('Y-m-d').'\', \''.pSQL(serialize($filter_data)).'\', '.count($filter_data['categories']).', NOW())');
$this->buildLayeredCategories();
} }
} }
public function buildLayeredCategories()
{
// Get all filter template
$res = Db::getInstance()->executeS('SELECT * FROM '._DB_PREFIX_.'layered_filter ORDER BY date_add DESC');
$categories = array();
// Remove all from layered_category
Db::getInstance()->execute('TRUNCATE '._DB_PREFIX_.'layered_category');
if (!count($res)) // No filters templates defined, nothing else to do
return true;
$sqlToInsert = 'INSERT INTO '._DB_PREFIX_.'layered_category (id_category, id_shop, id_value, type, position, filter_show_limit, filter_type) VALUES ';
$values = false;
foreach ($res as $filter_template)
{
$data = unserialize($filter_template['filters']);
foreach ($data['categories'] as $id_category)
{
$n = 0;
if (!in_array($id_category, $categories)) // Last definition, erase preivious categories defined
{
$categories[] = $id_category;
foreach ($data as $key => $value)
if (substr($key, 0, 17) == 'layered_selection')
{
$values = true;
$type = $value['filter_type'];
$limit = $value['filter_show_limit'];
$n++;
foreach ($data['shop_list'] as $id_shop)
{
if ($key == 'layered_selection_stock')
$sqlToInsert .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'quantity\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_subcategories')
$sqlToInsert .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'category\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_condition')
$sqlToInsert .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'condition\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_weight_slider')
$sqlToInsert .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'weight\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_price_slider')
$sqlToInsert .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'price\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if ($key == 'layered_selection_manufacturer')
$sqlToInsert .= '('.(int)$id_category.', '.(int)$id_shop.', NULL,\'manufacturer\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if (substr($key, 0, 21) == 'layered_selection_ag_')
$sqlToInsert .= '('.(int)$id_category.', '.(int)$id_shop.', '.(int)str_replace('layered_selection_ag_', '', $key).',
\'id_attribute_group\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
else if (substr($key, 0, 23) == 'layered_selection_feat_')
$sqlToInsert .= '('.(int)$id_category.', '.(int)$id_shop.', '.(int)str_replace('layered_selection_feat_', '', $key).',
\'id_feature\','.(int)$n.', '.(int)$limit.', '.(int)$type.'),';
}
}
}
}
}
if ($values)
Db::getInstance()->execute(rtrim($sqlToInsert, ','));
}
} }