currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); $context->shop = new Shop(Configuration::get('PS_SHOP_DEFAULT')); Context::getContext()->cart = new Cart(); } $id = $argv[1]; $isCron = true; } if (empty($context) && class_exists('Context', false)) { $context = Context::getContext(); } if (!empty($argv[2])) { $affiliate = htmlspecialchars($argv[2], ENT_QUOTES); } if (!empty($argv[3])) { $multistore = (int)$argv[3]; } if (!empty($argv[4])) { $xmlFeedType = htmlspecialchars($argv[4], ENT_QUOTES); } if (!is_numeric($id)) { die('empty id'); } if ($affiliate == 'affiliate_name') { $affiliate = ''; } if (!empty($multistore)) { $context->shop = new Shop($multistore); } $check_affiliate = Db::getInstance()->getRow('SELECT `affiliate_name` FROM '._DB_PREFIX_.'blmod_xml_affiliate_price WHERE `affiliate_name` = "'.pSQL($affiliate).'"'); $affiliate_cache = ''; $permissions = Db::getInstance()->getRow('SELECT f.*, c.file_name AS file_name_n, c.last_cache_time AS last_cache_time_n FROM '._DB_PREFIX_.'blmod_xml_feeds f LEFT JOIN '._DB_PREFIX_.'blmod_xml_feeds_cache c ON (f.id = c.feed_id AND c.feed_part = "'.(int)$part.'" AND c.affiliate_name = "'.pSQL($affiliate_cache).'") WHERE f.id = "'.(int)$id.'"'); if (empty($permissions)) { die('empty settings'); } AccessLog::save($id, 'start', $sessionId, $isCron, $_GET, $argv); AccessLog::deleteOld(); $feed_name = 'archive_'.$id; $permissions['use_cache'] = isset($permissions['use_cache']) ? $permissions['use_cache'] : false; $permissions['cache_time'] = isset($permissions['cache_time']) ? $permissions['cache_time'] : false; $permissions['last_cache_time'] = isset($permissions['last_cache_time_n']) ? $permissions['last_cache_time_n'] : '0000-00-00 00:00:00'; $permissions['use_password'] = isset($permissions['use_password']) ? $permissions['use_password'] : false; $permissions['password'] = isset($permissions['password']) ? $permissions['password'] : false; $permissions['status'] = isset($permissions['status']) ? $permissions['status'] : false; $permissions['file_name'] = isset($permissions['file_name_n']) ? $permissions['file_name_n'] : false; $permissions['html_tags_status'] = isset($permissions['html_tags_status']) ? $permissions['html_tags_status'] : false; $permissions['one_branch'] = isset($permissions['one_branch']) ? $permissions['one_branch'] : false; $permissions['header_information'] = isset($permissions['header_information']) ? htmlspecialchars_decode($permissions['header_information'], ENT_QUOTES) : false; $permissions['footer_information'] = isset($permissions['footer_information']) ? htmlspecialchars_decode($permissions['footer_information'], ENT_QUOTES) : false; $permissions['extra_feed_row'] = isset($permissions['extra_feed_row']) ? htmlspecialchars_decode($permissions['extra_feed_row'], ENT_QUOTES) : false; $permissions['only_enabled'] = isset($permissions['only_enabled']) ? $permissions['only_enabled'] : false; $permissions['split_feed'] = isset($permissions['split_feed']) ? $permissions['split_feed'] : false; $permissions['split_feed_limit'] = isset($permissions['split_feed_limit']) ? $permissions['split_feed_limit'] : false; $permissions['cat_list'] = isset($permissions['cat_list']) ? $permissions['cat_list'] : false; $permissions['categories'] = isset($permissions['categories']) ? $permissions['categories'] : false; $permissions['price_with_currency'] = isset($permissions['price_with_currency']) ? $permissions['price_with_currency'] : false; $permissions['manufacturer_list'] = isset($permissions['manufacturer_list']) ? $permissions['manufacturer_list'] : false; $permissions['manufacturer'] = isset($permissions['manufacturer']) ? $permissions['manufacturer'] : false; $permissions['supplier_list'] = isset($permissions['supplier_list']) ? $permissions['supplier_list'] : false; $permissions['supplier'] = isset($permissions['supplier']) ? $permissions['supplier'] : false; $permissions['currency_id'] = isset($permissions['currency_id']) ? $permissions['currency_id'] : false; $permissions['feed_generation_time'] = isset($permissions['feed_generation_time']) ? $permissions['feed_generation_time'] : false; $permissions['feed_generation_time_name'] = isset($permissions['feed_generation_time_name']) ? $permissions['feed_generation_time_name'] : false; $permissions['split_by_combination'] = isset($permissions['split_by_combination']) ? $permissions['split_by_combination'] : false; $useCron = !empty($permissions['use_cron']) ? $permissions['use_cron'] : false; $feed_type = isset($permissions['feed_type']) ? $permissions['feed_type'] : false; $onlyInStock = !empty($permissions['only_in_stock']) ? $permissions['only_in_stock'] : false; $priceRange = !empty($permissions['price_range']) ? $permissions['price_range'] : false; $mode = !empty($permissions['feed_mode']) ? $permissions['feed_mode'] : false; $allImages = !empty($permissions['all_images']) ? $permissions['all_images'] : false; $productList = !empty($permissions['product_list']) ? explode(',', $permissions['product_list']) : array(); $productListStatus = !empty($permissions['product_list_status']) ? $permissions['product_list_status'] : false; $shippingCountry = !empty($permissions['shipping_country']) ? $permissions['shipping_country'] : false; $filterDiscount = !empty($permissions['filter_discount']) ? $permissions['filter_discount'] : 0; $filterCategoryType = !empty($permissions['filter_category_type']) ? $permissions['filter_category_type'] : 0; $productSettingsPackageId = !empty($permissions['product_settings_package_id']) ? $permissions['product_settings_package_id'] : 0; $permissions['filter_qty_status'] = !empty($permissions['filter_qty_status']) ? $permissions['filter_qty_status'] : 0; $permissions['filter_qty_type'] = !empty($permissions['filter_qty_type']) ? $permissions['filter_qty_type'] : 0; $permissions['filter_qty_value'] = !empty($permissions['filter_qty_value']) ? $permissions['filter_qty_value'] : 0; $permissions['price_format_id'] = !empty($permissions['price_format_id']) ? $permissions['price_format_id'] : 0; $permissions['in_stock_text'] = isset($permissions['in_stock_text']) ? $permissions['in_stock_text'] : ''; $permissions['out_of_stock_text'] = isset($permissions['out_of_stock_text']) ? $permissions['out_of_stock_text'] : ''; $permissions['merge_attributes_by_group'] = !empty($permissions['merge_attributes_by_group']) ? $permissions['merge_attributes_by_group'] : 0; $permissions['merge_attributes_parent'] = !empty($permissions['merge_attributes_parent']) ? $permissions['merge_attributes_parent'] : 0; $permissions['merge_attributes_child'] = !empty($permissions['merge_attributes_child']) ? $permissions['merge_attributes_child'] : 0; $permissions['only_with_attributes_status'] = !empty($permissions['only_with_attributes_status']) ? $permissions['only_with_attributes_status'] : 0; $permissions['only_with_attributes'] = !empty($permissions['only_with_attributes']) ? explode(',', $permissions['only_with_attributes']) : array(); $permissions['only_without_attributes_status'] = !empty($permissions['only_without_attributes_status']) ? $permissions['only_without_attributes_status'] : 0; $permissions['only_without_attributes'] = !empty($permissions['only_without_attributes']) ? explode(',', $permissions['only_without_attributes']) : array(); $permissions['product_list_exclude'] = !empty($permissions['product_list_exclude']) ? explode(',', $permissions['product_list_exclude']) : array(); $permissions['category_map_id'] = !empty($permissions['category_map_id']) ? $permissions['category_map_id'] : 0; $permissions['encoding_text'] = !empty($permissions['encoding_text']) ? $permissions['encoding_text'] : 'UTF-8'; $permissions['only_on_sale'] = !empty($permissions['only_on_sale']) ? $permissions['only_on_sale'] : 0; $permissions['filter_exclude_empty_params'] = !empty($permissions['filter_exclude_empty_params']) ? explode(',', $permissions['filter_exclude_empty_params']) : ''; $permissions['product_list_xml_tag_array'] = !empty($permissions['product_list_xml_tag']) ? explode(',', $permissions['product_list_xml_tag']) : []; $permissions['xml_type'] = $xmlFeedType; $feedMetaValues = $feedMeta->getFeedMeta($id); $feedMetaValues[$id]['empty_description'] = !empty($feedMetaValues[$id]['empty_description']) ? $feedMetaValues[$id]['empty_description'] : 0; $feedMetaValues[$id]['title_length'] = !empty($feedMetaValues[$id]['title_length']) ? (int)$feedMetaValues[$id]['title_length'] : 0; $permissions = array_merge($permissions, $feedMetaValues[$id]); $permissions['url_protocol_without_slash'] = XmlFeedsTools::getUrlProtocolWithoutSlash(); $taxRateList = []; if (!empty($permissions['currency_id'])) { $context->currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); } $compressor = new Compressor(); $compressor->setSettings($permissions); if (!empty($permissions['last_modified_header'])) { header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); } if (!empty($permissions['affiliate'])) { $affiliateList = Db::getInstance()->ExecuteS('SELECT a.affiliate_name FROM '._DB_PREFIX_.'blmod_xml_affiliate_price a WHERE a.affiliate_id IN ('.pSQL(implode($permissions['affiliate'], ',')).')'); unset($affiliate); foreach ($affiliateList as $a) { $affiliate[] = $a['affiliate_name']; } } else if (!empty($affiliate)) { $affiliate2 = $affiliate; unset($affiliate); $affiliate[] = $affiliate2; } if (empty($affiliate)) { $affiliate = ''; } $affiliateNameString = (!empty($affiliate) && is_array($affiliate)) ? implode(',', $affiliate) : ''; if (!empty($shippingCountry)) { $context->country->id = $shippingCountry; } if ($useCron) { $permissions['split_feed'] = false; } $settings = $permissions; if ($permissions['status'] != 1) { die('disabled'); } if ($permissions['use_password'] == 1 && !empty($permissions['password']) && !$useCron) { $pass = Tools::getValue('password'); if ($permissions['password'] != $pass) { die('permissions, password'); } } if (!empty($permissions['protect_by_ip']) && !$useCron) { $ipList = explode(',', str_replace(' ', '', trim($permissions['protect_by_ip']))); if (!empty($ipList) && !in_array(get_ip(), $ipList)) { die('permissions, IP address'); } } if (!$useCron) { insert_statistics($id, $affiliateNameString); } $now = date('Y-m-d h:i:s'); $cache_period = date('Y-m-d h:i:s', strtotime($permissions['last_cache_time'].'+ '.$permissions['cache_time'].' minutes')); if ($permissions['use_cache'] && !$useCron) { $file_url = _PS_ROOT_DIR_.'/modules/xmlfeeds/xml_files/'.$permissions['file_name'].'.xml'; if ($now < $cache_period) { if (!empty($permissions['file_name'])) { $xml = Tools::file_get_contents($file_url); } if (!empty($xml)) { header('Content-type: text/xml;charset:'.$permissions['encoding_text']); $download = Tools::getValue('download'); if (!empty($download)) { header('Content-Disposition:attachment;filename='.$feed_name.'_feed.xml'); } AccessLog::save($id, 'end_cache', $sessionId); echo ''; echo $xml; die; } } else { Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_feeds_cache WHERE `feed_id` = "'.(int)$id.'" AND `affiliate_name` = "'.pSQL($affiliate_cache).'"'); @unlink($file_url); } } if (!empty($permissions['cdata_status'])) { $pref_s = ''; } else { $pref_s = ''; $pref_e = ''; } $multistoreArray = array(); $multistoreString = false; if (!empty($multistore)) { if ($multistore == 'auto') { $multistoreString = Context::getContext()->shop->id; } else { $multistoreArrayCheck = explode(',', $multistore); foreach ($multistoreArrayCheck as $m) { $mId = (int) $m; if (empty($mId)) { continue; } $multistoreArray[] = $mId; } $multistoreString = implode(',', $multistoreArray); } } function create_split_xml_product( $only_enabled = false, $limit = 5000, $page = 1, $use_password = false, $password = false, $affiliate = false, $multistoreString = 0, $categories = false, $cat_list = '', $filterCategoryType = false, $permissions = array(), $settings = array(), $productList = array(), $productListStatus = false ) { $xmlFeedUrl = new XmlFeedUrl(); $productListClass = new ProductList($settings['product_list_exclude']); $where_only_active = ''; if (!empty($only_enabled)) { $where_only_active = 'WHERE '._DB_PREFIX_.'product.active = "1"'; } $category_table = false; if (!empty($categories) && !empty($cat_list)) { if (empty($filterCategoryType)) { $category_table = ' LEFT JOIN ' . _DB_PREFIX_ . 'category_product ON ' . _DB_PREFIX_ . 'category_product.id_product = ' . _DB_PREFIX_ . 'product.id_product '; $where_only_active .= whereType($where_only_active) . _DB_PREFIX_ . 'category_product.id_category IN ('.pSQL($cat_list).')'; } else { $category_table = 'INNER JOIN '._DB_PREFIX_.'category_product ON ('._DB_PREFIX_.'category_product.id_product = '._DB_PREFIX_.'product.id_product AND '._DB_PREFIX_.'category_product.id_category IN ('.pSQL($cat_list).'))'; } } $multistoreJoin = ''; if (!empty($multistoreString)) { $multistoreJoin = ' INNER JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = '._DB_PREFIX_.'product.id_product AND ps.id_shop IN ('.(int)$multistoreString.')) AND ps.`active` = "1" '; } if (!empty($permissions['manufacturer']) && !empty($permissions['manufacturer_list'])) { $where_only_active .= whereType($where_only_active)._DB_PREFIX_.'product.id_manufacturer IN ('.pSQL($permissions['manufacturer_list']).')'; } if (!empty($permissions['supplier']) && !empty($permissions['supplier_list'])) { $where_only_active .= whereType($where_only_active)._DB_PREFIX_.'product.id_supplier IN ('.pSQL($permissions['supplier_list']).')'; } if ((!empty($settings['product_list_exclude']) || !empty($productList)) && !empty($productListStatus)) { $productListExcludeActive = $productListClass->getExcludeProductsByProductList(); $productListActive = $productListClass->getProductsByProductList($productList, $productListExcludeActive); $productListActive = !empty($productListActive) ? $productListActive : array('"none_id"'); $productListExcludeActive = $productListClass->getExcludeProductsByProductList(); if (!empty($productList)) { $where_only_active .= whereType($where_only_active) . _DB_PREFIX_ . 'product.id_product IN (' . pSQL(implode(',', $productListActive)) . ')'; } if (!empty($productListExcludeActive)) { $where_only_active .= whereType($where_only_active)._DB_PREFIX_.'product.id_product NOT IN ('.pSQL(implode(',', $productListExcludeActive)).')'; } } $sql = 'SELECT COUNT(DISTINCT('._DB_PREFIX_.'product.id_product)) AS c FROM '._DB_PREFIX_.'product LEFT JOIN '._DB_PREFIX_.'manufacturer ON '._DB_PREFIX_.'manufacturer.id_manufacturer = '._DB_PREFIX_.'product.id_manufacturer '.$multistoreJoin.$category_table.$where_only_active; $product_total = Db::getInstance()->getRow($sql); if (empty($product_total['c'])) { return '0'; } $parts = 1; if ($product_total['c'] > $limit) { $parts = ceil($product_total['c'] / $limit); } $pass_in_link = (!empty($use_password) && !empty($password)) ? '&password='.$password : ''; $multistoreUrl = !empty($multistoreString) ? '&multistore='.$multistoreString : ''; $link = $xmlFeedUrl->get('id='.$page.$pass_in_link.$multistoreUrl.'&part='); $xml = ''; $xml .= ''.$parts.''; for ($i = 1; $i <= $parts; ++$i) { $xml .= ''; } $xml .= ''; return $xml; } $xml = ''; if ($feed_type == 1) { if (empty($part) && !empty($permissions['split_feed']) && !empty($permissions['split_feed_limit'])) { $xml = create_split_xml_product( $permissions['only_enabled'], $permissions['split_feed_limit'], $id, $permissions['use_password'], $permissions['password'], $affiliate, $multistoreString, $permissions['categories'], $permissions['cat_list'], $filterCategoryType, $permissions, $settings, $productList, $productListStatus ); } else { $productXmlApi = new ProductXmlApi(); $xml = $productXmlApi->getFeed( $permissions, $id, $pref_s, $pref_e, $permissions['html_tags_status'], $permissions['extra_feed_row'], $permissions['one_branch'], $permissions['only_enabled'], $permissions['split_feed_limit'], $part, $permissions['categories'], $permissions['cat_list'], $multistoreString, $onlyInStock, $priceRange, $permissions['price_with_currency'], $mode, $allImages, $affiliate, $permissions['currency_id'], $permissions['feed_generation_time'], $permissions['feed_generation_time_name'], $permissions['split_by_combination'], $productList, $productListStatus, $shippingCountry, $filterDiscount, $filterCategoryType, $productSettingsPackageId, $settings, $permissions, $context ); } } elseif ($feed_type == 2) { $categoryXmlApi = new CategoryXmlApi(); $xml = $categoryXmlApi->getFeed( $id, $pref_s, $pref_e, $permissions['html_tags_status'], $permissions['extra_feed_row'], $permissions['one_branch'], $permissions['only_enabled'], $multistoreString, $permissions ); } elseif ($feed_type == 3) { $orderXmlApi = new OrderXmlApi(); $xml = $orderXmlApi->getFeed($permissions); } elseif ($feed_type == 4) { $customerXmlApi = new CustomerXmlApi(); $xml = $customerXmlApi->getFeed($permissions); } elseif ($feed_type == 5) { $brandXmlApi = new BrandXmlApi(); $xml = $brandXmlApi->getFeed($permissions, $protocol); } elseif ($feed_type == 6) { $supplierXmlApi = new SupplierXmlApi(); $xml = $supplierXmlApi->getFeed($permissions, $protocol); } if ($mode == 'tot') { $permissions['header_information'] .= ''.date('Y-m-d').''; } if ($mode == 'ep' || $mode == 'ro') { $permissions['header_information'] = ''.$permissions['header_information']; $permissions['footer_information'] .= ''; } $xml = $permissions['header_information'].$xml.$permissions['footer_information']; if ($permissions['use_cache']) { if ($now > $cache_period) { if (empty($check_affiliate['affiliate_name'])) { $affiliate = false; } $create_name = ''; if (empty($permissions['file_name'])) { $permissions['file_name'] = md5(md5(rand(99999, 99999999).'aKf5ad@d50gaq0sd'.date('Y-m-d H:i:s'))); $create_name = 'file_name="'.$permissions['file_name'].'", '; } $file_url = _PS_ROOT_DIR_.'/modules/xmlfeeds/xml_files/'.$permissions['file_name'].'.xml'; file_put_contents($file_url, $xml); if (file_exists($file_url)) { Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'blmod_xml_feeds_cache (`feed_id`, `feed_part`, `file_name`, `last_cache_time`, `affiliate_name`) VALUES ("'.(int)$id.'", "'.(int)$part.'", "'.pSQL($permissions['file_name']).'", "'.pSQL($now).'", "")'); } } } if ($useCron) { $file_url = _PS_ROOT_DIR_.'/modules/xmlfeeds/xml_files/feed_'.$id.'.xml'; file_put_contents($file_url, ''.$xml); Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'blmod_xml_feeds SET `last_cron_date` = "'.pSQL(date('Y-m-d H:i:s')).'" WHERE id = "'.(int)$id.'"'); $compressor->compress('feed_'.$id.'.xml'); AccessLog::save($id, 'end_cron', $sessionId); die('done'); } function insert_statistics($feed_id = false, $affiliate = '') { Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_statistics WHERE `date` < "'.XmlFeedsTools::dateMinusDays(180).'"'); Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'blmod_xml_statistics (`feed_id`, `affiliate_name`, `date`, `ip_address`) VALUES ("'.(int)$feed_id.'", "'.pSQL(is_array($affiliate) ? implode(', ', $affiliate) : '').'", "'.pSQL(date('Y-m-d H:i:s')).'", "'.pSQL(get_ip()).'")'); Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'blmod_xml_feeds SET total_views = total_views + 1 WHERE id = "'.(int)$feed_id.'"'); } function get_ip() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } return $ip; } function getShopProtocol() { if (method_exists('Tools', 'getShopProtocol')) { return Tools::getShopProtocol(); } return (Configuration::get('PS_SSL_ENABLED') || (!empty($_SERVER['HTTPS']) && Tools::strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://'; } function whereType($type) { if (!empty($type)) { return ' AND '; } return ' WHERE '; } header('Content-type: text/xml;charset:'.$permissions['encoding_text']); if (!empty($downloadAction)) { header('Content-Disposition:attachment;filename='.$feed_name.'_feed.xml'); } AccessLog::save($id, 'end', $sessionId); $xmlWithHeader = ''.$xml; $compressor->compress('', $xmlWithHeader); echo $xmlWithHeader; die;