Files
2025-06-24 14:14:35 +02:00

1102 lines
47 KiB
PHP

<?php
/**
* NOTICE OF LICENSE
*
* This product is licensed for one customer to use on one installation (test stores and multishop included).
* Site developer has the right to modify this module to suit their needs, but can not redistribute the module in
* whole or in part. Any other use of this module constitutes a violation of the user agreement.
*
* DISCLAIMER
*
* NO WARRANTIES OF DATA SAFETY OR MODULE SECURITY
* ARE EXPRESSED OR IMPLIED. USE THIS MODULE IN ACCORDANCE
* WITH YOUR MERCHANT AGREEMENT, KNOWING THAT VIOLATIONS OF
* PCI COMPLIANCY OR A DATA BREACH CAN COST THOUSANDS OF DOLLARS
* IN FINES AND DAMAGE A STORES REPUTATION. USE AT YOUR OWN RISK.
*
* @author idnovate.com <info@idnovate.com>
* @copyright 2022 idnovate.com
* @license See above
*/
class AdvancedPopup extends ObjectModel
{
public $id_advancedpopup;
public $id_shop;
public $name;
public $date_init;
public $date_end;
public $schedule;
public $css_class;
public $css;
public $js;
public $content;
public $color_background;
public $image_background;
public $image;
public $image_link;
public $image_link_target;
public $secs_to_display;
public $secs_to_display_cart;
public $secs_to_close;
public $dont_display_again;
public $priority = 0;
public $back_opacity_value = 0.5;
public $popup_height;
public $popup_width;
public $popup_padding;
public $locked;
public $responsive_min;
public $responsive_max;
public $show_customer_newsletter;
public $show_customer_not_newsletter;
public $show_on_view_page_nbr;
public $show_every_nbr_hours;
public $maximum_per_user;
public $session;
public $nb_products;
public $nb_products_comparator;
public $display_on_load;
public $display_after_cart;
public $display_on_exit;
public $display_on_click;
public $display_on_click_selector;
public $controller_exceptions = '';
public $groups = '';
public $zones = '';
public $countries = '';
public $categories = '';
public $categories_selected = '';
public $manufacturers = '';
public $products = '';
public $genders = '';
public $customers = '';
public $suppliers = '';
public $cms = '';
public $languages = '';
public $attributes;
public $features;
public $close_on_background;
public $blur_background;
public $open_effect;
public $position = 5;
public $cart_amount;
public $cart_amount_from;
public $cart_amount_to;
public $display_url_string;
public $display_referrer_string;
public $display_ip_string;
public $display_mobile = 1;
public $display_tablet = 1;
public $display_desktop = 1;
public $product_stock;
public $product_stock_from;
public $product_stock_to;
public $product_price;
public $product_price_from;
public $product_price_to;
public $active = 1;
public $date_add;
public $date_upd;
/**
* @see ObjectModel::$definition
*/
public static $definition = array(
'table' => 'advancedpopup',
'primary' => 'id_advancedpopup',
'multilang' => true,
'fields' => array(
'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'copy_post' => false),
'name' => array('type' => self::TYPE_STRING, 'size' => 150, 'required' => true),
'date_init' => array('type' => self::TYPE_DATE),
'date_end' => array('type' => self::TYPE_DATE),
'schedule' => array('type' => self::TYPE_STRING),
'css_class' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isAnything'),
'css' => array('type' => self::TYPE_HTML, 'size' => 65534, 'lang' => true, 'validate' => 'isAnything'),
'js' => array('type' => self::TYPE_HTML, 'size' => 65534, 'lang' => true, 'validate' => 'isAnything'),
'content' => array('type' => self::TYPE_HTML, 'size' => 65534, 'lang' => true, 'validate' => 'isAnything'),
'color_background' => array('type' => self::TYPE_STRING),
'image_background' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isAnything'),
'image' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isAnything'),
'image_link' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isAnything'),
'image_link_target' => array('type' => self::TYPE_STRING),
'secs_to_display' => array('type' => self::TYPE_STRING),
'secs_to_display_cart' => array('type' => self::TYPE_STRING),
'secs_to_close' => array('type' => self::TYPE_STRING),
'dont_display_again' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'priority' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true),
'back_opacity_value' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'),
'popup_height' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isAnything'),
'popup_width' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isAnything'),
'popup_padding' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'lang' => true, 'validate' => 'isAnything'),
'locked' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'responsive_min' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'lang' => true, 'validate' => 'isAnything'),
'responsive_max' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'lang' => true, 'validate' => 'isAnything'),
'show_customer_newsletter' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'show_customer_not_newsletter' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'show_on_view_page_nbr' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
'show_every_nbr_hours' => array('type' => self::TYPE_STRING),
'maximum_per_user' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
'session' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'nb_products' => array('type' => self::TYPE_STRING),
'nb_products_comparator' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
'display_on_load' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'display_after_cart' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'display_on_exit' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'display_on_click' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'display_on_click_selector' => array('type' => self::TYPE_STRING, 'size' => 150),
'controller_exceptions' => array('type' => self::TYPE_STRING, 'size' => 65534),
'groups' => array('type' => self::TYPE_STRING),
'countries' => array('type' => self::TYPE_STRING),
'products' => array('type' => self::TYPE_STRING),
'genders' => array('type' => self::TYPE_STRING),
'customers' => array('type' => self::TYPE_STRING),
'zones' => array('type' => self::TYPE_STRING),
'categories' => array('type' => self::TYPE_STRING),
'categories_selected' => array('type' => self::TYPE_STRING),
'manufacturers' => array('type' => self::TYPE_STRING),
'suppliers' => array('type' => self::TYPE_STRING),
'cms' => array('type' => self::TYPE_STRING),
'languages' => array('type' => self::TYPE_STRING),
'attributes' => array('type' => self::TYPE_STRING),
'features' => array('type' => self::TYPE_STRING),
'close_on_background' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'blur_background' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'open_effect' => array('type' => self::TYPE_STRING),
'position' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
'cart_amount' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'cart_amount_from' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice'),
'cart_amount_to' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice'),
'display_url_string' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isAnything'),
'display_referrer_string' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isAnything'),
'display_ip_string' => array('type' => self::TYPE_STRING),
'display_mobile' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'display_tablet' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'display_desktop' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'product_stock' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'product_stock_from' => array('type' => self::TYPE_NOTHING, 'validate' => 'isInt'),
'product_stock_to' => array('type' => self::TYPE_NOTHING, 'validate' => 'isInt'),
'product_price' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'product_price_from' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice'),
'product_price_to' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice'),
'active' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate', 'copy_post' => false),
'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate', 'copy_post' => false)
),
);
public function __construct($id = null, $id_lang = null)
{
$this->context = Context::getContext();
parent::__construct($id, $id_lang);
if (!$id) {
$this->date_init = date('Y-m-d H:i:s');
}
}
public function add($autodate = true, $null_values = false)
{
$this->id_shop = ($this->id_shop) ? $this->id_shop : Context::getContext()->shop->id;
return parent::add($autodate, true);
}
public function save($null_values = false, $auto_date = true)
{
return parent::save(true, $auto_date);
}
public function update($null_values = false)
{
return parent::update(true);
}
public function toggleStatus()
{
parent::toggleStatus();
return Db::getInstance()->execute('
UPDATE `'._DB_PREFIX_.bqSQL($this->def['table']).'`
SET `date_upd` = NOW()
WHERE `'.bqSQL($this->def['primary']).'` = '.(int)$this->id);
}
public function delete()
{
$languages = Language::getLanguages(false);
foreach (array('image', 'image_background') as $type) {
foreach ($languages as $language) {
$image = $this->{$type}[(int)$language['id_lang']];
if ($image) {
AdvancedPopupCreator::deleteImage(_PS_MODULE_DIR_.AdvancedPopupCreator::$image_dir.$image);
}
}
}
return parent::delete();
}
public function getPopups($preview = false)
{
$query = 'SELECT *
FROM `'._DB_PREFIX_.$this->def['table'].'`
INNER JOIN `'. _DB_PREFIX_.$this->def['table'].'_lang` ON `'._DB_PREFIX_.$this->def['table'].'`.`id_advancedpopup` = `'._DB_PREFIX_.$this->def['table']. '_lang`.`id_advancedpopup`
WHERE `id_shop` = '.(int)$this->context->shop->id.' AND `id_lang` = '.(int)$this->context->language->id;
// Preview is the only one who asks for a specific popup, so no need to check filter neither mark it as seen
if ($preview) {
return Db::getInstance()->executeS($query);
}
$laPopupsVisited = $this->getApcCookiePopups();
//Reset popups with session enabled
if (!isset($_COOKIE['apc_popup_session'])) {
$resetQuery = 'SELECT `id_advancedpopup`
FROM `'._DB_PREFIX_.$this->def['table'].'`
WHERE `id_shop` = '.(int)$this->context->shop->id.' AND `session` = 1';
$popups = Db::getInstance()->executeS($resetQuery);
foreach ($popups as $popup) {
unset($laPopupsVisited[(int)$popup['id_advancedpopup']]);
}
setcookie('apc_popup_session', true, 0, "/");
$this->setApcCookiePopups($laPopupsVisited);
}
$query .= ' AND `active` = 1
AND (`date_init` <= "'.date("Y-m-d H:i:s"). '" OR `date_init` = "'.date('Y-m-d H:i:s', 0).'")
AND (`date_end` >= "'.date("Y-m-d H:i:s").'" OR `date_end` = "'.date('Y-m-d H:i:s', 0).'")
AND (`customers` = ""
OR `customers` IS NULL
OR FIND_IN_SET("'.(int)$this->context->customer->id.'", `customers`))
AND (`languages` = ""
OR `languages` IS NULL
OR FIND_IN_SET("'.(int)$this->context->language->id.'", `languages`))
AND (`display_ip_string` = ""
OR `display_ip_string` IS NULL
OR FIND_IN_SET("'.Tools::getRemoteAddr().'", `display_ip_string`))
AND (`display_url_string` = ""
OR `display_url_string` IS NULL
OR INSTR("'.pSQL($_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']).'", `display_url_string`) > 0)
';
if ((int)$this->context->customer->id_gender) {
$query .= ' AND (`genders` = ""
OR `genders` IS NULL
OR FIND_IN_SET("'.(int)$this->context->customer->id_gender.'", `genders`))';
} else {
$query .= ' AND (`genders` = ""
OR `genders` IS NULL)';
}
$customerGroups = Customer::getGroupsStatic((int)$this->context->customer->id);
$query_groups = ' AND (`groups` = ""
OR `groups` IS NULL ';
foreach ($customerGroups as $customerGroup) {
$query_groups .= ' OR FIND_IN_SET('.$customerGroup.', `groups`)';
}
$query_groups .= ')';
$query .= $query_groups;
if (version_compare(_PS_VERSION_, '1.6.0.11', '<')) {
require_once(_PS_TOOL_DIR_.'mobile_Detect/Mobile_Detect.php');
$this->mobile_detect = new Mobile_Detect();
if ($this->mobile_detect->isMobile()) {
$query .= ' AND `display_mobile` = 1';
}
if ($this->mobile_detect->isTablet()) {
$query .= ' AND `display_tablet` = 1';
}
if (!$this->mobile_detect->isTablet() && !$this->mobile_detect->isMobile()) {
$query .= ' AND `display_desktop` = 1';
}
} else {
if ($this->context->isMobile()) {
$query .= ' AND `display_mobile` = 1';
}
if ($this->context->isTablet()) {
$query .= ' AND `display_tablet` = 1';
}
if (!$this->context->isTablet() && !$this->context->isMobile()) {
$query .= ' AND `display_desktop` = 1';
}
}
$controller = AdvancedPopupCreator::getController();
if ($controller === 'cms') {
$query .= ' AND (`cms` = ""
OR `cms` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_cms').'", `cms`))';
} else {
$query .= ' AND (`cms` = ""
OR `cms` IS NULL)';
}
$query .= ' AND (`controller_exceptions` = ""
OR `controller_exceptions` IS NULL
OR FIND_IN_SET("'.$controller.'", `controller_exceptions`))';
if ((int)Tools::getValue('id_product')) {
$query .= ' AND (`display_after_cart` = 1
OR (`products` = ""
OR `products` IS NULL
OR FIND_IN_SET('.(int)Tools::getValue('id_product').', `products`)))';
} else {
$query .= ' AND (`display_after_cart` = 1
OR `products` = ""
OR `products` IS NULL)';
}
if ($controller === 'product') {
$laProductCategories = Product::getProductCategories((int)Tools::getValue('id_product'));
$query_groups = ' AND (`categories` = ""
OR `categories` IS NULL ';
foreach ($laProductCategories as $laProductCategory) {
$query_groups .= ' OR FIND_IN_SET('.$laProductCategory.', `categories`)';
}
$query_groups .= ')';
$query .= $query_groups;
} elseif ($controller === 'category') {
$query .= ' AND (`display_after_cart` = 1
OR (`categories` = ""
OR `categories` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_category').'", `categories`)))';
} else {
$query .= ' AND (`display_after_cart` = 1
OR `categories` = ""
OR `categories` IS NULL)';
}
if ($controller === 'product') {
$product = new Product((int)Tools::getValue('id_product'));
$query .= ' AND (`display_after_cart` = 1
OR (`manufacturers` = ""
OR `manufacturers` IS NULL
OR FIND_IN_SET("'.(int)$product->id_manufacturer.'", `manufacturers`)))';
$query .= ' AND (`display_after_cart` = 1
OR (`suppliers` = ""
OR `suppliers` IS NULL
OR FIND_IN_SET("'.(int)$product->id_supplier.'", `suppliers`)))';
}
if ($controller === 'manufacturer') {
$query .= ' AND (`display_after_cart` = 1
OR (`manufacturers` = ""
OR `manufacturers` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_manufacturer').'", `manufacturers`)))';
} else {
$query .= ' AND (`display_after_cart` = 1
OR `manufacturers` = ""
OR `manufacturers` IS NULL)';
}
if ($controller === 'supplier') {
$query .= ' AND (`display_after_cart` = 1
OR (`suppliers` = ""
OR `suppliers` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_supplier').'", `suppliers`)))';
} else {
$query .= ' AND (`display_after_cart` = 1
OR `suppliers` = ""
OR `suppliers` IS NULL)';
}
$query .= ' ORDER BY `priority` ASC;';
$popups = Db::getInstance()->executeS($query);
$validPopups = array();
foreach ($popups as $popup) {
/************* Pagenbr *************/
$liShowOnPageView = (int)$popup['show_on_view_page_nbr'];
$liPopupID = (int)$popup['id_advancedpopup'];
// If 0 or 1, display the popup always
if ((int)$liShowOnPageView > 0) {
if (empty($laPopupsVisited)
|| !isset($laPopupsVisited[$liPopupID])
|| !isset($laPopupsVisited[$liPopupID]['visits'])) {
continue;
}
if ($laPopupsVisited[$liPopupID]['visits'] < $liShowOnPageView) {
continue;
}
}
/************* Hoursnbr *************/
// Run filter for without minutes defined
if ((int)$popup['show_every_nbr_hours'] > 0) {
$liNow = time();
$liPopupID = (int)$popup['id_advancedpopup'];
$liMinutesToShow = (int)$popup['show_every_nbr_hours'] * 60;
if (!empty($laPopupsVisited)
&& isset($laPopupsVisited[$liPopupID]['last_displayed'])) {
$liShowOnTime = $laPopupsVisited[$liPopupID]['last_displayed'] + $liMinutesToShow;
if ($liNow < $liShowOnTime) {
continue;
}
}
}
// Times displayed
if ((int)$popup['maximum_per_user'] > 0) {
$liPopupID = (int)$popup['id_advancedpopup'];
if (!empty($laPopupsVisited)
&& isset($laPopupsVisited[$liPopupID]['times_displayed'])
&& (int)$popup['maximum_per_user'] <= $laPopupsVisited[$liPopupID]['times_displayed']) {
continue;
}
}
// Customer newsletter
if ((int)$this->context->customer->id && ((int)$popup['show_customer_newsletter'] || (int)$popup['show_customer_not_newsletter'])) {
$loCustomer = new Customer((int)$this->context->customer->id);
if ((int)$popup['show_customer_newsletter'] && !(bool)$loCustomer->newsletter) {
continue;
}
if ((int)$popup['show_customer_not_newsletter'] && (bool)$loCustomer->newsletter) {
continue;
}
}
//Don't show this message again
if (isset($laPopupsVisited[$liPopupID]['last_displayed']) &&
$laPopupsVisited[$liPopupID]['last_displayed'] == (PHP_INT_MAX-1)) {
continue;
}
// Schedule
if (!self::isShowableBySchedule($popup['schedule'])) {
continue;
}
// Filter by attributes
$attributesSelected = explode(',', $popup['attributes']);
if (array_filter($attributesSelected)) {
if ($controller === 'product') {
//Get attributes group
$attributeGroups = array();
foreach ($attributesSelected as $attributeSelected) {
$attribute = new Attribute((int)$attributeSelected);
$attributeGroups[$attribute->id_attribute_group] = true;
}
$hasAttributeGroups = array();
$product = new Product((int)Tools::getValue('id_product'));
$productAttributeCombinations = $product->getAttributeCombinations();
foreach ($productAttributeCombinations as $productAttributeCombination) {
if (in_array((int)$productAttributeCombination['id_attribute'], $attributesSelected)) {
$hasAttributeGroups[(int)$productAttributeCombination['id_attribute_group']] = true;
}
}
if ($hasAttributeGroups !== $attributeGroups) {
continue;
}
} else {
continue;
}
}
//Filter by feature
$featuresSelected = explode(',', $popup['features']);
if (array_filter($featuresSelected)) {
if ($controller === 'product') {
//Get features group
$featureGroups = array();
foreach ($featuresSelected as $featureSelected) {
$feature = new FeatureValue((int)$featureSelected);
$featureGroups[$feature->id_feature] = true;
}
$hasFeatureGroups = array();
$productFeatures = Product::getFeaturesStatic((int)Tools::getValue('id_product'));
foreach ($productFeatures as $productFeature) {
if (in_array($productFeature['id_feature_value'], $featuresSelected)) {
$hasFeatureGroups[(int)$productFeature['id_feature']] = true;
}
}
if ($hasFeatureGroups !== $featureGroups) {
continue;
}
} else {
continue;
}
}
$validPopups[] = $popup;
}
return $validPopups;
}
public function getPopupToDisplay($availablePopups)
{
if (isset($this->context->cart) && isset($this->context->cart->id_address_delivery) && $this->context->cart->id_address_delivery != 0) {
$zone = Address::getZoneById($this->context->cart->id_address_delivery);
} else {
$zone = Country::getIdZone($this->context->country->id);
}
$availablePopups = (strpos($availablePopups, ',') !== false ? implode(',', array_map('intval', explode(',', $availablePopups))) : (int) $availablePopups);
$query = 'SELECT *
FROM `'._DB_PREFIX_.$this->def['table'].'`
INNER JOIN `'. _DB_PREFIX_.$this->def['table'].'_lang` ON `'._DB_PREFIX_.$this->def['table'].'`.`id_advancedpopup` = `'._DB_PREFIX_.$this->def['table']. '_lang`.`id_advancedpopup`
WHERE `id_shop` = '.(int)$this->context->shop->id.' AND `id_lang` = '.(int)$this->context->language->id
.' AND '._DB_PREFIX_.$this->def['table'].'.'.$this->def['primary']. ' IN ('.$availablePopups.')'
.' AND `active` = 1
AND (`countries` = ""
OR `countries` IS NULL
OR FIND_IN_SET("'.(int)$this->context->country->id.'", `countries`))
AND (`zones` = ""
OR `zones` IS NULL
OR FIND_IN_SET("'.(int)$zone.'", `zones`))
AND (`responsive_min` = ""
OR `responsive_min` IS NULL
OR responsive_min > '.(int)Tools::getValue('responsiveWidth').')
AND (`responsive_max` = ""
OR `responsive_max` IS NULL
OR responsive_max < '.(int)Tools::getValue('responsiveWidth').')
AND (`display_referrer_string` = ""
OR `display_referrer_string` IS NULL
OR INSTR("'.pSQL(urldecode(Tools::getValue('referrer'))).'", `display_referrer_string`) > 0)';
switch ((int)Tools::getValue('event')) {
case 1:
$query .= ' AND `display_on_load` = 1';
break;
case 2:
$query .= ' AND `display_after_cart` = 1';
break;
case 3:
$query .= ' AND `display_on_exit` = 1';
break;
case 4:
$query .= ' AND `display_on_click` = 1';
break;
}
$controller = Tools::getValue('fromController');
if ((int)Tools::getValue('event') !== 2) {
if ((int)Tools::getValue('id_product')) {
$query .= ' AND (`products` = ""
OR `products` IS NULL
OR FIND_IN_SET('.(int)Tools::getValue('id_product').', `products`))';
} else {
$query .= ' AND (`products` = ""
OR `products` IS NULL)';
}
if ($controller === 'product') {
$laProductCategories = Product::getProductCategories((int)Tools::getValue('id_product'));
$query_groups = ' AND (`categories` = ""
OR `categories` IS NULL ';
foreach ($laProductCategories as $laProductCategory) {
$query_groups .= ' OR FIND_IN_SET('.$laProductCategory.', `categories`)';
}
$query_groups .= ')';
$query .= $query_groups;
} elseif ($controller === 'category') {
$query .= ' AND (`categories` = ""
OR `categories` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_category').'", `categories`))';
} else {
$query .= ' AND (`categories` = ""
OR `categories` IS NULL )';
}
if ($controller === 'product') {
$product = new Product((int)Tools::getValue('id_product'));
}
if ($controller === 'product') {
$query .= ' AND (`manufacturers` = ""
OR `manufacturers` IS NULL
OR FIND_IN_SET("'.$product->id_manufacturer.'", `manufacturers`))';
} elseif ($controller === 'manufacturer') {
$query .= ' AND (`manufacturers` = ""
OR `manufacturers` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_manufacturer').'", `manufacturers`))';
} else {
$query .= ' AND (`manufacturers` = ""
OR `manufacturers` IS NULL)';
}
if ($controller === 'product') {
$query .= ' AND (`suppliers` = ""
OR `suppliers` IS NULL
OR FIND_IN_SET("'.$product->id_supplier.'", `suppliers`))';
} elseif ($controller === 'supplier') {
$query .= ' AND (`suppliers` = ""
OR `suppliers` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_supplier').'", `suppliers`))';
} else {
$query .= ' AND (`suppliers` = ""
OR `suppliers` IS NULL)';
}
} else {
$product = new Product((int)Tools::getValue('id_product'));
$query .= ' AND (`products` = ""
OR `products` IS NULL
OR FIND_IN_SET('.(int)Tools::getValue('id_product').', `products`))';
$laProductCategories = Product::getProductCategories((int)Tools::getValue('id_product'));
$query .= ' AND (`categories` = ""
OR `categories` IS NULL ';
foreach ($laProductCategories as $laProductCategory) {
$query .= ' OR FIND_IN_SET('.$laProductCategory.', `categories`)';
}
$query .= ')';
$query .= ' AND (`manufacturers` = ""
OR `manufacturers` IS NULL
OR FIND_IN_SET("'.(int)$product->id_manufacturer.'", `manufacturers`))';
$query .= ' AND (`suppliers` = ""
OR `suppliers` IS NULL
OR FIND_IN_SET("'.(int)$product->id_supplier.'", `suppliers`))';
}
$query .= ' ORDER BY `priority` ASC;';
$popups = Db::getInstance()->executeS($query);
$laPopupsVisited = $this->getApcCookiePopups();
$validPopups = array();
$cartAmount = $this->context->cart->getOrderTotal();
$liNow = time();
foreach ($popups as $popup) {
/************* Hoursnbr *************/
// Run filter for without minutes defined
if ((int)$popup['show_every_nbr_hours'] > 0) {
$liMinutesToShow = (int)$popup['show_every_nbr_hours'] * 60;
if (!empty($laPopupsVisited)
&& isset($laPopupsVisited[(int)$popup['id_advancedpopup']]['last_displayed'])) {
$liShowOnTime = $laPopupsVisited[(int)$popup['id_advancedpopup']]['last_displayed'] + $liMinutesToShow;
if ($liNow < $liShowOnTime) {
continue;
}
}
}
// Times displayed
if ((int)$popup['maximum_per_user'] > 0) {
$liPopupID = (int)$popup['id_advancedpopup'];
if (!empty($laPopupsVisited)
&& isset($laPopupsVisited[$liPopupID]['times_displayed'])
&& (int)$popup['maximum_per_user'] <= $laPopupsVisited[$liPopupID]['times_displayed']) {
continue;
}
}
//Don't show this message again
if (isset($laPopupsVisited[(int)$popup['id_advancedpopup']]['last_displayed']) &&
$laPopupsVisited[(int)$popup['id_advancedpopup']]['last_displayed'] == (PHP_INT_MAX-1)) {
continue;
}
/************* Cart amount *************/
if ($popup['cart_amount']) {
if ($popup['cart_amount_from']) {
$cartAmountFromConverted = AdvancedPopupCreator::convertPriceFull($popup['cart_amount_from'], null, $this->context->currency);
if ($cartAmount < $cartAmountFromConverted) {
continue;
}
}
if ($popup['cart_amount_to']) {
$cartAmountToConverted = AdvancedPopupCreator::convertPriceFull($popup['cart_amount_to'], null, $this->context->currency);
if ($cartAmount > $cartAmountToConverted) {
continue;
}
}
}
/************* Number of products in the cart *************/
if ($popup['nb_products']) {
$productsInCart = 0;
foreach ($this->context->cart->getProducts() as $cartProduct) {
//Check category
$productCategories = Product::getProductCategories($cartProduct['id_product']);
if ($popup['categories_selected']) {
foreach ($productCategories as $productCategory) {
if (in_array($productCategory, explode(',', $popup['categories_selected']))) {
$productsInCart += $cartProduct['cart_quantity'];
}
}
} else {
$productsInCart += $cartProduct['cart_quantity'];
}
}
switch ($popup['nb_products_comparator']) {
case 1:
if ($productsInCart < $popup['nb_products']) {
continue 2;
}
break;
case 2:
if ($productsInCart != $popup['nb_products']) {
continue 2;
}
break;
case 3:
if ($productsInCart > $popup['nb_products']) {
continue 2;
}
break;
}
}
if ($controller === 'product') {
if ($popup['product_stock']) {
$stock = (int)Product::getQuantity((int)Tools::getValue('id_product'), (int)Tools::getValue('id_product_attribute'));
$productStockFrom = is_null($popup['product_stock_from']) ? PHP_INT_MIN : (int)$popup['product_stock_from'];
$productStockTo = is_null($popup['product_stock_to']) ? PHP_INT_MAX : (int)$popup['product_stock_to'];
if ($productStockFrom > $stock
|| $productStockTo < $stock) {
continue;
}
}
if ($popup['product_price']) {
$productPrice = Product::getPriceStatic((int)Tools::getValue('id_product'), true, (int)Tools::getValue('id_product_attribute'), 6, null, false, true);
$productPrice = AdvancedPopupCreator::convertPriceFull($productPrice, null, $this->context->currency);
$productPriceFrom = is_null($popup['product_price_from']) ? PHP_INT_MIN : $popup['product_price_from'];
$productPriceTo = is_null($popup['product_price_to']) ? PHP_INT_MAX : $popup['product_price_to'];
if ($productPriceFrom > $productPrice
|| $productPriceTo < $productPrice) {
continue;
}
}
} else {
if ($popup['product_stock']) {
continue;
}
if ($popup['product_price']) {
continue;
}
}
if ((int)Tools::getValue('event') != 1
&& (int)Tools::getValue('event') != 4) {
$validPopups[] = $popup;
return $validPopups;
}
//Check if popup is diplayed with different delay
if ((int)Tools::getValue('event') == 1) {
foreach ($validPopups as $validPopup) {
if ((int)$popup['secs_to_display'] == (int)$validPopup['secs_to_display']) {
continue;
}
}
}
$validPopups[] = $popup;
}
return $validPopups;
}
public static function existExitPopups()
{
$query = 'SELECT count(*)
FROM `'._DB_PREFIX_.'advancedpopup`
INNER JOIN `'. _DB_PREFIX_.'advancedpopup_lang` ON `'._DB_PREFIX_.'advancedpopup`.`id_advancedpopup` = `'._DB_PREFIX_.'advancedpopup_lang`.`id_advancedpopup`
WHERE `id_shop` = '.(int)Context::getContext()->shop->id.' AND `id_lang` = '.(int)Context::getContext()->language->id
.' AND `active` = 1
AND `display_on_exit` = 1';
return (bool)Db::getInstance()->getValue($query);
}
public static function isShowableBySchedule($schedule)
{
$schedule = json_decode($schedule);
$dayOfWeek = date('w') - 1;
if ($dayOfWeek < 0) {
$dayOfWeek = 6;
}
if (is_array($schedule)) {
if (is_object($schedule[$dayOfWeek]) && $schedule[$dayOfWeek]->isActive === true) {
if ($schedule[$dayOfWeek]->timeFrom <= date('H:i')
&& $schedule[$dayOfWeek]->timeTill > date('H:i')) {
return true;
}
return false;
}
return false;
}
return true;
}
/**
* Update the visits from passed popups on each loading.
*
* array $laPopupsVisited The popups with visits
* array The popups with visits +1 on all
*/
public function updateVisits()
{
$query = 'SELECT *
FROM `'._DB_PREFIX_.$this->def['table'].'`
INNER JOIN `'. _DB_PREFIX_.$this->def['table'].'_lang` ON `'._DB_PREFIX_.$this->def['table'].'`.`id_advancedpopup` = `'._DB_PREFIX_.$this->def['table']. '_lang`.`id_advancedpopup`
WHERE `id_shop` = '.(int)$this->context->shop->id.' AND `id_lang` = '.(int)$this->context->language->id;
$query .= ' AND `active` = 1
AND (`date_init` <= "'.date("Y-m-d H:i:s"). '" OR `date_init` = "'.date('Y-m-d H:i:s', 0).'")
AND (`date_end` >= "'.date("Y-m-d H:i:s").'" OR `date_end` = "'.date('Y-m-d H:i:s', 0).'")
AND (`customers` = ""
OR `customers` IS NULL
OR FIND_IN_SET("'.(int)$this->context->customer->id.'", `customers`))
AND (`languages` = ""
OR `languages` IS NULL
OR FIND_IN_SET("'.(int)$this->context->language->id.'", `languages`))
AND (`display_ip_string` = ""
OR `display_ip_string` IS NULL
OR FIND_IN_SET("'.Tools::getRemoteAddr().'", `display_ip_string`))
';
if ((int)$this->context->customer->id_gender) {
$query .= ' AND (`genders` = ""
OR `genders` IS NULL
OR FIND_IN_SET("'.(int)$this->context->customer->id_gender.'", `genders`))';
} else {
$query .= ' AND (`genders` = ""
OR `genders` IS NULL)';
}
$customerGroups = Customer::getGroupsStatic((int)$this->context->customer->id);
$query_groups = ' AND (`groups` = ""
OR `groups` IS NULL ';
foreach ($customerGroups as $customerGroup) {
$query_groups .= ' OR FIND_IN_SET('.$customerGroup.', `groups`)';
}
$query_groups .= ')';
$query .= $query_groups;
if (version_compare(_PS_VERSION_, '1.6.0.11', '<')) {
require_once(_PS_TOOL_DIR_.'mobile_Detect/Mobile_Detect.php');
$this->mobile_detect = new Mobile_Detect();
if ($this->mobile_detect->isMobile()) {
$query .= ' AND `display_mobile` = 1';
}
if ($this->mobile_detect->isTablet()) {
$query .= ' AND `display_tablet` = 1';
}
if (!$this->mobile_detect->isTablet() && !$this->mobile_detect->isMobile()) {
$query .= ' AND `display_desktop` = 1';
}
} else {
if ($this->context->isMobile()) {
$query .= ' AND `display_mobile` = 1';
}
if ($this->context->isTablet()) {
$query .= ' AND `display_tablet` = 1';
}
if (!$this->context->isTablet() && !$this->context->isMobile()) {
$query .= ' AND `display_desktop` = 1';
}
}
$controller = AdvancedPopupCreator::getController();
if ($controller === 'cms') {
$query .= ' AND (`cms` = ""
OR `cms` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_cms').'", `cms`))';
} else {
$query .= ' AND (`cms` = ""
OR `cms` IS NULL)';
}
$query .= ' AND (`controller_exceptions` = ""
OR `controller_exceptions` IS NULL
OR FIND_IN_SET("'.$controller.'", `controller_exceptions`))';
if ((int)Tools::getValue('id_product')) {
$query .= ' AND (`display_after_cart` = 1
OR (`products` = ""
OR `products` IS NULL
OR FIND_IN_SET('.(int)Tools::getValue('id_product').', `products`)))';
} else {
$query .= ' AND (`display_after_cart` = 1
OR `products` = ""
OR `products` IS NULL)';
}
if ($controller === 'product') {
$laProductCategories = Product::getProductCategories((int)Tools::getValue('id_product'));
$query_groups = ' AND (`categories` = ""
OR `categories` IS NULL ';
foreach ($laProductCategories as $laProductCategory) {
$query_groups .= ' OR FIND_IN_SET('.$laProductCategory.', `categories`)';
}
$query_groups .= ')';
$query .= $query_groups;
} elseif ($controller === 'category') {
$query .= ' AND (`display_after_cart` = 1
OR (`categories` = ""
OR `categories` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_category').'", `categories`)))';
} else {
$query .= ' AND (`display_after_cart` = 1
OR `categories` = ""
OR `categories` IS NULL)';
}
if ($controller === 'product') {
$product = new Product((int)Tools::getValue('id_product'));
}
if ($controller === 'product') {
$query .= ' AND (`display_after_cart` = 1
OR (`manufacturers` = ""
OR `manufacturers` IS NULL
OR FIND_IN_SET("'.$product->id_manufacturer.'", `manufacturers`)))';
} elseif ($controller === 'manufacturer') {
$query .= ' AND (`display_after_cart` = 1
OR (`manufacturers` = ""
OR `manufacturers` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_manufacturer').'", `manufacturers`)))';
} else {
$query .= ' AND (`display_after_cart` = 1
OR `manufacturers` = ""
OR `manufacturers` IS NULL)';
}
if ($controller === 'product') {
$query .= ' AND (`display_after_cart` = 1
OR (`suppliers` = ""
OR `suppliers` IS NULL
OR FIND_IN_SET("'.$product->id_supplier.'", `suppliers`)))';
} elseif ($controller === 'supplier') {
$query .= ' AND (`display_after_cart` = 1
OR (`suppliers` = ""
OR `suppliers` IS NULL
OR FIND_IN_SET("'.(int)Tools::getValue('id_supplier').'", `suppliers`)))';
} else {
$query .= ' AND (`display_after_cart` = 1
OR `suppliers` = ""
OR `suppliers` IS NULL)';
}
$query .= ' ORDER BY `priority` ASC;';
$popups = Db::getInstance()->executeS($query);
if (!empty($popups)) {
$laCookiePopupsVisited = $this->getApcCookiePopups();
foreach ($popups as $popup) {
if (isset($laCookiePopupsVisited[(int)$popup['id_advancedpopup']])
&& isset($laCookiePopupsVisited[(int)$popup['id_advancedpopup']]['visits'])) {
$laCookiePopupsVisited[(int)$popup['id_advancedpopup']]['visits']++;
} else {
$laCookiePopupsVisited[(int)$popup['id_advancedpopup']]['visits'] = 1;
}
}
$this->setApcCookiePopups($laCookiePopupsVisited);
}
}
public function getApcCookiePopups()
{
if (Configuration::get('APC_COOKIE')) {
return json_decode($_COOKIE['apc_popup'], true, 512, JSON_BIGINT_AS_STRING);
}
return json_decode($this->context->cookie->apc_popup, true, 512, JSON_BIGINT_AS_STRING);
}
public function setApcCookiePopups($value)
{
if (Configuration::get('APC_COOKIE')) {
setcookie('apc_popup', json_encode($value), time()+3600*24*(int)Configuration::get('PS_COOKIE_LIFETIME_FO'), "/");
$_COOKIE['apc_popup'] = json_encode($value);
}
return $this->context->cookie->apc_popup = json_encode($value);
}
/**
* Delete images associated with the object
*/
public function deletePopupImage($id_language)
{
if (!$this->id || !$id_language) {
return false;
}
$lsDestination = _PS_MODULE_DIR_.AdvancedPopupCreator::$image_dir.$this->image[(int)$id_language];
if (file_exists($lsDestination) && !unlink($lsDestination)) {
return false;
}
$this->image[(int)$id_language] = '';
if (!$this->save()) {
return false;
}
return true;
}
public static function getNbObjects()
{
$query = 'SELECT COUNT(a.`id_advancedpopup`) AS nb
FROM `'._DB_PREFIX_.'advancedpopup` a
WHERE `id_shop` = '.(int)Context::getContext()->shop->id;
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
}
}