name = 'privatesales'; $this->tab = 'pricing_promotion'; $this->author = 'Antadis'; $this->version = '2.5'; parent::__construct(); $this->displayName = $this->l('Private Sales'); $this->description = $this->l('Private sales management for Prestashop'); } public function install() { # Install admin tabs $tab_ids = array(); Db::getInstance()->Execute(' UPDATE `'._DB_PREFIX_.'tab` SET `position` = `position` + 1 WHERE `id_parent` = 0 AND `position` > 5 '); Db::getInstance()->Execute(' INSERT INTO `'._DB_PREFIX_.'tab` VALUES (DEFAULT, 0, "AdminPrivateSales", "privatesales", 6) '); $tab_ids[] = Db::getInstance()->Insert_ID(); Db::getInstance()->Execute(' INSERT INTO `'._DB_PREFIX_.'access` VALUES (1, '.$tab_ids[0].', 1, 1, 1, 1) '); Db::getInstance()->Execute(' INSERT INTO `'._DB_PREFIX_.'tab` VALUES (DEFAULT, '.$tab_ids[0].', "AdminPrivateSalesSales", "privatesales", 1) '); $tab_ids[] = Db::getInstance()->Insert_ID(); Db::getInstance()->Execute(' INSERT INTO `'._DB_PREFIX_.'access` VALUES (1, '.$tab_ids[1].', 1, 1, 1, 1) '); $tabs_i18n = array( 'fr' => array( 'Ventes Privées', 'Gestion des ventes', ), 'en' => array( 'Private Sales', 'Sales management', ), ); $langs = Db::getInstance()->ExecuteS(' SELECT `id_lang`, `iso_code` FROM `'._DB_PREFIX_.'lang` '); foreach($langs as $lang) { if(isset($tabs_i18n[$lang['iso_code']])) { for($i=0,$l=count($tab_ids); $i < $l;$i++) { Db::getInstance()->Execute(' INSERT INTO `'._DB_PREFIX_.'tab_lang` VALUES ('.$tab_ids[$i].', '.$lang['id_lang'].', "'.$tabs_i18n[$lang['iso_code']][$i].'") '); } } else { for($i=0,$l=count($tab_ids); $i < $l;$i++) { Db::getInstance()->Execute(' INSERT INTO `'._DB_PREFIX_.'tab_lang` VALUES ('.$tab_ids[$i].', '.$lang['id_lang'].', "'.$tabs_i18n['en'][$i].'") '); } } } # Add custom hooks $hooks = array( 'privatesales_create' => array('Private Sales - Create', 'Called on a private sale creation'), 'privatesales_update' => array('Private Sales - Update', 'Called on a private sale update'), 'privatesales_delete' => array('Private Sales - Delete', 'Called on a private sale deletion'), 'privatesales_edit' => array('Private Sales - Edit', 'Called on the private sale edition page'), 'privatesales_listing' => array('Private Sales - Listing', 'Called on the private sales list'), 'privatesales_product' => array('Private Sales - Product', 'Called on each private sale category page'), 'privatesales_category' => array('Private Sales - Category', 'Called on each private sale product page'), 'privatesales_end' => array('Private Sales - End', 'Called when a sale ends'), 'privatesales_block' => array('Private Sales - Home block', 'Called on the vp linsting/home page'), 'preprocess' => array('Pre Process', 'Called before the page processing'), ); foreach($hooks as $k => $v) { if(count(Db::getInstance()->ExecuteS(' SELECT `id_hook` FROM `'._DB_PREFIX_.'hook` WHERE `name` = "'.$k.'" LIMIT 1 ')) == 0) { Db::getInstance()->ExecuteS(' INSERT INTO `'._DB_PREFIX_.'hook` VALUES (DEFAULT, "'.$k.'", "'.$v[0].'", "'.$v[1].'", 0, 0) '); } } # Add private sales tables $query = ' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesale` ( `id_sale` INTEGER NOT NULL AUTO_INCREMENT, `date_start` DATETIME NOT NULL, `date_end` DATETIME NOT NULL, `enabled` BOOL NOT NULL, `featured` BOOL NOT NULL, `logout` BOOL NOT NULL, `public` BOOL NOT NULL, `id_category` INTEGER NOT NULL, `date_upd` DATETIME NOT NULL, PRIMARY KEY(`id_sale`) ) ENGINE=MyIsam DEFAULT CHARSET=utf8 '; if(!Db::getInstance()->Execute($query)) { return FALSE; } $query = ' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesale_lang` ( `id_sale` INTEGER NOT NULL, `id_lang` INTEGER NOT NULL, `description` TEXT, `video` VARCHAR(255) NOT NULL, PRIMARY KEY(`id_sale`, `id_lang`) ) ENGINE=MyIsam DEFAULT CHARSET=utf8 '; if(!Db::getInstance()->Execute($query)) { return FALSE; } $query = ' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesale_group` ( `id_sale` INTEGER NOT NULL, `id_group` INTEGER NOT NULL, PRIMARY KEY(`id_sale`, `id_group`) ) ENGINE=MyIsam DEFAULT CHARSET=utf8 '; if(!Db::getInstance()->Execute($query)) { return FALSE; } $query = ' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesale_category` ( `id_sale` INTEGER NOT NULL, `id_category` INTEGER NOT NULL, PRIMARY KEY(`id_sale`, `id_category`) ) ENGINE=MyIsam DEFAULT CHARSET=utf8 '; if(!Db::getInstance()->Execute($query)) { return FALSE; } $query = ' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesale_carrier` ( `id_sale` INTEGER NOT NULL, `id_carrier` INTEGER NOT NULL, PRIMARY KEY(`id_sale`, `id_carrier`) ) ENGINE=MyIsam DEFAULT CHARSET=utf8 '; if(!Db::getInstance()->Execute($query)) { return FALSE; } $query = ' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesale_notify` ( `id_sale` INTEGER NOT NULL, `email` VARCHAR(255) NOT NULL, `customer` INTEGER NOT NULL, `deleted` BOOL NOT NULL, PRIMARY KEY(`id_sale`, `email`) ) ENGINE=MyIsam DEFAULT CHARSET=utf8 '; if(!Db::getInstance()->Execute($query)) { return FALSE; } $query = ' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'privatesale_module` ( `id_module` INTEGER NOT NULL, `modulename` VARCHAR(255) NOT NULL, PRIMARY KEY(`id_module`) ) ENGINE=MyIsam DEFAULT CHARSET=utf8 '; if(!Db::getInstance()->Execute($query)) { return false; } # Register hooks if(!parent::install() || !$this->registerHook('preprocess') || !$this->registerHook('home') || !$this->registerHook('categoryAddition') || !$this->registerHook('categoryUpdate') || !$this->registerHook('categoryDeletion') || !$this->registerHook('privatesales_category') || !$this->registerHook('privatesales_product')) { return FALSE; } Db::getInstance()->Execute(' INSERT INTO `'._DB_PREFIX_.'privatesale_module` VALUES ( (SELECT `id_module` FROM `'._DB_PREFIX_.'module` WHERE `name` = "privatesales"), "privatesales" ) '); # Add image type if(count(Db::getInstance()->ExecuteS(' SELECT `name` FROM `'._DB_PREFIX_.'image_type` WHERE `name` = "privatesales" ')) == 0) { Db::getInstance()->Execute(' INSERT INTO `'._DB_PREFIX_.'image_type` VALUES ( DEFAULT, "privatesales", 980, 480, 0, 1, 0, 0, 0, 0 ) '); } # Set default configuration values Configuration::updateValue('PRIVATESALES_ROOT', 1); Configuration::updateValue('PRIVATESALES_SHOW_PUBLIC', 0); Configuration::updateValue('PRIVATESALES_FENCE', 0); Configuration::updateValue('PRIVATESALES_CARRIERFENCE', 0); Configuration::updateValue('PRIVATESALES_GUESTLIST', 1); Configuration::updateValue('PRIVATESALES_FUTURELIMIT', 0); Configuration::updateValue('PRIVATESALES_FEATURED_IGNORE', 0); Configuration::updateValue('PRIVATESALES_FEATURED_CURRENT', 0); Configuration::updateValue('PRIVATESALES_FEATURED_PQTY', 4); Configuration::updateValue('PRIVATESALES_FEATURED_ORDER', 0); Configuration::updateValue('PRIVATESALES_TRAILER_NOTIFY', 1); Configuration::updateValue('PRIVATESALES_TRAILER_SIGNIN', 0); return TRUE; } public function uninstall() { $tabs = Db::getInstance()->Execute(' SELECT `id_tab` FROM `'._DB_PREFIX_.'tab` WHERE `module` = "privatesales" '); $tab_position = Db::getInstance()->Execute(' SELECT `id_tab` FROM `'._DB_PREFIX_.'tab` WHERE `module` = "privatesales" AND `id_parent` = 0 '); $tab_position = $tab_position[0]['position']; foreach($tabs as $tab) { Db::getInstance()->Execute(' DELETE FROM `'._DB_PREFIX_.'tab_lang` WHERE `id_tab` = '.$tab['id_tab'] ); Db::getInstance()->Execute(' DELETE FROM `'._DB_PREFIX_.'access` WHERE `id_tab` = '.$tab['id_tab'] ); } Db::getInstance()->Execute(' DELETE FROM `'._DB_PREFIX_.'tab` WHERE `module` = "privatesales" '); Db::getInstance()->Execute(' UPDATE `'._DB_PREFIX_.'tab` SET `position` = `position` - 1 WHERE `id_parent` = 0 AND `position` > '.$tab_position ); if(parent::uninstall() == FALSE) { return FALSE; } Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'privatesale`'); Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'privatesale_lang`'); Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'privatesale_category`'); Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'privatesale_carrier`'); Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'privatesale_notify`'); Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'privatesale_module`'); Configuration::deleteByName('PRIVATESALES_ROOT'); Configuration::deleteByName('PRIVATESALES_SHOW_PUBLIC'); Configuration::deleteByName('PRIVATESALES_FENCE'); Configuration::deleteByName('PRIVATESALES_CARRIERFENCE'); Configuration::deleteByName('PRIVATESALES_GUESTLIST'); Configuration::deleteByName('PRIVATESALES_FUTURELIMIT'); Configuration::deleteByName('PRIVATESALES_FEATURED_IGNORE'); Configuration::deleteByName('PRIVATESALES_FEATURED_CURRENT'); Configuration::deleteByName('PRIVATESALES_FEATURED_PQTY'); Configuration::deleteByName('PRIVATESALES_FEATURED_ORDER'); Configuration::deleteByName('PRIVATESALES_TRAILER_NOTIFY'); Configuration::deleteByName('PRIVATESALES_TRAILER_SIGNIN'); Configuration::deleteByName('PRIVATESALES_EXPENDABLE'); $files = glob(dirname(__FILE__).'/img/*'); foreach($files as $file) { unlink($file); } return TRUE; } public function hookPreprocess($params) { global $cookie, $smarty, $page_name; $smarty->assign(array( 'privatesales' => 1, )); if($page_name == 'category' || $page_name == 'product' || $page_name == 'cart') { $id_category = Tools::getValue('id_category'); $id_product = Tools::getValue('id_product'); if($id_product) { $id_category = Db::getInstance()->ExecuteS(' SELECT `id_category_default` FROM `'._DB_PREFIX_.'product` WHERE `id_product`='.intval($id_product) ); $id_category = $id_category[0]['id_category_default']; } if($id_category) { $sale = Sale::getSaleFromCategory($id_category); if($sale !== NULL) { $addclass = ""; if($page_name != 'product') { // if($sale->sale_type == 1) { // $addclass = ' vp-bebe'; // } elseif($sale->sale_type == 2) { // $addclass = ' vp-enfant'; // } elseif($sale->sale_type == 3) { // $addclass = ' vp-maman'; // } } $smarty->assign('bodyClass', $smarty->getTemplateVars('bodyClass').$addclass); if($cookie->isLogged()){ $customer = new Customer((int) $cookie->id_customer); if($customer->isMemberOfGroup(2)){ return; } } if( !empty($_SERVER['QUERY_STRING']) ) { $query_string = $_SERVER['QUERY_STRING']; $utm = substr($query_string, strpos($query_string, '&')); $count = explode("&", $utm); if(count($count) < 2 ) { unset($utm); } } if(!$sale->enabled || strtotime('now') > strtotime($sale->date_end) || strtotime('now') < strtotime($sale->date_start) || (!$cookie->isLogged() && $sale->pub == 0) || count(array_intersect($cookie->isLogged()? Customer::getGroupsStatic($cookie->id_customer): array(1), $sale->groups)) == 0) { if (!empty($utm)) { Tools::redirect('/?'. $utm); } else { Tools::redirect('/'); } } if(Configuration::get('PRIVATESALES_FENCE') == 1) { global $cart; $cart_products = $cart->getProducts(); $sale_categories = Sale::getCategoriesFromCache($sale->id); if(count($cart_products) > 0) { for($i=0, $l=count($cart_products); $i < $l; $i++) { if(!in_array($cart_products[$i]['id_category_default'], $sale_categories)) { // We are entering in a sale but we have some products from another sale in our cart if($page_name !== 'cart') { Tools::redirect('/modules/privatesales/salechange.php?next='.urlencode($_SERVER['REQUEST_URI']).'&back='.(isset($_SERVER['HTTP_REFERER'])? urlencode($_SERVER['HTTP_REFERER']): '')); } exit; } } } } } } } return; } public function hookHome($params) { global $smarty, $cookie, $site_version_front; $langs = Language::getLanguages(); $lang = (int) Tools::getValue('id_lang', Configuration::get('PS_LANG_DEFAULT')); $isolang = Language::getIsoById($lang); $trailer_i18n = array( 'fr' => 'bande-annonce', 'en' => 'trailer', ); try { smartyRegisterFunction($smarty, 'modifier', 'str2url', array('Tools', 'str2url')); } catch(Exception $e) {} if(Configuration::get('PS_REWRITING_SETTINGS')) { $smarty->assign(array( 'rewriting' => TRUE, 'base_url' => (count($langs) > 1? (isset($trailer_i18n[$isolang])? $isolang.'/'.$trailer_i18n[$isolang]: $isolang.'/'.$trailer_i18n['en']): (isset($trailer_i18n[$isolang])? $trailer_i18n[$isolang]: $trailer_i18n['en'])), )); } else { $smarty->assign('rewriting', FALSE); } $display_limit = Configuration::get('PRIVATESALES_FUTURELIMIT'); $sales = Sale::getSales(TRUE, NULL, NULL, 'current', FALSE, Configuration::get('PRIVATESALES_SHOW_PUBLIC'), '`position` DESC', NULL, NULL, $site_version_front, TRUE); if($display_limit == 0) { $futuresales = Sale::getSales(TRUE, NULL, NULL, TRUE, FALSE, Configuration::get('PRIVATESALES_SHOW_PUBLIC'), '`position` ASC', NULL, NULL, $site_version_front, TRUE); } else { $futuresales = Sale::getSales(TRUE, NULL, NULL, (int) $display_limit, FALSE, Configuration::get('PRIVATESALES_SHOW_PUBLIC'), '`position` ASC', NULL, NULL, $site_version_front, TRUE); } $smarty->assign(array( 'path' => __PS_BASE_URI__.'modules/privatesales/', 'is_banner_enable' => (int)Configuration::get('ANT_PROMO_BANNER_'.$cookie->id_lang), 'is_banner_link' => (!empty(Configuration::get('ANT_PROMO_BANNERURL_'.$cookie->id_lang))?Configuration::get('ANT_PROMO_BANNERURL_'.$cookie->id_lang):false), 'banner_url' => __PS_BASE_URI__.'modules/ant_promobanner/img/', 'banner_name' => Configuration::get('ANT_PROMO_BANNERNAME_'.$cookie->id_lang), 'sales' => $sales, 'HOOK_PRIVATESALES_LISTING' => Module::hookExec('privatesales_listing', array('sales' => $sales, 'futuresales' => $futuresales)), 'HOOK_PRIVATESALES_BLOCK' => Module::hookExec('privatesales_block'), 'futuresales' => $futuresales, 'showtoguests' => Configuration::get('PRIVATESALES_GUESTLIST'), 'customer_groups' => ($cookie->isLogged()? Customer::getGroupsStatic((int) $cookie->id_customer): array(1)), 'bestSaleHome' => Module::hookExec('bestSaleHome'), )); $smarty->assign('newsletter', (int)Module::getInstanceByName('blocknewsletter')->active); /* Call a hook to display more information on form */ $smarty->assign(array( 'HOOK_CREATE_ACCOUNT_FORM' => Module::hookExec('createAccountForm'), 'HOOK_CREATE_ACCOUNT_TOP' => Module::hookExec('createAccountTop') )); return $this->display(__FILE__, 'home.tpl'); } public function hookFooter($params) { global $smarty, $cookie, $site_version_front; $display_limit = Configuration::get('PRIVATESALES_FUTURELIMIT'); if($cookie->isLogged()) { $sales = Sale::getSales(TRUE, NULL, NULL, 'current', FALSE, Configuration::get('PRIVATESALES_SHOW_PUBLIC'),'`date_end` ASC', NULL, NULL, $site_version_front, TRUE); if($display_limit == 0) { $futuresales = Sale::getSales(TRUE, NULL, NULL, TRUE, FALSE, Configuration::get('PRIVATESALES_SHOW_PUBLIC'),'`date_end` ASC', NULL, NULL, $site_version_front, TRUE); } else { $futuresales = Sale::getSales(TRUE, NULL, NULL, (int) $display_limit, FALSE, Configuration::get('PRIVATESALES_SHOW_PUBLIC'),'`date_end` ASC', NULL, NULL, $site_version_front, TRUE); } } else { $sales = Sale::getSales(TRUE, TRUE, NULL, 'current', FALSE, Configuration::get('PRIVATESALES_SHOW_PUBLIC'),'`date_end` ASC', NULL, NULL, $site_version_front, TRUE); if($display_limit == 0) { $futuresales = Sale::getSales(TRUE, TRUE, NULL, TRUE, FALSE, Configuration::get('PRIVATESALES_SHOW_PUBLIC'),'`date_end` ASC', NULL, NULL, $site_version_front, TRUE); } else { $futuresales = Sale::getSales(TRUE, TRUE, NULL, (int) $display_limit, FALSE, Configuration::get('PRIVATESALES_SHOW_PUBLIC'),'`date_end` ASC', NULL, NULL, $site_version_front, TRUE); } } $smarty->assign(array( 'path' => __PS_BASE_URI__.'modules/privatesales/', 'sales' => $sales, 'HOOK_PRIVATESALES_LISTING' => Module::hookExec('privatesales_listing', array('sales' => $sales, 'futuresales' => $futuresales)), 'futuresales' => $futuresales, 'showtoguests' => Configuration::get('PRIVATESALES_GUESTLIST'), 'customer_groups' => ($cookie->isLogged()? Customer::getGroupsStatic((int) $cookie->id_customer): array(1)), )); return $this->display(__FILE__, 'footer.tpl'); } public function hookHeader($params) { return $this->display(__FILE__, 'header.tpl'); } public function hookCategoryAddition($params) { if (isset($params['position']) && $params['position'] === true) { } else { $sale = Sale::getSaleFromCategory($params['category']->id, FALSE); if($sale !== NULL) { $sale->buildCategoryCache(); } } } public function hookCategoryUpdate($params) { $this->hookCategoryAddition($params); } public function hookCategoryDeletion($params) { $sale = Sale::getSaleFromCategory($params['category']->id, FALSE); if($sale !== NULL) { Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'privatesale_category` WHERE `id_sale` = '.$sale->id); } } public function hookPrivateSales_Product($params) { global $cookie, $smarty; $product = new Product(Tools::getValue('id_product')); $sale = Sale::getSaleFromCategory($product->id_category_default); $smarty->assign(array( 'category' => new Category($product->id_category_default, $cookie->id_lang), 'sale' => $sale, 'consumable' => ((int) _SHOP_PRIVATESALES_CONSUMABLE == (int) $sale->id)? true : false, )); return $this->display(__FILE__, 'product.tpl'); } public function hookPrivateSales_Category($params) { global $cookie, $smarty; $sale = Sale::getSaleFromCategory(Tools::getValue('id_category')); $smarty->assign(array( 'category' => new Category(Tools::getValue('id_category'), $cookie->id_lang), 'sale' => $sale, 'path_saleimg' => dirname(__FILE__).'/img/'.$sale->id.'/', 'has_salebg' => is_file(dirname(__FILE__).'/img/'.$sale->id.'/salebg_'.$cookie->id_lang.'.jpg'), 'consumable' => ((int) _SHOP_PRIVATESALES_CONSUMABLE == (int) $sale->id)? true : false, )); return $this->display(__FILE__, 'category.tpl'); } }