diff --git a/modules/pscleaner/config.xml b/modules/pscleaner/config.xml new file mode 100644 index 000000000..d1f03fa8f --- /dev/null +++ b/modules/pscleaner/config.xml @@ -0,0 +1,12 @@ + + + pscleaner + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/pscleaner/index.php b/modules/pscleaner/index.php new file mode 100644 index 000000000..3f6561f72 --- /dev/null +++ b/modules/pscleaner/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file diff --git a/modules/pscleaner/logo.png b/modules/pscleaner/logo.png new file mode 100644 index 000000000..6b43d7e23 Binary files /dev/null and b/modules/pscleaner/logo.png differ diff --git a/modules/pscleaner/pscleaner.php b/modules/pscleaner/pscleaner.php new file mode 100644 index 000000000..a2bd99a05 --- /dev/null +++ b/modules/pscleaner/pscleaner.php @@ -0,0 +1,483 @@ + + * @copyright 2007-2013 PrestaShop SA + * @version Release: $Revision: 7060 $ + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class PSCleaner extends Module +{ + public function __construct() + { + $this->name = 'pscleaner'; + $this->tab = 'administration'; + $this->version = '0.9'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('PrestaShop Cleaner'); + $this->description = $this->l('Check and fix functional integrity constraints and remove default data'); + $this->secure_key = Tools::encrypt($this->name); + } + + public function getContent() + { + $html = '

'.$this->l('Be really careful with this tool - There is no possible rollback!').'

'; + if (Tools::isSubmit('submitCheckAndFix')) + $html .= (count($logs = self::checkAndFix()) ? print_r($logs, true) : $this->l('Nothing that need to be cleaned')).'

'; + if (Tools::isSubmit('submitTruncateCatalog')) + { + self::truncate('catalog'); + $html .= $this->l('Catalog truncated').'

'; + } + if (Tools::isSubmit('submitTruncateSales')) + { + self::truncate('sales'); + $html .= $this->l('Orders and customers truncated').'

'; + } + + $html .= ' +
+
'.$this->l('Functional integrity constraints').' + +
+
+

+
+
'.$this->l('Data').' + +

+ +
+
'; + return $html; + } + + public static function checkAndFix() + { + $db = Db::getInstance(); + $logs = array(); + + // Simple Cascade Delete + $queries = array( + // 0 => DELETE FROM __table__, 1 => WHERE __id__ NOT IN, 2 => NOT IN __table__, 3 => __id__ used in the "NOT IN" table + array('access', 'id_profile', 'profile', 'id_profile'), + array('access', 'id_tab', 'tab', 'id_tab'), + array('accessory', 'id_product_1', 'product', 'id_product'), + array('accessory', 'id_product_2', 'product', 'id_product'), + array('address_format', 'id_country', 'country', 'id_country'), + array('attribute', 'id_attribute_group', 'attribute_group', 'id_attribute_group'), + array('carrier_group', 'id_carrier', 'carrier', 'id_carrier'), + array('carrier_group', 'id_group', 'group', 'id_group'), + array('carrier_zone', 'id_carrier', 'carrier', 'id_carrier'), + array('carrier_zone', 'id_zone', 'zone', 'id_zone'), + array('cart_cart_rule', 'id_cart', 'cart', 'id_cart'), + array('cart_product', 'id_cart', 'cart', 'id_cart'), + array('cart_rule_carrier', 'id_cart_rule', 'cart_rule', 'id_cart_rule'), + array('cart_rule_carrier', 'id_carrier', 'carrier', 'id_carrier'), + array('cart_rule_combination', 'id_cart_rule_1', 'cart_rule', 'id_cart_rule'), + array('cart_rule_combination', 'id_cart_rule_2', 'cart_rule', 'id_cart_rule'), + array('cart_rule_country', 'id_cart_rule', 'cart_rule', 'id_cart_rule'), + array('cart_rule_country', 'id_country', 'country', 'id_country'), + array('cart_rule_group', 'id_cart_rule', 'cart_rule', 'id_cart_rule'), + array('cart_rule_group', 'id_group', 'group', 'id_group'), + array('cart_rule_product_rule_group', 'id_cart_rule', 'cart_rule', 'id_cart_rule'), + array('cart_rule_product_rule', 'id_product_rule_group', 'cart_rule_product_rule_group', 'id_product_rule_group'), + array('cart_rule_product_rule_value', 'id_product_rule', 'cart_rule_product_rule', 'id_product_rule'), + array('category_group', 'id_category', 'category', 'id_category'), + array('category_group', 'id_group', 'group', 'id_group'), + array('category_product', 'id_category', 'category', 'id_category'), + array('category_product', 'id_product', 'product', 'id_product'), + array('cms', 'id_cms_category', 'cms_category', 'id_cms_category'), + array('cms_block', 'id_cms_category', 'cms_category', 'id_cms_category'), + array('cms_block_page', 'id_cms', 'cms', 'id_cms'), + array('cms_block_page', 'id_cms_block', 'cms_block', 'id_cms_block'), + array('compare', 'id_customer', 'customer', 'id_customer'), + array('compare_product', 'id_compare', 'compare', 'id_compare'), + array('compare_product', 'id_product', 'product', 'id_product'), + array('connections', 'id_shop_group', 'shop_group', 'id_shop_group'), + array('connections', 'id_shop', 'shop', 'id_shop'), + array('connections_page', 'id_connections', 'connections', 'id_connections'), + array('connections_page', 'id_page', 'page', 'id_page'), + array('connections_source', 'id_connections', 'connections', 'id_connections'), + array('customer', 'id_shop_group', 'shop_group', 'id_shop_group'), + array('customer', 'id_shop', 'shop', 'id_shop'), + array('customer_group', 'id_group', 'group', 'id_group'), + array('customer_group', 'id_customer', 'customer', 'id_customer'), + array('customer_message', 'id_customer_thread', 'customer_thread', 'id_customer_thread'), + array('customer_thread', 'id_shop', 'shop', 'id_shop'), + array('customization', 'id_cart', 'cart', 'id_cart'), + array('customization_field', 'id_product', 'product', 'id_product'), + array('customized_data', 'id_customization', 'customization', 'id_customization'), + array('delivery', 'id_shop', 'shop', 'id_shop'), + array('delivery', 'id_shop_group', 'shop_group', 'id_shop_group'), + array('delivery', 'id_carrier', 'carrier', 'id_carrier'), + array('delivery', 'id_zone', 'zone', 'id_zone'), + array('editorial', 'id_shop', 'shop', 'id_shop'), + array('favorite_product', 'id_product', 'product', 'id_product'), + array('favorite_product', 'id_customer', 'customer', 'id_customer'), + array('favorite_product', 'id_shop', 'shop', 'id_shop'), + array('feature_product', 'id_feature', 'feature', 'id_feature'), + array('feature_product', 'id_product', 'product', 'id_product'), + array('feature_value', 'id_feature', 'feature', 'id_feature'), + array('group_reduction', 'id_group', 'group', 'id_group'), + array('group_reduction', 'id_category', 'category', 'id_category'), + array('homeslider', 'id_shop', 'shop', 'id_shop'), + array('homeslider', 'id_homeslider_slides', 'homeslider_slides', 'id_homeslider_slides'), + array('hook_module', 'id_hook', 'hook', 'id_hook'), + array('hook_module', 'id_module', 'module', 'id_module'), + array('hook_module_exceptions', 'id_hook', 'hook', 'id_hook'), + array('hook_module_exceptions', 'id_module', 'module', 'id_module'), + array('hook_module_exceptions', 'id_shop', 'shop', 'id_shop'), + array('image', 'id_product', 'product', 'id_product'), + array('message', 'id_cart', 'cart', 'id_cart'), + array('message_readed', 'id_message', 'message', 'id_message'), + array('message_readed', 'id_employee', 'employee', 'id_employee'), + array('module_access', 'id_profile', 'profile', 'id_profile'), + array('module_access', 'id_module', 'module', 'id_module'), + array('module_country', 'id_module', 'module', 'id_module'), + array('module_country', 'id_country', 'country', 'id_country'), + array('module_country', 'id_shop', 'shop', 'id_shop'), + array('module_currency', 'id_module', 'module', 'id_module'), + array('module_currency', 'id_currency', 'currency', 'id_currency'), + array('module_currency', 'id_shop', 'shop', 'id_shop'), + array('module_group', 'id_module', 'module', 'id_module'), + array('module_group', 'id_group', 'group', 'id_group'), + array('module_group', 'id_shop', 'shop', 'id_shop'), + array('module_preference', 'id_employee', 'employee', 'id_employee'), + array('orders', 'id_shop', 'shop', 'id_shop'), + array('orders', 'id_shop_group', 'group_shop', 'id_shop_group'), + array('order_carrier', 'id_order', 'orders', 'id_order'), + array('order_cart_rule', 'id_order', 'orders', 'id_order'), + array('order_detail', 'id_order', 'orders', 'id_order'), + array('order_detail_tax', 'id_order_detail', 'order_detail', 'id_order_detail'), + array('order_history', 'id_order', 'orders', 'id_order'), + array('order_invoice', 'id_order', 'orders', 'id_order'), + array('order_invoice_payment', 'id_order', 'orders', 'id_order'), + array('order_invoice_tax', 'id_order_invoice', 'order_invoice', 'id_order_invoice'), + array('order_return', 'id_order', 'orders', 'id_order'), + array('order_return_detail', 'id_order_return', 'order_return', 'id_order_return'), + array('order_slip', 'id_order', 'orders', 'id_order'), + array('order_slip_detail', 'id_order_slip', 'order_slip', 'id_order_slip'), + array('pack', 'id_product_pack', 'product', 'id_product'), + array('pack', 'id_product_item', 'product', 'id_product'), + array('page', 'id_page_type', 'page_type', 'id_page_type'), + array('page_viewed', 'id_shop', 'shop', 'id_shop'), + array('page_viewed', 'id_shop_group', 'shop_group', 'id_shop_group'), + array('page_viewed', 'id_date_range', 'date_range', 'id_date_range'), + array('product_attachment', 'id_attachment', 'attachment', 'id_attachment'), + array('product_attachment', 'id_product', 'product', 'id_product'), + array('product_attribute', 'id_product', 'product', 'id_product'), + array('product_attribute_combination', 'id_product_attribute', 'product_attribute', 'id_product_attribute'), + array('product_attribute_combination', 'id_attribute', 'attribute', 'id_attribute'), + array('product_attribute_image', 'id_image', 'image', 'id_image'), + array('product_attribute_image', 'id_product_attribute', 'product_attribute', 'id_product_attribute'), + array('product_carrier', 'id_product', 'product', 'id_product'), + array('product_carrier', 'id_shop', 'shop', 'id_shop'), + array('product_carrier', 'id_carrier_reference', 'carrier', 'id_reference'), + array('product_country_tax', 'id_product', 'product', 'id_product'), + array('product_country_tax', 'id_country', 'country', 'id_country'), + array('product_country_tax', 'id_tax', 'tax', 'id_tax'), + array('product_download', 'id_product', 'product', 'id_product'), + array('product_group_reduction_cache', 'id_product', 'product', 'id_product'), + array('product_group_reduction_cache', 'id_group', 'group', 'id_group'), + array('product_sale', 'id_product', 'product', 'id_product'), + array('product_supplier', 'id_product', 'product', 'id_product'), + array('product_supplier', 'id_supplier', 'supplier', 'id_supplier'), + array('product_tag', 'id_product', 'product', 'id_product'), + array('product_tag', 'id_tag', 'tag', 'id_tag'), + array('range_price', 'id_carrier', 'carrier', 'id_carrier'), + array('range_weight', 'id_carrier', 'carrier', 'id_carrier'), + array('referrer_cache', 'id_referrer', 'referrer', 'id_referrer'), + array('referrer_cache', 'id_connections_source', 'connections_source', 'id_connections_source'), + array('scene_category', 'id_scene', 'scene', 'id_scene'), + array('scene_category', 'id_category', 'category', 'id_category'), + array('scene_products', 'id_scene', 'scene', 'id_scene'), + array('scene_products', 'id_product', 'product', 'id_product'), + array('search_index', 'id_product', 'product', 'id_product'), + array('search_word', 'id_lang', 'lang', 'id_lang'), + array('search_word', 'id_shop', 'shop', 'id_shop'), + array('shop_url', 'id_shop', 'shop', 'id_shop'), + array('specific_price_priority', 'id_product', 'product', 'id_product'), + array('stock', 'id_warehouse', 'warehouse', 'id_warehouse'), + array('stock', 'id_product', 'product', 'id_product'), + array('stock_available', 'id_product', 'product', 'id_product'), + array('stock_available', 'id_shop', 'shop', 'id_shop'), + array('stock_available', 'id_shop_group', 'shop_group', 'id_shop_group'), + array('stock_mvt', 'id_stock', 'stock', 'id_stock'), + array('tab_module_preference', 'id_employee', 'employee', 'id_employee'), + array('tab_module_preference', 'id_tab', 'tab', 'id_tab'), + array('tax_rule', 'id_country', 'country', 'id_country'), + array('theme_specific', 'id_theme', 'theme', 'id_theme'), + array('theme_specific', 'id_shop', 'shop', 'id_shop'), + array('warehouse_carrier', 'id_warehouse', 'warehouse', 'id_warehouse'), + array('warehouse_carrier', 'id_carrier', 'carrier', 'id_carrier'), + array('warehouse_product_location', 'id_product', 'product', 'id_product'), + array('warehouse_product_location', 'id_warehouse', 'warehouse', 'id_warehouse'), + ); + + $queries = self::bulle($queries); + foreach ($queries as $query_array) + { + $query = 'DELETE FROM `'._DB_PREFIX_.$query_array[0].'` WHERE `'.$query_array[1].'` NOT IN (SELECT `'.$query_array[3].'` FROM `'._DB_PREFIX_.$query_array[2].'`)'; + $db->Execute($query); + if ($affected_rows = $db->Affected_Rows()) + $logs[$query] = $affected_rows; + } + + // _lang table cleaning + $tables = Db::getInstance()->executeS('SHOW TABLES LIKE "'._DB_PREFIX_.'%_\\_lang"'); + foreach ($tables as $table) + { + $table_lang = current($table); + $table = str_replace('_lang', '', $table_lang); + $id_table = 'id_'.preg_replace('/^'._DB_PREFIX_.'/', '', $table); + + $query = 'DELETE FROM `'.bqSQL($table_lang).'` WHERE `'.bqSQL($id_table).'` NOT IN (SELECT `'.bqSQL($id_table).'` FROM `'.bqSQL($table).'`)'; + $db->Execute($query); + if ($affected_rows = $db->Affected_Rows()) + $logs[$query] = $affected_rows; + + $query = 'DELETE FROM `'.bqSQL($table_lang).'` WHERE `id_lang` NOT IN (SELECT `id_lang` FROM `'._DB_PREFIX_.'lang`)'; + $db->Execute($query); + if ($affected_rows = $db->Affected_Rows()) + $logs[$query] = $affected_rows; + } + + // _shop table cleaning + $tables = Db::getInstance()->executeS('SHOW TABLES LIKE "'._DB_PREFIX_.'%_\\_shop"'); + foreach ($tables as $table) + { + $table_shop = current($table); + $table = str_replace('_shop', '', $table_shop); + $id_table = 'id_'.preg_replace('/^'._DB_PREFIX_.'/', '', $table); + + if (in_array($table_shop, array('ps2_carrier_tax_rules_group_shop'))) + continue; + + $query = 'DELETE FROM `'.bqSQL($table_shop).'` WHERE `'.bqSQL($id_table).'` NOT IN (SELECT `'.bqSQL($id_table).'` FROM `'.bqSQL($table).'`)'; + $db->Execute($query); + if ($affected_rows = $db->Affected_Rows()) + $logs[$query] = $affected_rows; + + $query = 'DELETE FROM `'.bqSQL($table_shop).'` WHERE `id_shop` NOT IN (SELECT `id_shop` FROM `'._DB_PREFIX_.'shop`)'; + $db->Execute($query); + if ($affected_rows = $db->Affected_Rows()) + $logs[$query] = $affected_rows; + } + + Category::regenerateEntireNtree(); + + // @Todo: Remove attachment files, images... + Image::clearTmpDir(); + + return $logs; + } + + public function truncate($case) + { + $db = Db::getInstance(); + + switch ($case) + { + case 'catalog': + $id_home = Configuration::get('PS_HOME_CATEGORY'); + $id_root = Configuration::get('PS_ROOT_CATEGORY'); + Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category` WHERE id_category NOT IN ('.(int)$id_home.', '.(int)$id_root.')'); + Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category_lang` WHERE id_category NOT IN ('.(int)$id_home.', '.(int)$id_root.')'); + Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'category_shop` WHERE id_category NOT IN ('.(int)$id_home.', '.(int)$id_root.')'); + foreach (scandir(_PS_CAT_IMG_DIR_) as $dir) + if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $dir)) + unlink(_PS_CAT_IMG_DIR_.$dir); + $tables = array( + 'product', + 'product_shop', + 'feature_product', + 'product_lang', + 'category_product', + 'product_tag', + 'image', + 'image_lang', + 'image_shop', + 'specific_price', + 'specific_price_priority', + 'product_carrier', + 'cart_product', + 'compare_product', + 'product_attachment', + 'product_country_tax', + 'product_download', + 'product_group_reduction_cache', + 'product_sale', + 'product_supplier', + 'scene_products', + 'warehouse_product_location', + 'stock', + 'stock_available', + 'stock_mvt', + 'customization', + 'customization_field', + 'supply_order_detail', + 'attribute_impact', + 'product_attribute', + 'product_attribute_shop', + 'product_attribute_combination', + 'product_attribute_image', + 'attribute', + 'attribute_impact', + 'attribute_lang', + 'attribute_group', + 'attribute_group_lang', + 'attribute_group_shop', + 'attribute_shop', + 'product_attribute', + 'product_attribute_shop', + 'product_attribute_combination', + 'product_attribute_image', + 'stock_available', + 'manufacturer', + 'manufacturer_lang', + 'manufacturer_shop', + 'supplier', + 'supplier_lang', + 'supplier_shop', + 'customization', + 'customization_field', + 'customization_field_lang', + 'customized_data', + 'feature', + 'feature_lang', + 'feature_product', + 'feature_shop', + 'feature_value', + 'feature_value_lang', + 'pack', + 'scene', + 'scene_category', + 'scene_lang', + 'scene_products', + 'scene_shop', + 'search_index', + 'search_word', + 'specific_price', + 'specific_price_priority', + 'specific_price_rule', + 'specific_price_rule_condition', + 'specific_price_rule_condition_group', + 'stock', + 'stock_available', + 'stock_mvt', + ); + foreach ($tables as $table) + $db->execute('TRUNCATE TABLE `'._DB_PREFIX_.bqSQL($table).'`'); + $db->execute('DELETE FROM `'._DB_PREFIX_.'address` WHERE id_customer > 0'); + + Image::deleteAllImages(_PS_PROD_IMG_DIR_); + if (!file_exists(_PS_PROD_IMG_DIR_)) + mkdir(_PS_PROD_IMG_DIR_); + foreach (scandir(_PS_MANU_IMG_DIR_) as $dir) + if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $dir)) + unlink(_PS_MANU_IMG_DIR_.$dir); + foreach (scandir(_PS_SUPP_IMG_DIR_) as $dir) + if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $dir)) + unlink(_PS_SUPP_IMG_DIR_.$dir); + break; + + case 'sales': + $tables = array( + 'customer', + 'cart', + 'cart_product', + 'connections', + 'connections_page', + 'connections_source', + 'customer_group', + 'customer_message', + 'customer_message_sync_imap', + 'customer_thread', + 'guest', + 'message', + 'message_readed', + 'orders', + 'order_carrier', + 'order_cart_rule', + 'order_detail', + 'order_detail_tax', + 'order_history', + 'order_invoice', + 'order_invoice_payment', + 'order_invoice_tax', + 'order_payment', + 'order_return', + 'order_return_detail', + 'order_return_state', + 'order_return_state_lang', + 'order_slip', + 'order_slip_detail', + 'page', + 'pagenotfound', + 'page_type', + 'page_viewed', + 'referrer_cache', + 'sekeyword', + ); + foreach ($tables as $table) + $db->execute('TRUNCATE TABLE `'._DB_PREFIX_.bqSQL($table).'`'); + $db->execute('DELETE FROM `'._DB_PREFIX_.'address` WHERE id_manufacturer > 0 OR id_supplier > 0'); + break; + } + } + + public static function cleanAndOptimize() + { + // Clean (carts...) + } + + protected static function bulle($array) + { + $sorted = false; + $size = count($array); + while (!$sorted) + { + $sorted = true; + for ($i = 0; $i < $size - 1; ++$i) + for ($j = $i + 1; $j < $size; ++$j) + { + if ($array[$i][2] == $array[$j][0]) + { + // var_dump(array($array[$i], $array[$j])); + $tmp = $array[$i]; + $array[$i] = $array[$j]; + $array[$j] = $tmp; + $sorted = false; + } + } + } + return $array; + } +} diff --git a/modules/pscleaner/translations/fr.php b/modules/pscleaner/translations/fr.php new file mode 100644 index 000000000..f66fd335a --- /dev/null +++ b/modules/pscleaner/translations/fr.php @@ -0,0 +1,15 @@ +pscleaner_e5a8af934462c05509c7de5f2f2c18a3'] = 'Nettoyage de PrestaShop'; +$_MODULE['<{pscleaner}prestashop>pscleaner_4bcb9cc248b7f6c8dc7f5c323bde76de'] = 'Vérifie et répare les problèmes d\'intégrité fonctionnelle et supprime les données par défaut (produits, commandes, clients)'; +$_MODULE['<{pscleaner}prestashop>pscleaner_752369f18aebeed9ae8384d8f1b5dc5e'] = 'Soyez très attentifs en utilisant cet outil, il n\'y a pas de retour en arrière possible !'; +$_MODULE['<{pscleaner}prestashop>pscleaner_098c3581a731f08d24311bbf515adbbb'] = 'Rien qui ne nécessite d\'être nettoyer'; +$_MODULE['<{pscleaner}prestashop>pscleaner_1bb7c5eb8682aeada82c407b40ec09c8'] = 'Catalogue supprimé'; +$_MODULE['<{pscleaner}prestashop>pscleaner_ed6ecb7169d5476ef5251524bb17552a'] = 'Commandes et clients supprimés'; +$_MODULE['<{pscleaner}prestashop>pscleaner_3535aa31bd9005bde626ad4312b67d6b'] = 'Contraintes d\'intégrité fonctionnelle'; +$_MODULE['<{pscleaner}prestashop>pscleaner_e84c6595e849214a70b35ed8f95d7d16'] = 'Vérifier et réparer'; +$_MODULE['<{pscleaner}prestashop>pscleaner_f6068daa29dbb05a7ead1e3b5a48bbee'] = 'Données'; +$_MODULE['<{pscleaner}prestashop>pscleaner_b2d7c99e984831bd36221baf34e9c26e'] = 'Supprimer le catalogue'; +$_MODULE['<{pscleaner}prestashop>pscleaner_17ca7f22baf84821b6b73462c96fb1e3'] = 'Supprimer les commandes et clients'; diff --git a/modules/pscleaner/translations/index.php b/modules/pscleaner/translations/index.php new file mode 100644 index 000000000..3f6561f72 --- /dev/null +++ b/modules/pscleaner/translations/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; \ No newline at end of file