Files
drmaterac.pl/modules/xmlfeeds/api/ProductXmlApi.php
2025-01-06 20:47:25 +01:00

3879 lines
173 KiB
PHP

<?php
/**
* 2010-2023 Bl Modules.
*
* If you wish to customize this module for your needs,
* please contact the authors first for more information.
*
* It's not allowed selling, reselling or other ways to share
* this file or any other module files without author permission.
*
* @author Bl Modules
* @copyright 2010-2023 Bl Modules
* @license
*/
class ProductXmlApi
{
protected $settings = array();
protected $attributeMapValues = array();
protected $featureMapValues = array();
protected $isFeatureActive = true;
protected $PS_LABEL_OOS_PRODUCTS_BOA = ''; //Label of out-of-stock products with allowed backorders
protected $langId = 1;
protected $langIdAll = array();
protected $langIdWitIso = [];
protected $productTitleEditorValues = array();
protected $productParam = array();
protected $productAttributes = [];
protected $productAttributesAllLanguages = [];
protected $featuresKeyByName = array();
protected $isExistsCategoryGetAllParents = true;
protected $publicGrProducts = false;
protected $extraFieldByName = [];
protected $productFeatures = [];
protected $productFeaturesWithId = [];
protected $productLangValues = [];
protected $taxRateList = [];
protected $productAttributeAndFeatureName = [];
protected $groupedAttributesByParent = [];
protected $offerAdditionalFields = [];
/**
* @var AvailabilityLabel
*/
protected $availabilityLabel;
/**
* @var ProductTitleEditor
*/
protected $productTitleEditor;
public function getFeed(
$permissions,
$id,
$prefS,
$prefE,
$html_tags_status,
$extra_feed_row,
$one_branch,
$only_enabled,
$split_feed_limit,
$part,
$categories,
$cat_list,
$multistoreString,
$onlyInStock,
$priceRange,
$price_with_currency,
$mode,
$allImages,
$affiliate,
$currencyId,
$feedGenerationTime,
$feedGenerationTimeName,
$splitByCombination,
$productList,
$productListStatus,
$shippingCountry,
$filterDiscount,
$filterCategoryType,
$productSettingsPackageId,
$settings,
$feedSettings,
$context
) {
$mode = $settings['feed_mode'];
$settings['feed_mode_real'] = $mode;
$this->settings = $feedSettings;
$this->settings['pref_s'] = $prefS;
$this->settings['pref_e'] = $prefE;
$this->settings['is_enabled_field'] = [];
$this->settings['domain'] = str_replace('www.', '', $_SERVER['SERVER_NAME']);
$this->settings['field_status_offers'] = json_decode(htmlspecialchars_decode(Configuration::get('BLMOD_XML_FEED_STATUS_OFFERS')), true);
$this->settings['feed_type_sql'] = ($this->settings['xml_type'] == 'offers') ? 'offer' : '';
$outOfStockStatus = 1;
if ($mode == 'cat' || $mode == 'publ' || $mode == 'dar' || $mode == 'ibs' || $mode == 'ven') {
$mode = 'mir';
}
if ($mode == 'pb' || $mode == 'cri' || $mode == 'pm' || $mode == 'gei' || $mode == 'ski'
|| $mode == 'cew' || $mode == 'bi' || $mode == 'hb' || $mode == 'hb'|| $mode == 'fc' || $mode == 'pl'
|| $mode == 'f' || $mode == 'ins' || $mode == 'pint' || $mode == 'fav') {
$mode = 'g';
}
if ($mode == 'twi') {
$mode = 'pub';
}
$this->settings['feed_mode_final'] = $mode;
$toolsR = new ReflectionMethod('Tools', 'getPath');
$this->settings['totalGetPathMethods'] = $toolsR->getNumberOfRequiredParameters();
$productListClass = new ProductList($settings['product_list_exclude']);
$productSettings = new ProductSettingsFront();
$mergeAttributesByGroup = new MergeAttributesByGroup();
$filterByAttribute = new FilterByAttribute();
$productPropertyMap = new ProductPropertyMap();
$this->productTitleEditor = new ProductTitleEditor();
$feedPrice = new FeedPrice();
$productCombination = new ProductCombinations();
$filterByFeature = new FilterByFeature();
$categoryTreeGenerator = new CategoryTreeGenerator();
$databaseTableConnector = new DatabaseTableConnector();
$this->availabilityLabel = new AvailabilityLabel();
$feedShippingPrice = new FeedShippingPrice();
$link_class = new Link();
$this->productTitleEditorValues = $this->productTitleEditor->getByFeedId($id);
$this->attributeMapValues = $productPropertyMap->getMapValuesWithKey($this->settings['attribute_map_id']);
$this->featureMapValues = $productPropertyMap->getMapValuesWithKey($this->settings['feature_map_id']);
$this->isFeatureActive = Feature::isFeatureActive();
$this->settings['title_elements'] = $this->productTitleEditor->getNewElementsByFeedId($id);
$this->isExistsCategoryGetAllParents = method_exists('Category', 'getAllParents');
$genderCategories = $categoryTreeGenerator->get($id);
$customTableFields = $databaseTableConnector->get($id);
$productListProductIdForXmlTags = [];
$customXmlTagsByProductList = [];
$customXmlTagByProductId = [];
$this->settings['base_link'] = is_callable([$link_class, 'getBaseLink']) ? $link_class->getBaseLink() : _PS_BASE_URL_.__PS_BASE_URI__;
if (!empty($this->settings['product_list_xml_tag_array'])) {
$customXmlTagsByProductList = $productListClass->getProductListWithXmlTags($this->settings['product_list_xml_tag_array']);
foreach ($this->settings['product_list_xml_tag_array'] as $lx) {
$productListProductIdForXmlTags[$lx] = $productListClass->getProductsByProductList([$lx], []);
foreach ($productListProductIdForXmlTags[$lx] as $i) {
$customXmlTagByProductId[$i][$lx] = $lx;
}
}
}
if (!empty($permissions['merge_attributes_by_group']) && empty($permissions['merge_attributes_parent'])) {
$permissions['merge_attributes_by_group'] = 0;
}
if (!empty($permissions['merge_attributes_by_group'])) {
$mergeAttributesByGroup->setParentGroup($permissions['merge_attributes_parent']);
$mergeAttributesByGroup->setChildGroup($permissions['merge_attributes_child']);
}
$productSettingsList = $productSettings->getXmlByPackageId($productSettingsPackageId);
$block_name = array();
$block_status = array();
$xml_name = array();
$xml_name_l = array();
$all_l_iso = array();
$xml_cat_name = array();
$xml_lf = array();
$cover_i = array();
$image_info = array();
$priceFrom = false;
$priceTo = false;
$xml = '';
$categoriesOfProductsUsed = array();
$productId = htmlspecialchars(Tools::getValue('product_id'), ENT_QUOTES);
if (!empty($priceRange)) {
list($priceFrom, $priceTo) = explode(';', $priceRange);
}
$id_lang = Configuration::get('PS_LANG_DEFAULT');
$url_type = getShopProtocol();
$allImages = !empty($splitByCombination) ? true : $allImages;
$block_n = Db::getInstance()->ExecuteS('SELECT `name`, `value`, `status`
FROM '._DB_PREFIX_.'blmod_xml_block
WHERE category = "'.(int)$id.'"');
foreach ($block_n as $bn) {
$block_name[$bn['name']] = $bn['value'];
$block_status[$bn['name']] = $bn['status'];
}
$r = Db::getInstance()->ExecuteS('SELECT `name`, `status`, `title_xml`, `table`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `type` = "'.pSQL($this->settings['feed_type_sql']).'" AND `table` != "lang" AND `table` != "img_blmod" AND `table` != "category_lang"
AND `table` != "product_lang" AND `table` != "bl_extra" AND `table` != "bl_extra_att" AND `status` = 1
AND `table` != "bl_extra_feature" AND `table` != "bl_extra_attribute_group"
ORDER BY `table` ASC');
$field = '';
foreach ($r as $f) {
$field .= ' '._DB_PREFIX_.$f['table'].'.`'.$f['name'].'` AS '.$f['table'].'_'.$f['name'].' ,';
$xml_name[$f['table'].'_'.$f['name']] = $f['title_xml'];
}
$extra_field = Db::getInstance()->ExecuteS('SELECT `name`, `title_xml`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `type` = "'.pSQL($this->settings['feed_type_sql']).'" AND `table` = "bl_extra" AND status = "1"');
if (empty($field) && empty($extra_field)) {
die('empty field list');
}
if (!empty($extra_field)) {
foreach ($extra_field as $b_e) {
if (empty($b_e['title_xml'])) {
continue;
}
$this->extraFieldByName[$b_e['name']] = $b_e['title_xml'];
}
}
if (!empty($field)) {
$field = ','.trim($field, ',');
}
$where_only_active = '';
$order = '';
$limit = '';
if (!empty($only_enabled)) {
$where_only_active = 'WHERE '._DB_PREFIX_.'product_shop.active = "1"';
}
if (!empty($split_feed_limit) && !empty($part)) {
$order = ' ORDER BY '._DB_PREFIX_.'product.id_product ASC';
$limit = ' LIMIT '.((int)$split_feed_limit * (int)--$part).','.(int)$split_feed_limit;
}
$category_table = '';
$categoryJoinMain = false;
if (!empty($categories) && !empty($cat_list)) {
if (empty($filterCategoryType)) {
$categoryJoinMain = true;
$category_table = '
LEFT JOIN '._DB_PREFIX_.'category_product cp ON
('._DB_PREFIX_.'category_product.id_product = '._DB_PREFIX_.'product.id_product AND '._DB_PREFIX_.'product.id_category_default = '._DB_PREFIX_.'category_product.id_category)';
$where_only_active .= $this->whereType($where_only_active) . _DB_PREFIX_ . 'product.id_category_default IN ('.pSQL($cat_list).')';
} else {
$category_table = 'INNER JOIN '._DB_PREFIX_.'category_product cp ON
('._DB_PREFIX_.'category_product.id_product = '._DB_PREFIX_.'product.id_product AND '._DB_PREFIX_.'category_product.id_category IN ('.pSQL($cat_list).'))';
}
}
if (!empty($feedSettings['categories_without']) && !empty($feedSettings['cat_without_list'])) {
if (empty($feedSettings['filter_category_without_type'])) {
if (!$categoryJoinMain) {
$category_table .= '
LEFT JOIN '._DB_PREFIX_.'category_product cw ON
(cw.id_product = '._DB_PREFIX_.'product.id_product AND '._DB_PREFIX_.'product.id_category_default = cw.id_category)';
}
$where_only_active .= $this->whereType($where_only_active) . _DB_PREFIX_ . 'product.id_category_default NOT IN ('.pSQL($feedSettings['cat_without_list']).')';
} else {
$category_table .= 'LEFT JOIN '._DB_PREFIX_.'category_product cw ON
(cw.id_product = '._DB_PREFIX_.'product.id_product AND cw.id_category IN ('.pSQL($feedSettings['cat_without_list']).'))';
$where_only_active .= $this->whereType($where_only_active).'cw.id_product IS NULL';
}
}
$multistoreJoin = '';
$multistoreId = !empty($multistoreString) ? (int)$multistoreString : null;
if (!empty($permissions['manufacturer']) && !empty($permissions['manufacturer_list'])) {
$where_only_active .= $this->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 .= $this->whereType($where_only_active)._DB_PREFIX_.'product.id_supplier IN ('.pSQL($permissions['supplier_list']).')';
}
if (!empty($permissions['filter_visibility'])) {
$where_only_active .= $this->whereType($where_only_active)._DB_PREFIX_.'product.visibility = "'.pSQL($permissions['filter_visibility']).'"';
}
if (!empty($productId)) {
$where_only_active .= $this->whereType($where_only_active)._DB_PREFIX_.'product.id_product = "'.(int)$productId.'"';
}
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 .= $this->whereType($where_only_active) . _DB_PREFIX_ . 'product.id_product IN (' . pSQL(implode(',', $productListActive)) . ')';
}
if (!empty($productListExcludeActive)) {
$where_only_active .= $this->whereType($where_only_active)._DB_PREFIX_.'product.id_product NOT IN ('.pSQL(implode(',', $productListExcludeActive)).')';
}
}
if (!empty($permissions['only_on_sale'])) {
$where_only_active .= $this->whereType($where_only_active)._DB_PREFIX_.'product_shop.on_sale = 1';
}
if (!empty($permissions['only_available_for_order'])) {
$where_only_active .= $this->whereType($where_only_active)._DB_PREFIX_.'product_shop.available_for_order = 1';
}
if (!empty($settings['filter_created_before_days'])) {
$dateCreatedBefore = date('Y-m-d H:i:s', strtotime(date('Y-m-d H:i:s').'-'.(int)$settings['filter_created_before_days'].'days'));
$where_only_active .= $this->whereType($where_only_active)._DB_PREFIX_.'product.date_add > "'.$dateCreatedBefore.'"';
}
$isbnSqlField = XmlFeedsTools::isIsbnExists() ? _DB_PREFIX_.'product.isbn AS blmod_isbn, ' : '';
$customTableFieldsSql = '';
if (!empty($customTableFields['column_value'][0])) {
list($customColumn, $customTable) = explode('+', $customTableFields['column_connector'][0]);
$field .= ', '.$customTable.'.'.$customTableFields['column_value'][0].' AS blmod_custom_table_0';
$customTableFieldsSql = 'LEFT JOIN '.$customTable.' ON '.$customTable.'.'.$customColumn.' = '._DB_PREFIX_.'product.id_product ';
$xml_name['blmod_custom_table_0'] = $customTableFields['name'][0];
}
$replaceTableName = [
_DB_PREFIX_.'product.' => 'p.',
_DB_PREFIX_.'manufacturer.' => 'm.',
_DB_PREFIX_.'supplier.' => 's.',
_DB_PREFIX_.'product_shop.' => 'ps.',
_DB_PREFIX_.'category_product.' => 'cp.',
];
$sql = 'SELECT DISTINCT('._DB_PREFIX_.'product.id_product) AS pro_id, '._DB_PREFIX_.'product.id_category_default AS blmod_cat_id,
'._DB_PREFIX_.'product.reference AS blmod_reference, '._DB_PREFIX_.'product.ean13 AS blmod_ean13,
'._DB_PREFIX_.'product.upc AS blmod_upc, '.pSQL($isbnSqlField).
_DB_PREFIX_.'manufacturer.name AS blmod_manufacturer, '._DB_PREFIX_.'product.price AS blmod_price'.pSQL($field).'
FROM '._DB_PREFIX_.'product p
LEFT JOIN '._DB_PREFIX_.'manufacturer m ON
m.id_manufacturer = p.id_manufacturer
LEFT JOIN '._DB_PREFIX_.'supplier s ON
s.id_supplier = p.id_supplier
LEFT JOIN '._DB_PREFIX_.'product_shop ps ON
(p.id_product = ps.id_product AND ps.id_shop = '.(!empty($multistoreId) ? $multistoreId : 1).')
'.$multistoreJoin.$category_table.$customTableFieldsSql.$where_only_active.$order.$limit;
foreach ($replaceTableName as $name => $prefix) {
$sql = str_replace($name, $prefix, $sql);
}
$xmlWithoutKey = Db::getInstance()->ExecuteS($sql);
$this->settings['is_enabled_field']['available_for_order'] = $this->isEnabledField($id, 'available_for_order', 'product');
$this->settings['is_enabled_field']['quantity'] = $this->isEnabledField($id, 'quantity', 'product');
$this->settings['is_enabled_field']['availability_label'] = $this->isEnabledField($id, 'availability_label', 'bl_extra');
$xml_d = array();
foreach ($xmlWithoutKey as $p) {
$xml_d[$p['pro_id']] = $p;
}
//Language
$l = Db::getInstance()->ExecuteS('SELECT `name`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `type` = "'.pSQL($this->settings['feed_type_sql']).'" AND `table` = "lang"');
$googleCatMap = $this->getGoogleCatMap($mode, $settings);
$count_lang = 0;
$categoriesByKey = array();
if (!empty($l)) {
$count_lang = count($l);
if ($count_lang < 2) {
$id_lang = $l[0]['name'];
$this->langId = $id_lang;
}
//Default category name
$cat_name_status = Db::getInstance()->getRow('SELECT `name`, `status`, `title_xml`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `type` = "'.pSQL($this->settings['feed_type_sql']).'" AND `table` = "category_lang"');
if (!empty($cat_name_status['status']) && !empty($cat_name_status['title_xml'])) {
$cat_name = $this->getAllCategories($l, $multistoreId);
if (!empty($cat_name)) {
$cat_old = false;
if ($count_lang < 2 || $mode == 'ep') {
foreach ($cat_name as $cn) {
$categoriesByKey[$cn['id_category']] = $cn['name'];
if ($cat_old == $cn['id_category']) {
$xml_cat_name[$cn['id_category']] .= '<'.$cat_name_status['title_xml'].'>';
} else {
$xml_cat_name[$cn['id_category']] = '<'.$cat_name_status['title_xml'].'>';
}
if (!empty($googleCatMap[$cn['id_category']])) {
$cn['name'] = $googleCatMap[$cn['id_category']]['name'];
}
$xml_cat_name[$cn['id_category']] .= $this->settings['pref_s'].$cn['name'].$this->settings['pref_e'];
$xml_cat_name[$cn['id_category']] .= '</'.$cat_name_status['title_xml'].'>';
if ($mode == 'pub') {
$xml_cat_name[$cn['id_category']] = $this->settings['pref_s'].$cn['name'].$this->settings['pref_e'];
}
$cat_old = $cn['id_category'];
}
} else {
foreach ($cat_name as $cn) {
$langPrefix = '-'.$cn['iso_code'];
if ($cat_old == $cn['id_category']) {
$xml_cat_name[$cn['id_category']] .= '<'.$cat_name_status['title_xml'].$langPrefix.'>';
} else {
$xml_cat_name[$cn['id_category']] = '<'.$cat_name_status['title_xml'].$langPrefix.'>';
}
if (!empty($googleCatMap[$cn['id_category']])) {
$cn['name'] = $googleCatMap[$cn['id_category']]['name'];
}
$xml_cat_name[$cn['id_category']] .= $this->settings['pref_s'].$cn['name'].$this->settings['pref_e'];
$xml_cat_name[$cn['id_category']] .= '</'.$cat_name_status['title_xml'].$langPrefix.'>';
$cat_old = $cn['id_category'];
}
}
}
} else {
$xml_cat_name = array();
$categoriesAll = $this->getAllCategories($l, $multistoreId);
foreach ($categoriesAll as $c) {
$categoriesByKey[$c['id_category']] = $c['name'];
}
}
//Description
$l_where = '';
$languagesFromDb = Language::getLanguages(false);
foreach ($l as $ll) {
foreach ($languagesFromDb as $lDb) {
if ($lDb['id_lang'] == $ll['name']) {
$this->langIdWitIso[$ll['name']] = $lDb['iso_code'];
break;
}
}
$l_where .= 'OR '._DB_PREFIX_.'product_lang.id_lang='.(int)$ll['name'].' ';
}
$l_where = trim($l_where, 'OR');
if (_PS_VERSION_ >= '1.5') {
$l_where .= ' AND '._DB_PREFIX_.'product_lang.id_shop = "'.(!empty($multistoreId) ? (int)$multistoreId : "1").'"';
}
$rl = Db::getInstance()->ExecuteS('SELECT `name`, `status`, `title_xml`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `type` = "'.pSQL($this->settings['feed_type_sql']).'" AND `table` = "product_lang" AND status = 1');
$field = '';
foreach ($rl as $fl) {
$field .= ' `'._DB_PREFIX_.'product_lang`.`'.$fl['name'].'`,';
$xml_name_l[$fl['name']] = $fl['title_xml'];
}
if (!empty($field)) {
$field = ','.trim($field, ',');
}
$xml_l = Db::getInstance()->ExecuteS('SELECT '._DB_PREFIX_.'product_lang.id_product,
'._DB_PREFIX_.'product_lang.description_short AS description_short_blmod,
'._DB_PREFIX_.'lang.iso_code as blmodxml_l '.pSQL($field).'
FROM '._DB_PREFIX_.'product_lang
LEFT JOIN '._DB_PREFIX_.'lang ON
'._DB_PREFIX_.'lang.id_lang = '._DB_PREFIX_.'product_lang.id_lang
WHERE '.$l_where.'
ORDER BY '._DB_PREFIX_.'product_lang.id_product ASC');
$shortDescriptionList = array();
if (!empty($xml_l) && !empty($field)) {
$firstLang = !empty($languagesFromDb[0]) ? $languagesFromDb[0]['iso_code'] : '';
foreach ($xml_l as $xll) {
$id_cat = $xll['id_product'];
$l_iso = $xll['blmodxml_l'];
$all_l_iso[] = $l_iso;
$lang_prefix = '-'.$l_iso;
$prefixOpen = '';
if ($count_lang < 2 && $mode != 'h') {
$lang_prefix = '';
}
if ($mode == 'h') {
$lang_prefix = $this->getLanguageCodeLong($l_iso);
}
if ($mode == 'ep') {
$lang_prefix = '';
$prefixOpen = ' lang="'.$l_iso.'"';
}
if ($mode == 'spa') {
$lang_prefix = '';
}
if ($mode == 'pub') {
$lang_prefix = Tools::strtoupper($this->getLanguageCodeLong($l_iso));
}
$xml_lf[$id_cat.$l_iso] = '';
foreach ($xll as $idl => $vall) {
if ($idl == 'id_product' || $idl == 'blmodxml_l' || ($mode != 'i' && $idl == 'description_short_blmod')) {
continue;
}
$vall = isset($vall) ? $vall : '';
$vall = !empty($this->settings['is_htmlspecialchars']) ? htmlspecialchars_decode($vall, ENT_QUOTES) : $vall;
if ($html_tags_status) {
$vall = strip_tags($vall);
}
$vallOrg = $vall;
if ($idl == 'name') {
if ($mode == 'i' && !empty($xml_d[$xll['id_product']]['manufacturer_name'])) {
$vall = $xml_d[$xll['id_product']]['manufacturer_name'].' '.$vall;
}
$this->productParam['title'.'-'.$l_iso][$xll['id_product']] = $vall;
$vall = REPLACE_COMBINATION.$idl.'-'.$l_iso;
}
if (($idl == 'description_short' || $idl == 'description') && empty($vall)) {
$vall = REPLACE_COMBINATION.$idl.'-'.$l_iso;
}
if (($idl == 'description_short') && $mode == 'mal') {
$vall = Tools::substr($vall, 0, 300);
}
if (($idl == 'description') && $mode == 'mal') {
$vall = Tools::substr($vall, 0, 13000);
}
if ($mode == 'i' && $idl == 'description_short_blmod') {
$shortDescriptionList[$xll['id_product']] = htmlspecialchars($vall);
continue;
}
if ($mode == 'pub') {
if ($idl == 'name' && $l_iso != $firstLang) {
continue;
}
$xml_lf[$id_cat . $l_iso] .= '<attribute><code>'.$xml_name_l[$idl].(($count_lang > 1 && ($idl == 'description_short' || $idl == 'description')) ? '_'.$lang_prefix : '').'</code><value><![CDATA[' . $vall . ']]></value></attribute>';
} else {
$xml_lf[$id_cat . $l_iso] .= $this->getDeepTagName($xml_name_l[$idl] . $lang_prefix.$prefixOpen) . '<![CDATA[' . $vall . ']]>' . $this->getDeepTagName($xml_name_l[$idl] . $lang_prefix, true);
}
}
if ($mode == 'r') {
$xml_lf[$id_cat.$l_iso] = '<Description><Language>'.$l_iso.'</Language>'.$xml_lf[$id_cat.$l_iso].'</Description>';
}
}
$all_l_iso = array_unique($all_l_iso);
$this->langIdAll = $all_l_iso;
}
}
//Images
if (_PS_VERSION_ < '1.5') {
$use_ps_images_class = false;
$image_class_name = 'ImageCore';
if (!class_exists($image_class_name, false)) {
$image_class_name = 'Image';
}
$img_class = new $image_class_name();
if (method_exists($img_class, 'getExistingImgPath')) {
$use_ps_images_class = true;
}
} else {
$use_ps_images_class = true;
}
if (_PS_VERSION_ > '1.5.3') {
$image_class_name = 'Image';
}
$img_name_extra = false;
if (_PS_VERSION_ >= '1.5.1' && _PS_VERSION_ < '1.3') {
$img_name_extra = '_default';
}
$img = Db::getInstance()->ExecuteS('SELECT `name`, `title_xml`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `type` = "'.pSQL($this->settings['feed_type_sql']).'" AND `table` = "img_blmod" AND status = "1"');
$product_class_name = 'ProductCore';
if (!class_exists($product_class_name, false)) {
$product_class_name = 'Product';
}
if (empty($allImages)) {
$img_cover = Db::getInstance()->ExecuteS('SELECT `id_image`, `id_product`
FROM '._DB_PREFIX_.'image
WHERE cover = "1"');
foreach ($img_cover as $c) {
$cover_i[$c['id_product']] = $c['id_image'];
}
}
$base_dir_img = _PS_BASE_URL_.__PS_BASE_URI__.'img/p/';
if ($mode == 'wum') {
$features = $this->getAllAttributes($id_lang);
$xml .= '<features>';
foreach ($features as $f) {
$this->featuresKeyByName[$f['name']] = $f['id_attribute'];
$xml .= '<feature id="'.$f['id_attribute'].'">'.$this->settings['pref_s'].$f['name'].$this->settings['pref_e'].'</feature>';
}
$xml .= '</features>';
$manufacturers = Manufacturer::getManufacturers(false, $id_lang);
$xml .= '<brands>';
foreach ($manufacturers as $m) {
$xml .= '<brand id="'.$m['id_manufacturer'].'">'.$this->settings['pref_s'].$m['name'].$this->settings['pref_e'].'</brand>';
}
$xml .= '</brands>';
}
if ($mode == 'dm') {
$xml .= '<created_at>'.date('Y-m-d H:i').'</created_at>';
}
if ($mode == 'sfl') {
$xml .= '<created_at>'.date('Y-m-d H:i:s').'</created_at>';
}
if ($mode == 'ro') {
$categoriesAll = $this->getAllCategories($l, $multistoreId);
$xml .= '<categories>';
foreach ($categoriesAll as $cat) {
$xml .= '<category id="'.$cat['id_category'].'">'.$this->settings['pref_s'].$cat['name'].$this->settings['pref_e'].'</category>';
}
$xml .= '</categories>';
}
if ($mode == 'ho') {
$categoriesAll = $this->getAllCategories($l, $multistoreId);
$xml .= '<categories>';
foreach ($categoriesAll as $cat) {
$xml .= '<category><id>'.$cat['id_category'].'</id><name>'.$this->settings['pref_s'].$cat['name'].$this->settings['pref_e'].'</name></category>';
}
$xml .= '</categories>';
}
if ($mode == 'cgr') {
$xml .= ' <lastupdate>'.str_replace(' ', 'T', date('Y-m-d H:i:s')).'Z</lastupdate>';
}
$this->settings['currencyIso'] = false;
$this->settings['currencyIdConvert'] = !empty($currencyId) ? $currencyId : false;
$currencyId = !empty($currencyId) ? $currencyId : Configuration::get('PS_CURRENCY_DEFAULT');
$feedCurrency = '';
if (!empty($currencyId)) {
$currencyClass = Currency::getCurrency($currencyId);
$feedCurrency = ' '.$currencyClass['iso_code'];
}
if (!empty($price_with_currency) && !empty($feedCurrency)) {
$this->settings['currencyIso'] = $feedCurrency;
}
if (!empty($block_status['file-name'])) {
$fileNameParam = '';
if ($mode == 'sez') {
$fileNameParam = ' xmlns="http://www.zbozi.cz/ns/offer/1.0"';
}
if ($mode == 'ceo') {
$fileNameParam = ' name="other"';
}
if ($mode == 'tt') {
$fileNameParam = ' version="1.0" timestamp="'.date('Ymd:H:i:s').'"';
}
if ($mode == 'bee') {
$fileNameParam = ' currency = "'.trim($feedCurrency).'"'.(!empty($l_iso) ? ' lang="'.$l_iso.'"' : '');
}
$xml .= '<' . $block_name['file-name'] .$fileNameParam. '>';
}
if (!empty($feedGenerationTime) && !empty($feedGenerationTimeName) && $settings['feed_mode_real'] != 'pub') {
$xml .= '<'.$feedGenerationTimeName.'>'.date('Y-m-d H:i:s').'</'.$feedGenerationTimeName.'>';
}
$xml .= $extra_feed_row;
//Get attributes
$extra_attributes = Db::getInstance()->ExecuteS('SELECT `name`, `title_xml`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `type` = "'.pSQL($this->settings['feed_type_sql']).'" AND `table` = "bl_extra_att" AND status = "1"');
//Feature
$featureEnable = false;
$fieldFeature = array();
$fieldGroupedAttributes = array();
$extraFieldFeature = Db::getInstance()->ExecuteS('SELECT `name`, `title_xml`, `table`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `type` = "'.pSQL($this->settings['feed_type_sql']).'" AND (`table` = "bl_extra_feature" OR `table` = "bl_extra_attribute_group")
AND status = "1"');
if (!empty($extraFieldFeature)) {
foreach ($extraFieldFeature as $f) {
if ($f['table'] == 'bl_extra_feature') {
$fieldFeature[$f['name']] = $f;
} elseif ($f['table'] == 'bl_extra_attribute_group') {
$fieldGroupedAttributes[$f['name']] = $f;
}
}
}
if (method_exists($product_class_name, 'getFrontFeaturesStatic')) {
$featureEnable = true;
}
$configuration = Configuration::getMultiple(
[
'PS_LANG_DEFAULT',
'PS_SHIPPING_FREE_PRICE',
'PS_SHIPPING_HANDLING',
'PS_SHIPPING_METHOD',
'PS_SHIPPING_FREE_WEIGHT',
'PS_CARRIER_DEFAULT',
'PS_COUNTRY_DEFAULT',
'PS_ORDER_OUT_OF_STOCK',
]
);
$this->settings['configuration'] = $configuration;
$configurationLang = Configuration::getMultiple(
[
'PS_LABEL_DELIVERY_TIME_AVAILABLE',
'PS_LABEL_DELIVERY_TIME_OOSBOA',
'PS_LABEL_IN_STOCK_PRODUCTS',
'PS_LABEL_OOS_PRODUCTS_BOA',
'PS_LABEL_OOS_PRODUCTS_BOD',
],
$this->langId
);
$carrierIdDefault = $configuration['PS_CARRIER_DEFAULT'];
$this->settings['configurationLang'] = $configurationLang;
$shippingCountry = !empty($this->settings['shipping_countries'][0]) ? $this->settings['shipping_countries'][0] : $configuration['PS_COUNTRY_DEFAULT'];
$feedShippingPrice->setData($id_lang, $this->settings, $configuration, $multistoreId);
$feedShippingPrice->loadCountries($carrierIdDefault);
$defaultCountry = new Country($shippingCountry, $id_lang);
$address = new Address();
$address->id_country = $shippingCountry;
$address->id_state = 0;
$address->postcode = 0;
//END Shipping parameter
$weightUnit = Configuration::get('PS_WEIGHT_UNIT');
$xmlProductMruAll = '';
$mruProductFields = array(
'product_categories_tree',
'id_category_all',
'product_url_blmod',
);
if (class_exists('PrestaShop\PrestaShop\Adapter\Configuration', false)) {
$configurationAdapter = new PrestaShop\PrestaShop\Adapter\Configuration;
$PS_LABEL_OOS_PRODUCTS_BOA_LIST = $configurationAdapter->get('PS_LABEL_OOS_PRODUCTS_BOA');
$this->PS_LABEL_OOS_PRODUCTS_BOA = !empty($PS_LABEL_OOS_PRODUCTS_BOA_LIST[$this->langId]) ? $PS_LABEL_OOS_PRODUCTS_BOA_LIST[$this->langId] : '';
}
$this->availabilityLabel->setSettings($this->settings);
$mergeAttributesByGroup->setSettings($this->settings);
foreach ($xml_d as $xdd) {
if (!empty($allImages)) {
$img_all_images = Db::getInstance()->ExecuteS('SELECT `id_image`, `id_product`
FROM '._DB_PREFIX_.'image
WHERE id_product = "'.(int)$xdd['pro_id'].'"
ORDER BY `cover` DESC, `position` ASC');
} else {
$img_all_images[0]['id_image'] = isset($cover_i[$xdd['pro_id']]) ? $cover_i[$xdd['pro_id']] : false;
}
if (!empty($settings['filter_image']) && empty($settings['split_by_combination'])) {
if ($settings['filter_image'] == 1) {
if (empty($img_all_images[0]['id_image'])) {
continue;
}
}
if ($settings['filter_image'] == 2) {
if (!empty($img_all_images[0]['id_image'])) {
continue;
}
}
}
/**
* @var $product_class ProductCore
*/
$product_class = new $product_class_name($xdd['pro_id'], false, $id_lang);
$productQty = (int)$product_class->getQuantity($xdd['pro_id']);
$this->availabilityLabel->setIsAvailableWhenOutOfStock(StockAvailable::outOfStock($xdd['pro_id']));
if (empty($this->settings['price_rounding_type'])) {
$salePrice = Tools::ps_round($product_class->getPriceStatic($xdd['pro_id'], true, null), 2);
} else {
$salePrice = $product_class->getPriceStatic($xdd['pro_id'], true, null, 2);
}
$basePrice = $product_class->price;
$wholesalePrice = $product_class->wholesale_price;
$taxRate = $this->getTaxRation($product_class, $address, $context);
$combinations = [];
if (!empty($splitByCombination)) {
$combinations = $productCombination->getCombinations($product_class, $id_lang);
}
if (empty($combinations) && !empty($permissions['filter_exclude_empty_params'])) {
foreach ($permissions['filter_exclude_empty_params'] as $emptyParamKEy) {
if (empty($xdd['blmod_'.$emptyParamKEy])) {
continue 2;
}
}
}
$shippingPriceAll = $feedShippingPrice->getPrice($product_class, $salePrice);
$shippingPrice = 0;
foreach ($shippingPriceAll as $spa) {
$shippingPrice = $spa;
break;
}
$shippingPrice = $this->getPriceFormat($feedPrice->getEditedPrice($shippingPrice, 'shipping_price', $this->settings));
$priceWithoutDiscount = $product_class->getPriceStatic($xdd['pro_id'], true, null, 2, null, false, false);
$combinationDefault = [];
$this->productParam['shipping_price'][$xdd['pro_id']] = $shippingPrice;
$this->productParam['reference'][$xdd['pro_id']] = $xdd['blmod_reference'];
$this->productParam['ean13'][$xdd['pro_id']] = $xdd['blmod_ean13'];
$this->productParam['isbn'][$xdd['pro_id']] = isset($xdd['blmod_isbn']) ? $xdd['blmod_isbn'] : '';
$this->productParam['manufacturer'][$xdd['pro_id']] = $xdd['blmod_manufacturer'];
$this->productParam['sale_price'][$xdd['pro_id']] = $salePrice;
$this->productParam['category'][$xdd['pro_id']] = !empty($categoriesByKey[$xdd['blmod_cat_id']]) ? $categoriesByKey[$xdd['blmod_cat_id']] : '';
$this->productParam['category_id'][$xdd['pro_id']] = $xdd['blmod_cat_id'];
$this->productParam['tax_rate'][$xdd['pro_id']] = $taxRate;
$availabilityName = $this->getAvailabilityByMode($product_class, $feedSettings, $configurationLang);
if ($filterDiscount == 1 && number_format($salePrice, 2, '.', '') >= number_format($priceWithoutDiscount, 2, '.', '')) {
continue;
}
if ($filterDiscount == 2 && number_format($salePrice, 2, '.', '') != number_format($priceWithoutDiscount, 2, '.', '')) {
continue;
}
if ((!empty($priceFrom) && $salePrice < $priceFrom) || (!empty($priceTo) && $salePrice > $priceTo)) {
continue;
}
if (!empty($settings['filter_qty_status'])) {
$onlyInStock = true;
if ($settings['filter_qty_type'] == '>' && $productQty < $settings['filter_qty_value']) {
continue;
} elseif ($settings['filter_qty_type'] == '<' && $productQty >= $settings['filter_qty_value']) {
continue;
} elseif ($settings['filter_qty_type'] == '=' && $productQty != $settings['filter_qty_value']) {
continue;
}
}
if (!empty($settings['only_available_for_order'])) {
$outOfStockStatus = StockAvailable::outOfStock($xdd['pro_id']);
if ($productQty < 1 && $outOfStockStatus == 0) {
continue;
}
if ($productQty < 1 && $outOfStockStatus == 2 && $configuration['PS_ORDER_OUT_OF_STOCK'] == 0) {
continue;
}
}
$this->loadProductFeatures($id_lang, $xdd['pro_id'], $multistoreId);
if (!$filterByFeature->isExists($this->settings, $this->productFeaturesWithId)) {
continue;
}
if (!$filterByFeature->isNotExists($this->settings, $this->productFeaturesWithId)) {
continue;
}
$catBlockParam = '';
if ($mode == 'k24' || $mode == 'kos' || $mode == 'plt') {
$catBlockParam = ' id="'.REPLACE_COMBINATION.'product_id_element"';
}
$xmlProductMru = '<product>';
$xmlProduct = !empty($this->settings['item_starts_on_a_new_line']) ? PHP_EOL : '';
$xmlProduct .= '<'.$block_name['cat-block-name'].$catBlockParam.(($mode == 'tt' || $mode == 'ep' || $mode == 'ro' || $mode == 'sfl' || $mode == 'ua') ? ' '.($mode == 'sfl' ? 'cnt' : 'id').'="'.REPLACE_COMBINATION.'id_product'.'"' : '').(($mode == 'ep' || $mode == 'ro') ? ' available="true"' : '').REPLACE_COMBINATION.'cat-block-name>';
if (!empty($customXmlTagByProductId[$xdd['pro_id']])) {
foreach ($customXmlTagByProductId[$xdd['pro_id']] as $i) {
$xmlProduct .= $customXmlTagsByProductList[$i];
}
}
if (!empty($feedSettings['gender_field_category_status']) && !empty($feedSettings['gender_field_category_name'])) {
$xmlProduct .= '<'.$feedSettings['gender_field_category_name'].'>'.(!empty($genderCategories[$xdd['blmod_cat_id']]) ? $genderCategories[$xdd['blmod_cat_id']] : $feedSettings['gender_field_category_prime_value']).'</'.$feedSettings['gender_field_category_name'].'>';
}
if ($mode == 'twi') {
$xmlProduct .= '<sku>offre'.REPLACE_COMBINATION.'product_id_element'.'</sku>';
}
$settings['vivino_bottle_size'] = !empty($settings['vivino_bottle_size']) ? $settings['vivino_bottle_size'] : 'vi_default_'.$settings['vivino_bottle_size_default'];
$settings['vivino_lot_size'] = !empty($settings['vivino_lot_size']) ? $settings['vivino_lot_size'] : 'vi_default_'.$settings['vivino_lot_size_default'];
$this->productFeatures[$settings['vivino_bottle_size']] = !empty($this->productFeatures[$settings['vivino_bottle_size']]) ? $this->productFeatures[$settings['vivino_bottle_size']] : $settings['vivino_bottle_size_default'];
$this->productFeatures[$settings['vivino_lot_size']] = !empty($this->productFeatures[$settings['vivino_lot_size']]) ? $this->productFeatures[$settings['vivino_lot_size']] : $settings['vivino_lot_size_default'];
if (!empty($this->productFeatures[$settings['vivino_bottle_size']])) {
$xmlProduct .= '<bottle_size>'.$this->productFeatures[$settings['vivino_bottle_size']].'</bottle_size>';
}
if (!empty($this->productFeatures[$settings['vivino_lot_size']])) {
$xmlProduct .= '<bottle_quantity>'.$this->productFeatures[$settings['vivino_lot_size']].'</bottle_quantity>';
}
if ($mode == 'wum') {
$categoriesOfProductsUsed[] = $xdd['blmod_cat_id'];
$xmlProduct = '<'.$block_name['cat-block-name'].$catBlockParam.' id="'.REPLACE_COMBINATION.'product_id_element" brand_id="'.$product_class->id_manufacturer.'" category_id="'.$xdd['blmod_cat_id'].'">';
}
if ($mode == 'pub') {
$xmlProduct .= '<product-id-type>SHOP_SKU</product-id-type>';
}
if (!empty($block_name['extra-product-rows'])) {
if ($mode == 'pub') {
$xmlProductMru .= htmlspecialchars_decode($block_name['extra-product-rows'], ENT_QUOTES);
$xmlProduct .= htmlspecialchars_decode($block_name['extra-offer-rows'], ENT_QUOTES);
} else {
$xmlProduct .= htmlspecialchars_decode($block_name['extra-product-rows'], ENT_QUOTES);
}
}
$isAvailableWhenOutOfStock = (!empty($xdd['product_available_for_order']) || !empty($this->settings['is_enabled_field']['availability_label'])) ? Product::isAvailableWhenOutOfStock(StockAvailable::outOfStock($product_class->id)) : true;
$this->settings['isAvailableWhenOutOfStock'] = $isAvailableWhenOutOfStock;
$paramsCeneo = array();
foreach ($xdd as $id => $val) {
if ($id == 'pro_id' || $id == 'blmod_cat_id' || $id == 'blmod_price' || $id == 'bl_extra_att'
|| $id == 'blmod_reference' || $id == 'blmod_ean13' || $id == 'blmod_isbn' || $id == 'blmod_manufacturer'
|| $id == 'blmod_upc') {
continue;
}
if ($id == 'product_quantity') {
$val = $productQty;
}
if ($id == 'product_id_category_default') {
if (!empty($googleCatMap[$val])) {
$val = $googleCatMap[$val]['id'];
}
}
$val = isset($val) ? $val : '';
if ($id == 'product_condition' && $mode == 'cgr') {
$condition = [
'new' => 'Καινούριο',
'used' => 'Μεταχειρισμένο',
'refurbished' => 'Ανακατασκευή',
];
$val = Tools::strtolower($val);
$val = !empty($condition[$val]) ? $condition[$val] : $val;
}
if ($id == 'product_available_for_order') {
$val = $availabilityName['out'];
if ($product_class->available_for_order == 1 || $product_class->online_only == 1) {
if ($productQty > 0) {
$val = $availabilityName['in'];
} else {
if ($isAvailableWhenOutOfStock) {
$val = !empty($availabilityName['on_demand']) ? $availabilityName['on_demand'] : $availabilityName['in'];
}
}
}
}
if ($id == 'product_price' || $id == 'product_wholesale_price' || $id == 'product_ecotax') {
$val = $feedPrice->getEditedPrice($val, $id, $this->settings);
$val = $this->getPriceFormat($val);
}
if ($id == 'product_price' && $mode == 'h') {
$val = (int)($val * 100);
}
if ($id == 'product_weight' && $mode == 'r') {
$val = (int)($val * 1000);
}
if ($id == 'product_reference' || $id == 'product_supplier_reference' || $id == 'product_quantity' ||
$id == 'product_ean13' || $id == 'product_id_product' || $id == 'product_available_for_order' ||
$id == 'product_price' || $id == 'product_weight' || $id == 'product_isbn' || $id == 'product_wholesale_price' ||
$id == 'product_minimal_quantity' || $id == 'product_upc' || $id == 'product_mpn' || $id == 'product_location') {
$valDefault = $val;
$val = REPLACE_COMBINATION.str_replace('product_', '', $id);
$combinationDefault[str_replace('product_', '', $id)] = $valDefault;
}
if ($id == 'product_price' && $mode == 'r') {
$xmlProduct .= '<Price><Currency>'.trim($feedCurrency).'</Currency><VATRate>22</VATRate>';
}
if (($mode == 's' || $mode == 'g' || $mode == 'f' || $mode == 'y' || $mode == 't' || $mode == 'pint'
|| $mode == 'lw' || $mode == 'cj' || $mode == 'fav') && $id == 'product_weight'
|| $mode == 'tc' || $mode == 'lyst' || $mode == 'wb' || $mode == 'ikx') {
$val .= ' '.$weightUnit;
}
if ($id == 'product_date_upd' && $mode == 'm') {
$val = date('Y-m-d', strtotime($val));
}
if ($id == 'manufacturer_name' && $mode == 'mm') {
$xmlProduct .= '<manufacturer>'.$this->settings['pref_s'].$val.$this->settings['pref_e'].'</manufacturer>';
}
if ($mode == 'pub' && ($id == 'product_reference' || $id == 'product_ean13' || $id == 'manufacturer_name' || $id == 'product_id_product')) {
$xmlProductMru .= '<attribute><code>'.$xml_name[$id].'</code><value>'.$this->settings['pref_s'].$val.$this->settings['pref_e'].'</value></attribute>';
}
if ($mode == 'pub' && ($id == 'manufacturer_name' || $id == 'product_ean13')) {
continue;
}
if ($mode == 'ceo' &&
in_array(
$id,
array(
'manufacturer_name',
'product_id_product',
'product_quantity',
'product_available_for_order',
'product_ean13',
'product_reference',
'product_isbn',
'product_weight',
'product_upc',
)
)) {
if (in_array($id, ['manufacturer_name', 'product_ean13', 'product_reference', 'product_isbn', 'product_weight', 'product_upc',])) {
$paramsCeneo[$xml_name[$id]] = $val;
}
continue;
}
$xmlProduct .= $this->getDeepTagName($xml_name[$id]).$this->settings['pref_s'].$val.$this->settings['pref_e'].$this->getDeepTagName($xml_name[$id], true);
if ($id == 'product_price' && $mode == 'r') {
$xmlProduct .= '</Price>';
}
}
/*
if ($mode == 'pub' && !in_array($id, ['product_reference', 'product_ean13', 'manufacturer_name', 'product_id_product',])) {
$xmlProductMru .= '<attribute><code>'.$xml_name[$id].'</code><value>'.$this->settings['pref_s'].$val.$this->settings['pref_e'].'</value></attribute>';
}
*/
if ($mode == 'g' || $mode == 'f' || $mode == 'y' || $mode == 't' || $mode == 'pint' || $mode == 'cj' || $mode == 'fav'
|| $mode == 'tc' || $mode == 'lyst' || $mode == 'wb' || $mode == 'ikx') {
if ((empty($xdd['manufacturer_name']) && empty($xdd['product_ean13'])) || (empty($xdd['manufacturer_name']) && empty($xdd['product_reference']))) {
$xmlProduct .= '<g:identifier_exists>no</g:identifier_exists>';
}
}
$id_cat = $xdd['pro_id'];
$def_cat = isset($xdd['blmod_cat_id']) ? $xdd['blmod_cat_id'] : false;
$this->productLangValues = $xml_lf;
$allowLangByFeedType = !($mode == 'spa' && count($this->langIdWitIso) > 1);
if (!empty($xml_lf) && $allowLangByFeedType) {
foreach ($all_l_iso as $iso) {
$xml_lf[$id_cat.$iso] = isset($xml_lf[$id_cat.$iso]) ? $xml_lf[$id_cat.$iso] : false;
if ($mode == 'pub') {
$xmlProductMru .= $xml_lf[$id_cat . $iso];
} else {
$xmlProduct .= $xml_lf[$id_cat . $iso];
}
}
}
$this->productAttributeAndFeatureName = [];
$xmlImages = array();
$xmlImagesUrl = array();
$imageNumber = 0;
$imageNumberReal = 0;
if (!empty($img) && !empty($img_all_images[0]['id_image'])) {
if (empty($one_branch)) {
$xmlProduct .= $this->getDeepTagName($block_name['img-block-name']);
}
if ($use_ps_images_class) {
if ($mode != 'pub') {
$xmlProduct .= REPLACE_COMBINATION . 'image';
}
foreach ($img as $i) {
foreach ($img_all_images as $all_img) {
$image_info['id_image'] = $all_img['id_image'];
$image_info['id_product'] = $xdd['pro_id'];
$link = new Link();
$img_dir_server = $link->getImageLink($product_class->link_rewrite, $image_info['id_product'].'-'.$image_info['id_image'], $i['name'].$img_name_extra);
if (!empty($img_dir_server) && Tools::substr($img_dir_server, 0, 4) != 'http') {
$img_dir_server = $url_type.$img_dir_server;
}
/**
* @var ImageCore
*/
$img_class = new $image_class_name($image_info['id_image']);
$img_class->id = $image_info['id_image'];
$img_dir_file = _PS_PROD_IMG_DIR_.$img_class->getExistingImgPath().'-'.$i['name'].'.jpg';
if (file_exists($img_dir_file)) {
$imageNumberReal++;
if (empty($xmlImages[$image_info['id_image']])) {
$xmlImages[$image_info['id_image']] = '';
}
$imageNumber = ($mode == 'h' || $mode == 'spa') ? $imageNumber+1 : '';
if ($imageNumberReal > 1 && ($mode == 'g' || $mode == 'f' || $mode == 'y' || $mode == 't'
|| $mode == 'pint' || $mode == 'cj' || $mode == 'fav'
|| $mode == 'tc' || $mode == 'lyst' || $mode == 'wb' || $mode == 'ikx')) {
$i['title_xml'] = 'g:additional_image_link';
}
$imgDirServerClean = $img_dir_server;
if ($mode == 'a') {
$img_dir_server = '<admarkt:image url="'.$img_dir_server.'"/>';
} else {
$img_dir_server = $this->settings['pref_s'].$img_dir_server.$this->settings['pref_e'];
}
if (($mode == 'sn' || $mode == 'ma') && $imageNumberReal > 1) {
$i['title_xml'] = 'additional_image_link';
}
if (($mode == 's' || $mode == 'bp' || $mode == 'dm') && $imageNumberReal > 1) {
$i['title_xml'] = 'additional_imageurl';
}
if ($mode == 'mala' || $mode == 'kog' || $mode == 'mir') {
$xmlImages[$image_info['id_image']] .= $imgDirServerClean;
} else {
$xmlImages[$image_info['id_image']] .= $this->getDeepTagName($i['title_xml'] . $imageNumber) . $img_dir_server . $this->getDeepTagName($i['title_xml'] . $imageNumber, true);
}
$xmlImagesUrl[] = $imgDirServerClean;
}
}
}
} else {
foreach ($img as $i) {
foreach ($img_all_images as $all_img) {
$img_dir_file = $xdd['pro_id'] . '-' . $all_img['id_image'] . '-' . $i['name'] . '.jpg';
if (file_exists('img/p/' . $img_dir_file)) {
$img_dir = $base_dir_img . $img_dir_file;
$xmlProduct .= $this->getDeepTagName($i['title_xml']) . $this->settings['pref_s'] . $img_dir . $this->settings['pref_e'] . $this->getDeepTagName($i['title_xml'], true);
}
}
}
}
if (empty($one_branch)) {
$xmlProduct .= $this->getDeepTagName($block_name['img-block-name'], true);
}
}
if (!empty($xml_cat_name)) {
if ((empty($one_branch) && $count_lang > 1) || $mode == 'x' || $mode == 'o') {
$xmlProduct .= '<'.$block_name['def_cat-block-name'].'>';
}
if ($mode == 'pub') {
$xmlProductMru .= '<attribute><code>product-category</code><value>'.(isset($xml_cat_name[$def_cat]) ? $xml_cat_name[$def_cat] : '').'</value></attribute>';
} else {
$xmlProduct .= isset($xml_cat_name[$def_cat]) ? $xml_cat_name[$def_cat] : '';
}
if ((empty($one_branch) && $count_lang > 1) || $mode == 'x' || $mode == 'o') {
$xmlProduct .= '</'.$block_name['def_cat-block-name'].'>';
}
}
$addMultipleShippingPrice = false;
$addMultipleShippingCountriesCode = false;
$shippingPriceFieldName = '';
$shippingCountryFieldName = '';
$ignoreExtraTagCdata = [
'names_of_all_categories',
'related_products',
'attached_files',
'virtual_products',
];
if (!empty($extra_field)) {
$unitPriceRatio = $product_class->unit_price_ratio;
if (empty($product_class->unit_price_ratio) || $product_class->unit_price_ratio < 0.00001) {
$unitPriceRatio = 1;
}
foreach ($extra_field as $b_e) {
$extraTag = '';
$extraTagVal = '';
if ($b_e['name'] == 'product_url_utm_blmod') {
continue;
}
if (count($shippingPriceAll) > 1) {
if ($b_e['name'] == 'price_shipping_blmod') {
$shippingPriceFieldName = $b_e['title_xml'];
$addMultipleShippingPrice = true;
continue;
}
if ($b_e['name'] == 'shipping_country_code') {
$shippingCountryFieldName = $b_e['title_xml'];
$addMultipleShippingCountriesCode = true;
continue;
}
}
if ($mode == 'r' && $b_e['name'] == 'price_sale_blmod') {
$extraTag .= '<Price><Currency>'.trim($feedCurrency).'</Currency>';
}
$extraTag .= $this->getDeepTagName($b_e['title_xml']).(in_array($b_e['name'], $ignoreExtraTagCdata) ? '' : $this->settings['pref_s']);
if ($b_e['name'] == 'price_shipping_blmod') {
$extraTag .= $shippingPrice;
} elseif ($b_e['name'] == 'price_sale_blmod') {
$extraTag .= REPLACE_COMBINATION.'sale_blmod';
$combinationDefault['sale_blmod'] = $salePrice;
} elseif ($b_e['name'] == 'price_sale_tax_excl_blmod') {
$extraTag .= REPLACE_COMBINATION.'sale_tax_excl_blmod';
$combinationDefault['sale_tax_excl_blmod'] = $salePrice;
} elseif ($b_e['name'] == 'price_wt_discount_blmod') {
$extraTag .= REPLACE_COMBINATION.'price_wt_discount_blmod';
$combinationDefault['price_wt_discount_blmod'] = $priceWithoutDiscount;
} elseif ($b_e['name'] == 'only_discount_blmod') {
$extraTag .= $this->getPriceFormat($priceWithoutDiscount - $salePrice);
} elseif ($b_e['name'] == 'discount_rate_blmod') {
$extraTag .= round((($priceWithoutDiscount - $salePrice) / $priceWithoutDiscount * 100), 0);
} elseif ($b_e['name'] == 'product_url_blmod') {
$extraTagVal = REPLACE_COMBINATION.'url';
$extraTag .= $extraTagVal;
$extraUrl = !empty($this->extraFieldByName['product_url_utm_blmod']) ? htmlspecialchars_decode($this->extraFieldByName['product_url_utm_blmod'], ENT_QUOTES) : '';
$combinationDefault['url'] = $link_class->getProductLink($product_class, null, null, null, $id_lang).$extraUrl;
} elseif ($b_e['name'] == 'additional_product_url_blmod') {
$extraTag .= REPLACE_COMBINATION.'additional_url';
} elseif ($b_e['name'] == 'names_of_all_categories') {
$categoriesNames = explode(',|||,', $this->getProductCategories($xdd['pro_id'], $id_lang, 0));
$extraTagVal = '';
foreach ($categoriesNames as $nameNo => $catName) {
$extraTagVal .= '<sub_cat_'.($nameNo+1).'>'.$this->settings['pref_s'].$catName.$this->settings['pref_e'].'</sub_cat_'.($nameNo+1).'>';
}
$extraTag .= $extraTagVal;
} elseif ($b_e['name'] == 'product_categories_tree') {
$extraTagVal = $this->getProductCategories($xdd['pro_id'], $id_lang, $def_cat);
$extraTag .= $extraTagVal;
} elseif ($b_e['name'] == 'id_category_all') {
$extraTag .= $this->getProductCategories($xdd['pro_id'], $id_lang, $def_cat, true);
} elseif ($b_e['name'] == 'category_url') {
$extraTag .= $link_class->getCategoryLink($def_cat, null, $id_lang);
} elseif ($b_e['name'] == 'unit') {
$extraTag .= $product_class->unity;
} elseif ($b_e['name'] == 'unit_price') {
if (!empty($product_class->unity)) {
$extraTag .= $this->getPriceFormat($product_class->getPriceStatic($xdd['pro_id'], true, null) / $unitPriceRatio).(empty($this->settings['unit_price_without_unit']) ? ' / '.$product_class->unity : '');
} else {
$extraTag .= '';
}
} elseif ($b_e['name'] == 'unit_price_e_tax') {
if (!empty($product_class->unity)) {
$extraTag .= $this->getPriceFormat($product_class->price / $unitPriceRatio).(empty($this->settings['unit_price_without_unit']) ? ' / '.$product_class->unity : '');
} else {
$extraTag .= '';
}
} elseif ($b_e['name'] == 'tax_rate') {
$extraTag .= $taxRate;
} elseif ($b_e['name'] == 'parent_id_product') {
$extraTag .= $xdd['pro_id'];
} elseif ($b_e['name'] == 'additional_id_product') {
$extraTag .= $xdd['pro_id'];
} elseif ($b_e['name'] == 'additional_reference') {
$extraTag .= REPLACE_COMBINATION.'additional_reference';
} elseif ($b_e['name'] == 'parent_reference') {
$extraTag .= $xdd['blmod_reference'];
} elseif ($b_e['name'] == 'additional_id_combination') {
$extraTag .= REPLACE_COMBINATION.'additional_id_combination';
} elseif ($b_e['name'] == 'stock_status') {
$extraTag .= REPLACE_COMBINATION.'stock_status';
$combinationDefault['stock_status'] = $productQty > 0 ? 'Y' : 'N';
} elseif ($b_e['name'] == 'shipping_country_code') {
$extraTag .= !empty($defaultCountry->iso_code) ? $defaultCountry->iso_code : '';
} elseif ($b_e['name'] == 'shipping_country') {
$extraTag .= !empty($defaultCountry->name) ? $defaultCountry->name : '';
} elseif ($b_e['name'] == 'product_tags') {
$tag = new Tag();
$tagsByLanguage = $tag->getProductTags($xdd['pro_id']);
$extraTag .= '';
if (!empty($tagsByLanguage[$id_lang])) {
$extraTag .= implode(',', $tagsByLanguage[$id_lang]);
}
} elseif ($b_e['name'] == 'days_back_created') {
$dateFromInterval = new \DateTime(date('Y-m-d H:i:s'));
$dateToInterval = new \DateTime($product_class->date_add);
$interval = $dateFromInterval->diff($dateToInterval);
$extraTag .= $interval->format('%a');
} elseif ($b_e['name'] == 'additional_ean13_with_prefix') {
$extraTag .= REPLACE_COMBINATION.'additional_ean13_with_prefix';
} elseif ($b_e['name'] == 'related_products') {
$relatedProducts = $this->getRelatedProducts($xdd['pro_id']);
$extraTag .= '';
if (!empty($relatedProducts)) {
foreach ($relatedProducts as $r) {
$extraTag .= '<ITEM>'.(!empty($this->settings['product_id_prefix']) ? $this->settings['product_id_prefix'] : '').$r['id_product_2'].'</ITEM>';
}
}
} elseif ($b_e['name'] == 'available_date') {
$extraTag .= REPLACE_COMBINATION.'available_date';
} elseif ($b_e['name'] == 'availability_label') {
$extraTag .= REPLACE_COMBINATION.'availability_label';
$combinationDefault['availability_label'] = '';
} elseif ($b_e['name'] == 'attached_files') {
$productAttachments = $product_class->getAttachments($id_lang);
$extraTag .= '';
if (!empty($productAttachments)) {
foreach ($productAttachments as $a) {
$extraTag .= '<attachment>
<id_attachment>' . $a['id_attachment'] . '</id_attachment>
<file_name>' . $this->settings['pref_s'] . $a['file_name'] . $this->settings['pref_e'] . '</file_name>
<file_key>' . $a['file'] . '</file_key>
<name>' . $this->settings['pref_s'] . $a['name'] . $this->settings['pref_e'] . '</name>
<description>' . $this->settings['pref_s'] . $a['description'] . $this->settings['pref_e'] . '</description>
<url>' . $this->settings['pref_s'] . $this->settings['url_protocol_without_slash'] . Link::getUrlSmarty(['entity' => 'attachment', 'params' => ['id_attachment' => $a['id_attachment'],]]) . $this->settings['pref_e'] . '</url>
<size>' . $a['file_size'] . '</size>
<mime>' . $a['mime'] . '</mime>
</attachment>';
}
}
} elseif ($b_e['name'] == 'virtual_products') {
$virtualProducts = $this->getVirtualProductsByProductId($xdd['pro_id']);
$extraTag .= '';
if (!empty($virtualProducts)) {
foreach ($virtualProducts as $v) {
$extraTag .= '<virtual_product>
<id_product_download>' . $v['id_product_download'] . '</id_product_download>
<display_filename>' .$this->settings['pref_s'].$v['display_filename'] .$this->settings['pref_e']. '</display_filename>
<filename>' .$this->settings['pref_s'].$v['filename'].$this->settings['pref_e']. '</filename>
<url>' .$this->settings['pref_s'].$this->settings['base_link'].'download/'.$v['filename'].$this->settings['pref_e']. '</url>
<date_add>' . $v['date_add'] . '</date_add>
<date_expiration>' . $v['date_expiration'] . '</date_expiration>
<nb_days_accessible>' . $v['nb_days_accessible'] . '</nb_days_accessible>
<nb_downloadable>' . $v['nb_downloadable'] . '</nb_downloadable>
<active>' . $v['active'] . '</active>
<is_shareable>' . $v['is_shareable'] . '</is_shareable>
</virtual_product>';
}
}
}
$extraTag .= (in_array($b_e['name'], $ignoreExtraTagCdata) ? '' : $this->settings['pref_e']). $this->getDeepTagName($b_e['title_xml'], true);
if ($mode == 'ceo' && in_array($b_e['name'], ['product_url_blmod', 'price_sale_blmod',])) {
$extraTag = '';
}
if ($mode == 'pub' && in_array($b_e['name'], $mruProductFields)) {
$xmlProductMru .= '<attribute><code>'.$b_e['title_xml'].'</code><value>'.$extraTagVal.'</value></attribute>';
} else {
$xmlProduct .= $extraTag;
}
}
}
if ($addMultipleShippingPrice && $this->settings['feed_mode_final'] == 'g') {
foreach ($shippingPriceAll as $countryCode => $shippingPrice) {
$xmlProduct .= '<g:shipping><g:price>'.$this->getPriceFormat($feedPrice->getEditedPrice($shippingPrice, 'shipping_price', $this->settings)).'</g:price><g:country>'.$countryCode.'</g:country></g:shipping>';
}
}
if ($addMultipleShippingPrice && $this->settings['feed_mode_final'] != 'g') {
foreach ($shippingPriceAll as $shippingPrice) {
$xmlProduct .= '<'.$shippingPriceFieldName.'>'.$this->getPriceFormat($feedPrice->getEditedPrice($shippingPrice, 'shipping_price', $this->settings)).'</'.$shippingPriceFieldName.'>';
}
}
if ($addMultipleShippingCountriesCode && $this->settings['feed_mode_final'] != 'g') {
foreach ($shippingPriceAll as $shippingCode => $shippingPrice) {
$xmlProduct .= '<'.$shippingCountryFieldName.'>'.$this->settings['pref_s'].$shippingCode.$this->settings['pref_e'].'</'.$shippingCountryFieldName.'>';
}
}
$attributesList = [];
$productAttributes = $product_class->getAttributesGroups($id_lang);
$this->productAttributes = $productAttributes;
if ($mode == 'spa') {
$this->productAttributesAllLanguages = [];
foreach ($this->langIdWitIso as $langIdFromList => $langIso) {
$this->productAttributesAllLanguages[$langIdFromList] = $product_class->getAttributesGroups($langIdFromList);
}
}
if (!empty($extra_attributes) || !empty($fieldGroupedAttributes)) {
$attributesList = $this->productAttributes;
}
//Product feature
$this->offerAdditionalFields = [];
if (!empty($featureEnable) && !empty($fieldFeature)) {
$features = $this->getFrontFeatures($id_lang, $xdd['pro_id'], $multistoreId);
if (!empty($features)) {
foreach ($features as $fKey => $fVal) {
$features[$fKey]['value'] = !empty($this->featureMapValues[$features[$fKey]['id_feature'].'-'.$features[$fKey]['id_feature_value']]) ? $this->featureMapValues[$features[$fKey]['id_feature'].'-'.$features[$fKey]['id_feature_value']] : $fVal['value'];
}
if ($mode == 'x') {
$xmlProduct .= '<TECHDATA>';
}
if ($mode == 'man') {
$xmlProduct .= '<params>';
}
if ($mode == 'i') {
foreach ($features as $f) {
if (empty($fieldFeature[$f['id_feature']])) {
continue;
}
$xmlProduct .= '<s:attribute name="'.$this->attributeName($f['name']).'">'.$this->settings['pref_s'].$f['value'].$this->settings['pref_e'].'</s:attribute>';
}
} elseif ($mode == 'x') {
foreach ($features as $f) {
if (empty($fieldFeature[$f['id_feature']])) {
continue;
}
$xmlProduct .= '<PARAMETER name="'.$this->attributeName($f['name']).'">'.$this->settings['pref_s'].$f['value'].$this->settings['pref_e'].'</PARAMETER>';
}
} elseif ($mode == 'gla' || $mode == 'u' || $mode == 'naj' || $mode == 'zbo' || $mode == 'tov') {
foreach ($features as $f) {
if (empty($fieldFeature[$f['id_feature']])) {
continue;
}
$xmlProduct .= '<PARAM><PARAM_NAME>'.$fieldFeature[$f['id_feature']]['title_xml'].'</PARAM_NAME><VAL>'.$this->settings['pref_s'].$f['value'].$this->settings['pref_e'].'</VAL></PARAM>';
}
} elseif ($mode == 'mal') {
foreach ($features as $f) {
if (empty($fieldFeature[$f['id_feature']])) {
continue;
}
//$this->productAttributeAndFeatureName[] = $fieldFeature[$f['id_feature']]['title_xml'];
$xmlProduct .= '<PARAM><NAME>'.$fieldFeature[$f['id_feature']]['title_xml'].'</NAME><VALUE>'.$this->settings['pref_s'].$f['value'].$this->settings['pref_e'].'</VALUE></PARAM>';
}
} elseif ($mode == 'ceo') {
foreach ($features as $f) {
if (empty($fieldFeature[$f['id_feature']])) {
continue;
}
$paramsCeneo[$fieldFeature[$f['id_feature']]['title_xml']] = $f['value'];
}
} elseif ($mode == 'man') {
foreach ($features as $f) {
if (empty($fieldFeature[$f['id_feature']])) {
continue;
}
$xmlProduct .= '<param><param_name>'.$fieldFeature[$f['id_feature']]['title_xml'].'</param_name><param_value>'.$this->settings['pref_s'].$f['value'].$this->settings['pref_e'].'</param_value></param>';
}
} elseif ($mode == 'ho') {
foreach ($features as $f) {
if (empty($fieldFeature[$f['id_feature']])) {
continue;
}
$xmlProduct .= '<param name="'.$this->attributeName($f['name']).'">'.$this->settings['pref_s'].$f['value'].$this->settings['pref_e'].'</param>';
}
} elseif ($mode == 'cgr') {
$makeModelBranch = [];
$makeModelBranchXml = '';
$carFeatureList = ['make', 'model', 'yearfrom', 'yearto',];
foreach ($features as $f) {
if (empty($fieldFeature[$f['id_feature']])) {
continue;
}
if ($fieldFeature[$f['id_feature']]['title_xml'] == 'make') {
$f['value'] = !empty($f['value']) ? $f['value'] : $this->productParam['manufacturer'][$xdd['pro_id']];
}
$fullRow = '<'.$fieldFeature[$f['id_feature']]['title_xml'].'>'.$this->settings['pref_s'].$f['value'].$this->settings['pref_e'].'</'.$fieldFeature[$f['id_feature']]['title_xml'].'>';
if (in_array($fieldFeature[$f['id_feature']]['title_xml'], $carFeatureList)) {
$makeModelBranch[$fieldFeature[$f['id_feature']]['title_xml']] = $fullRow;
continue;
}
$xmlProduct .= $fullRow;
}
if (!empty($makeModelBranch)) {
foreach ($carFeatureList as $c) {
$makeModelBranchXml .= !empty($makeModelBranch[$c]) ? $makeModelBranch[$c] : '';
}
$xmlProduct .= '<makemodels><makemodel>'.$makeModelBranchXml.'</makemodel></makemodels>';
}
} else {
foreach ($features as $f) {
if (!empty($fieldFeature[$f['id_feature']])) {
if ($mode == 'pub') {
if ($permissions['xml_type'] == 'offers' && in_array($fieldFeature[$f['id_feature']]['title_xml'], ['quantity-mini', 'quantity-step',])) {
$this->offerAdditionalFields[$fieldFeature[$f['id_feature']]['title_xml']] = $f['value'];
continue;
}
$xmlProductMru .= '<attribute><code>'.$fieldFeature[$f['id_feature']]['title_xml'].'</code><value>'.$this->settings['pref_s'] . $f['value'] . $this->settings['pref_e'] .'</value></attribute>';
}
$xmlProduct .= $this->getDeepTagName($fieldFeature[$f['id_feature']]['title_xml']). $this->settings['pref_s'] . $f['value'] . $this->settings['pref_e'] . $this->getDeepTagName($fieldFeature[$f['id_feature']]['title_xml'], true);
}
}
}
if ($mode == 'x') {
$xmlProduct .= '</TECHDATA>';
}
if ($mode == 'man') {
$xmlProduct .= '</params>';
}
}
}
$affiliate_prices = [];
//Affiliate price
if (!empty($affiliate)) {
$affiliate_prices = Db::getInstance()->ExecuteS('SELECT `affiliate_name`, `affiliate_formula`, `xml_name`,
`category_type`, `category_id_list`
FROM '._DB_PREFIX_.'blmod_xml_affiliate_price
WHERE `affiliate_name` IN ("'. str_replace(',', '","', pSQL(implode($affiliate, ','))).'")
ORDER BY affiliate_name ASC');
}
if (!empty($affiliate_prices)) {
$xmlProduct .= REPLACE_COMBINATION.'affiliate_price';
}
if ($mode == 'h') {
$xmlProduct .= '<Min_shipping>1</Min_shipping><Max_shipping>4</Max_shipping>';
}
if (!empty($productSettingsPackageId)) {
$xmlProduct .= !empty($productSettingsList[$xdd['pro_id']]) ? $productSettingsList[$xdd['pro_id']] : $productSettingsList[ProductSettings::DEFAULT_SETTINGS_ID];
}
if (!empty($combinations)) {
$usedParentGroup = [];
$parentGroupName = '';
$xmlProductMruBeforeCombination = $xmlProductMru;
$xmlProductMru = '';
if (!empty($settings['only_available_for_order'])) {
$outOfStockStatus = StockAvailable::outOfStock($xdd['pro_id']);
}
$attributesByParentGroup = !empty($permissions['merge_attributes_by_group']) ? $mergeAttributesByGroup->getByParentGroup($productAttributes, $onlyInStock, $fieldGroupedAttributes, $this->attributeMapValues, $outOfStockStatus) : array();
if ($mode == 'gla' || $mode == 'naj') {
$xmlProduct .= '<ITEMGROUP_ID>'.$xdd['pro_id'].'</ITEMGROUP_ID>';
}
$isFirst = 0;
foreach ($combinations as $c) {
if ($onlyInStock && $c['quantity'] < 1) {
continue;
}
$combinationCore = new CombinationCore();
$combinationCore->id = $c['id_product_attribute'];
$combinationImages = $combinationCore->getWsImages();
if (!empty($settings['filter_image'])) {
if ($settings['filter_image'] == 1) {
if (empty($combinationImages)) {
continue;
}
}
if ($settings['filter_image'] == 2) {
if (!empty($combinationImages)) {
continue;
}
}
}
if (!empty($permissions['filter_exclude_empty_params'])) {
foreach ($permissions['filter_exclude_empty_params'] as $emptyParamKEy) {
if (empty($c[$emptyParamKEy])) {
continue 2;
}
}
}
if (!empty($settings['only_available_for_order'])) {
if ($c['quantity'] < 1 && $outOfStockStatus == 0) {
continue;
}
if ($c['quantity'] < 1 && $outOfStockStatus == 2 && $configuration['PS_ORDER_OUT_OF_STOCK'] == 0) {
continue;
}
}
if (!$filterByAttribute->isRequiredAttributeExists($permissions['only_with_attributes_status'], $permissions['only_with_attributes'], $c['id_product_attribute'], $productAttributes)) {
continue;
}
if (!empty($permissions['only_without_attributes_status'])) {
if ($filterByAttribute->isRequiredAttributeExists($permissions['only_without_attributes_status'], $permissions['only_without_attributes'], $c['id_product_attribute'], $productAttributes)) {
continue;
}
}
if ($this->isExcludeByMinimumOrderQuantity($c['minimal_quantity'])) {
continue;
}
$this->groupedAttributesByParent = [
'parentName' => '',
'childValues' => [],
];
if (!empty($permissions['merge_attributes_by_group'])) {
if (!empty($attributesByParentGroup)) {
$parentGroupName = $mergeAttributesByGroup->getCombinationParentGroupName($productAttributes, $c['id_product_attribute']);
if (in_array($parentGroupName, $usedParentGroup)) {
continue;
}
$c['attribute_designation'] = $mergeAttributesByGroup->getCombinationNameByMainGroup($parentGroupName);
$usedParentGroup[] = $parentGroupName;
$this->groupedAttributesByParent = [
'parentName' => $parentGroupName,
'childValues' => $attributesByParentGroup,
];
}
}
$xmlProduct = $this->replaceXmlTree($xmlProduct);
$xmlProductCombination = '';
if (empty($isFirst) && $mode == 'bee') {
$xmlProductCombination .= $this->replaceCombinationToEmpty($xmlProduct, $combinationDefault, $xmlImages, $product_class, $mode, [], [], true).'</'.$block_name['cat-block-name'].'>';
$isFirst = true;
}
if ($mode == 'pub') {
$xmlProductCombination .= $this->replaceCombination($xmlProduct, $c, $xmlImages, $link_class, $product_class, $id_lang, $affiliate_prices, $mode, $isAvailableWhenOutOfStock, $availabilityName, array(), $paramsCeneo);
$this->publicGrProducts = true;
$xmlProductMru .= $this->replaceCombination($xmlProductMruBeforeCombination, $c, $xmlImages, $link_class, $product_class, $id_lang, $affiliate_prices, $mode, $isAvailableWhenOutOfStock, $availabilityName, $combinationImages, $paramsCeneo);
$this->publicGrProducts = false;
$xmlProductMru .= $this->getProductAttributeBranchMru($extra_attributes, $attributesList, $block_name, $one_branch, $c['id_product_attribute']);
} else {
$xmlProductCombination .= $this->replaceCombination($xmlProduct, $c, $xmlImages, $link_class, $product_class, $id_lang, $affiliate_prices, $mode, $isAvailableWhenOutOfStock, $availabilityName, $combinationImages, $paramsCeneo);
$xmlProductCombination .= $this->getProductAttributeBranch($extra_attributes, $attributesList, $block_name, $one_branch, $c['id_product_attribute']);
}
if (empty($permissions['merge_attributes_by_group']) || empty($attributesByParentGroup)) {
$attributeBranch = $this->getProductGroupedAttributeBranch($fieldGroupedAttributes, $attributesList, $c['id_product_attribute'], $paramsCeneo);
if ($mode != 'pub') {
$xmlProductCombination .= $attributeBranch['xml'];
} else {
$xmlProductMru .= $attributeBranch['xml'];
$this->settings['feed_mode'] = '';
$attributeBranch = $this->getProductGroupedAttributeBranch($fieldGroupedAttributes, $attributesList, $c['id_product_attribute'], $paramsCeneo);
$this->settings['feed_mode'] = $mode;
$xmlProductCombination .= $attributeBranch['xml'];
}
$paramsCeneo = $attributeBranch['paramsCeneo'];
} else {
$xmlProductCombination .= $this->getProductGroupedAttributeBranchByParentGroup($fieldGroupedAttributes, $attributesByParentGroup, $parentGroupName, $mergeAttributesByGroup->getParentGroup());
}
if (!empty($this->productAttributeAndFeatureName)) {
$xmlProductCombination .= '<VARIABLE_PARAMS>';
$this->productAttributeAndFeatureName = array_unique($this->productAttributeAndFeatureName);
foreach ($this->productAttributeAndFeatureName as $v) {
$xmlProductCombination .= '<PARAM_replace>'.$v.'</PARAM_replace>';
}
$xmlProductCombination .= '</VARIABLE_PARAMS>';
}
if ($mode == 'mal') {
$xmlProductCombination = $this->fieldSorting($xmlProductCombination . '</' . $block_name['cat-block-name'] . '>', $mode, '', true);
}
$xmlProductMru .= '</product>';
$xml .= $xmlProductCombination.'</'.$block_name['cat-block-name'].'>';
}
} else {
if (!$filterByAttribute->isRequiredAttributeExists($permissions['only_with_attributes_status'], $permissions['only_with_attributes'], 0, $productAttributes)) {
continue;
}
if (!empty($permissions['only_without_attributes_status'])) {
if ($filterByAttribute->isRequiredAttributeExists($permissions['only_without_attributes_status'], $permissions['only_without_attributes'], 0, $productAttributes)) {
continue;
}
}
if ($this->isExcludeByMinimumOrderQuantity($product_class->minimal_quantity)) {
continue;
}
$affiliatePriceFinal = 0;
if (!empty($affiliate_prices)) {
$affiliatePrice = '';
if ($mode == 'wor') {
$affiliatePrice = '<offer-additional-fields>';
}
foreach ($affiliate_prices as $a_price) {
$affiliatePriceFinal = $this->calculateAffiliatePrices(
$salePrice,
$basePrice,
$shippingPrice,
$priceWithoutDiscount,
$wholesalePrice,
$a_price,
$product_class
);
if ($mode == 'ceo') {
break;
}
if ($mode == 'wor') {
$affiliatePrice .= '<offer-additional-field>
<code>price[channel='.$a_price['xml_name'].']</code>
<value>'.$this->settings['pref_s'].$affiliatePriceFinal.$this->settings['pref_e'].'</value>
</offer-additional-field>';
continue;
}
$affiliatePrice .= $this->getDeepTagName($a_price['xml_name']).$this->settings['pref_s'].$affiliatePriceFinal.$this->settings['pref_e'].$this->getDeepTagName($a_price['xml_name'], true);
}
if ($mode == 'wor') {
if (!empty($this->settings['worten_ship_from_country'])) {
$affiliatePrice .= '<offer-additional-field>
<code>ship-from-country-offer</code>
<value>'.$this->settings['worten_ship_from_country'].'</value>
</offer-additional-field>';
}
$affiliatePrice .= '</offer-additional-fields>';
}
$xmlProduct = str_replace(REPLACE_COMBINATION.'affiliate_price', $affiliatePrice, $xmlProduct);
}
$attributeBranch = $this->getProductGroupedAttributeBranch($fieldGroupedAttributes, $attributesList, 0, $paramsCeneo);
if ($mode != 'pub') {
$xmlProduct .= $attributeBranch['xml'];
} else {
$xmlProductMru .= $attributeBranch['xml'];
}
$paramsCeneo = $attributeBranch['paramsCeneo'];
$xmlProduct = $this->replaceCombinationToEmpty($xmlProduct, $combinationDefault, $xmlImages, $product_class, $mode, $paramsCeneo, $affiliatePriceFinal);
$xmlProduct = $this->replaceXmlTree($xmlProduct);
$xmlProduct = $this->addVariants($xmlProduct, $product_class, $isAvailableWhenOutOfStock, $availabilityName);
if ($mode == 'pub') {
$this->publicGrProducts = true;
$xmlProductMru = $this->replaceCombinationToEmpty($xmlProductMru, $combinationDefault, $xmlImages, $product_class, $mode, $paramsCeneo, $affiliatePriceFinal);
$this->publicGrProducts = false;
$xmlProductMru .= $this->getProductAttributeBranchMru($extra_attributes, $attributesList, $block_name, $one_branch);
}
if ($mode == 'h' && !empty($xmlImagesUrl)) {
$xmlProduct .= '<image_tree>'.implode('|', $xmlImagesUrl).'</image_tree>';
}
if ($mode == 'mala' && !empty($xmlImagesUrl)) {
$xmlProduct .= '<Image>'.implode(',', $xmlImagesUrl).'</Image>';
}
if ($mode == 'kog' && !empty($xmlImagesUrl)) {
$xmlProduct .= '<IMAGES>'.implode('|', $xmlImagesUrl).'</IMAGES>';
}
if ($mode == 'mir' && !empty($xmlImagesUrl)) {
$xmlProduct .= '<mainImage>'.implode(',', $xmlImagesUrl).'</mainImage>';
$xmlProduct .= '<mainImageThumb>'.implode(',', $xmlImagesUrl).'</mainImageThumb>';
}
if ($mode == 'pub' && !empty($xmlImagesUrl)) {
$uId = 0;
foreach ($xmlImagesUrl as $u) {
$xmlProductMru .= '<attribute><code>'.($uId < 1 ? 'mainImage' : 'varExtraImage'.$uId).'</code><value>'.$u.'</value></attribute>';
$xmlProductMru .= '<attribute><code>'.($uId < 1 ? 'mainImageThumb' : 'varExtraImageThumb'.$uId).'</code><value>'.$u.'</value></attribute>';
$uId++;
}
}
if (!empty($settings['spartoo_size'])) {
$xmlProduct .= $this->getSpartooSizeBlock($product_class->getAttributesResume($id_lang, ' ', ', '));
}
$xmlProductExtra = '';
if (!empty($this->productAttributeAndFeatureName)) {
$xmlProductExtra .= '<VARIABLE_PARAMS>';
$this->productAttributeAndFeatureName = array_unique($this->productAttributeAndFeatureName);
foreach ($this->productAttributeAndFeatureName as $v) {
$xmlProductExtra .= '<PARAM_replace>'.$v.'</PARAM_replace>';
}
$xmlProductExtra .= '</VARIABLE_PARAMS>';
}
$xml .= $this->fieldSorting($xmlProduct.'</'.$block_name['cat-block-name'].'>', $mode, $xmlProductExtra);
$xmlProductMru .= '</product>';
}
$xmlProductMruAll .= $xmlProductMru;
}
if (!empty($block_status['file-name'])) {
$xml .= '</' . $block_name['file-name'] . '>';
}
if ($mode == 'wum') {
$categoriesAll = $this->getAllCategories($l, $multistoreId);
$usedCategories = array();
$usedParents = array();
$xml .= '<categories>';
foreach ($categoriesAll as $cat) {
if (!in_array($cat['id_category'], $categoriesOfProductsUsed)) {
continue;
}
if ($cat['id_parent'] < 3) {
$cat['id_parent'] = 0;
}
if (!empty($cat['id_parent'])) {
$usedParents[] = $cat['id_parent'];
}
$usedCategories[] = $cat['id_category'];
$xml .= '<category id="'.$cat['id_category'].'"'.(!empty($cat['id_parent']) ? ' parent_id="'.$cat['id_parent'].'"' : '').'>'.$this->settings['pref_s'].$cat['name'].$this->settings['pref_e'].'</category>';
}
$usedParents = array_unique($usedParents);
foreach ($usedParents as $catId) {
if (in_array($catId, $usedCategories)) {
continue;
}
$xml .= '<category id="'.$catId.'">'.$this->settings['pref_s'].$categoriesByKey[$catId].$this->settings['pref_e'].'</category>';
}
$xml .= '</categories>';
}
if ($mode == 'pub') {
if ($permissions['xml_type'] == 'products') {
$xml = '<products>'.$xmlProductMruAll.'</products>';
} elseif ($permissions['xml_type'] == 'offers') {
} else {
$xmlHeaderPub = '';
if (!empty($feedGenerationTime) && !empty($feedGenerationTimeName)) {
$xmlHeaderPub = '<'.$feedGenerationTimeName.'>'.date('Y-m-d H:i:s').'</'.$feedGenerationTimeName.'>';
}
$xml = $xmlHeaderPub.'<products>'.$xmlProductMruAll.'</products>'.$xml;
}
}
return $xml;
}
public function replaceXmlTree($xml)
{
preg_match_all("'<sBLMOD>(.*?)</sBLMOD>'si", $xml, $categories);
$levels = array();
if (empty($categories[1])) {
return $xml;
}
foreach ($categories[1] as $k => $c) {
preg_match("'<nBLMOD>(.*?)</nBLMOD>'si", $c, $name);
$names = explode('_lBLMOD_', $name[1]);
preg_match("'<vBLMOD>(.*?)</vBLMOD>'si", $c, $value);
$levels[$names[0]][] = [
'full' => $categories[0][$k],
'name' => $names[1],
'value' => $value[1],
];
}
foreach ($levels as $branchName => $branch) {
$xmlN = '<'.$branchName.'>';
$firstField = '';
foreach ($branch as $b) {
$xmlN .= '<'.$b['name'].'>';
$xmlN .= $b['value'];
$xmlN .= '</'.$b['name'].'>';
if (empty($firstField)) {
$firstField = $b['full'];
} else {
$xml = str_replace($b['full'], '', $xml);
}
}
$xmlN .= '</'.$branchName.'>';
$xml = str_replace($firstField, $xmlN, $xml);
}
return $xml;
}
public function getProductTax($idTaxRulesGroup)
{
if (isset($this->taxRateList[$idTaxRulesGroup])) {
return $this->taxRateList[$idTaxRulesGroup];
}
$rate = Db::getInstance()->getValue('SELECT t.rate
FROM '._DB_PREFIX_.'tax_rule tr
LEFT JOIN '._DB_PREFIX_.'tax t ON
t.id_tax = tr.id_tax
WHERE tr.id_tax_rules_group = '.pSQL($idTaxRulesGroup));
$rate = PriceFormat::convertByType($rate, $this->settings['price_format_id']);
$this->taxRateList[$idTaxRulesGroup] = $rate;
return $rate;
}
public function replaceCombination(
$xml,
$combination,
$images,
$link_class,
$product_class,
$id_lang,
$affiliate_prices,
$mode,
$isAvailableWhenOutOfStock,
$availabilityName,
$combinationImages,
$paramsCeneo
) {
$feedPrice = new FeedPrice();
$combinationSalePrice = $feedPrice->getEditedPrice($product_class->getPriceStatic($product_class->id, true, $combination['id_product_attribute'], (empty($this->settings['price_rounding_type']) ? 6 : 2)), 'sale_blmod', $this->settings);
$priceWithoutDiscount = $feedPrice->getEditedPrice($product_class->getPriceStatic($product_class->id, true, $combination['id_product_attribute'], 2, null, false, false), 'price_wt_discount_blmod', $this->settings);
$basePrice = $feedPrice->getEditedPrice($product_class->getPriceStatic($product_class->id, false, $combination['id_product_attribute'], 2), 'product_price', $this->settings);
$combination['quantity'] = (int)$combination['quantity'];
$combinationId = $product_class->id.'-'.$combination['id_product_attribute'];
$extraUrl = !empty($this->extraFieldByName['product_url_utm_blmod']) ? htmlspecialchars_decode($this->extraFieldByName['product_url_utm_blmod'], ENT_QUOTES) : '';
$url = $link_class->getProductLink($product_class, null, null, null, $id_lang, null, $combination['id_product_attribute'], Configuration::get('PS_REWRITING_SETTINGS'), false, true).$extraUrl;
$priceSale = $this->getPriceFormat($combinationSalePrice);
$weight = $product_class->weight+$combination['weight'];
$combinationAttributes = array();
$combination['isbn'] = isset($combination['isbn']) ? $combination['isbn'] : '';
$combination['upc'] = !empty($combination['upc']) ? $combination['upc'] : '';
$wholesalePrice = ($combination['wholesale_price'] < 0.01) ? $basePrice : $combination['wholesale_price'];
$taxRate = $this->productParam['tax_rate'][$product_class->id];
$salePriceOriginal = $combinationSalePrice;
$saleTaxExcl = $this->getPriceFormat($feedPrice->getEditedPrice(Tools::ps_round(($salePriceOriginal / (1 + $taxRate / 100)), 2, 1), 'sale_tax_excl_blmod', $this->settings));
foreach ($this->productAttributes as $a) {
if ($combination['id_product_attribute'] != $a['id_product_attribute']) {
continue;
}
$combinationAttributes[] = $a;
}
if (!empty($this->settings['attribute_id_as_combination_id'])) {
foreach ($this->productAttributes as $a) {
if ($a['id_product_attribute'] != $combination['id_product_attribute']) {
continue;
}
if ($this->settings['merge_attributes_parent'] == $a['id_attribute_group']) {
$combinationId = $product_class->id . '-' . $a['id_attribute'];
break;
}
}
}
$elementsByKey = array(
3 => (!empty($this->settings['product_id_prefix']) ? $this->settings['product_id_prefix'] : '').$combinationId,
4 => !empty($combination['reference']) ? $combination['reference'] : '',
5 => !empty($combination['ean13']) ? $combination['ean13'] : '',
6 => isset($combination['isbn']) ? $combination['isbn'] : '',
7 => !empty($this->productParam['category'][$product_class->id]) ? $this->productParam['category'][$product_class->id] : '',
8 => !empty($this->productParam['manufacturer'][$product_class->id]) ? $this->productParam['manufacturer'][$product_class->id] : '',
);
$productTitleList = [];
$name = '';
foreach ($this->langIdWitIso as $langIdFromList => $iso) {
if ($mode == 'spa' && count($this->langIdWitIso)) {
$combinationAttributes = [];
foreach ($this->productAttributesAllLanguages[$langIdFromList] as $a) {
if ($combination['id_product_attribute'] != $a['id_product_attribute']) {
continue;
}
$combinationAttributes[] = $a;
}
}
$name = !empty($this->productParam['title-'.$iso][$product_class->id]) ? $this->productTitleEditor->replaceTitleByKey($this->productParam['title-'.$iso][$product_class->id], $this->productTitleEditorValues) : '';
$name = $this->productTitleEditor->addElementsToTitle($name, $this->settings['title_elements'], $elementsByKey);
$name = $this->productTitleEditor->addAttributesToTile($name, $this->settings['title_elements'], $combinationAttributes);
$nameWithoutTransform = $name;
$name = $this->productTitleEditor->titleTransformer($name, $this->settings);
$xml = str_replace(REPLACE_COMBINATION.'name-'.$iso, $name, $xml);
$productTitleList[$iso] = $name;
$replaceEmptyDescription = '';
switch ($this->settings['empty_description']) {
case 1:
$replaceEmptyDescription = $nameWithoutTransform;
break;
case 2:
$replaceEmptyDescription = $this->settings['empty_description_text'];
break;
}
$xml = str_replace(REPLACE_COMBINATION . 'description-' . $iso, $replaceEmptyDescription, $xml);
$xml = str_replace(REPLACE_COMBINATION . 'description_short-' . $iso, $replaceEmptyDescription, $xml);
}
if (empty($combination['ean13']) && $mode == 'sfl') {
$combination['ean13'] = $this->settings['domain'].'-'.$combinationId;
}
$eanWithPrefix = '';
if (!empty($combination['ean13'])) {
$eanWithPrefix = (!empty($this->settings['ean_prefix']) ? $this->settings['ean_prefix'] : '').$combination['ean13'];
}
$referenceWithPrefix = '';
if (!empty($combination['reference'])) {
$referenceWithPrefix = (!empty($this->settings['reference_prefix']) ? $this->settings['reference_prefix'] : '').$combination['reference'];
}
$catBlockName = '';
if ($mode == 'bee') {
$catBlockName = ' idp="'.$product_class->id.'" idd="'.$combination['id_product_attribute'].'" type="child"';
}
if (!empty($this->settings['max_quantity']) && !empty($this->settings['max_quantity_status']) && $combination['quantity'] > $this->settings['max_quantity']) {
$combination['quantity'] = $this->settings['max_quantity'];
}
$xml = str_replace(REPLACE_COMBINATION.'quantity', $combination['quantity'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'minimal_quantity', $combination['minimal_quantity'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'ean13', $combination['ean13'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'isbn', $combination['isbn'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'mpn', $combination['mpn'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'supplier_reference', $combination['supplier_reference'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'reference', $combination['reference'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'additional_reference', $referenceWithPrefix, $xml);
$xml = str_replace(REPLACE_COMBINATION.'url', $url, $xml);
$xml = str_replace(REPLACE_COMBINATION.'additional_url', $url, $xml);
$xml = str_replace(REPLACE_COMBINATION.'sale_blmod', $priceSale, $xml);
$xml = str_replace(REPLACE_COMBINATION.'sale_tax_excl_blmod', $saleTaxExcl, $xml);
$xml = str_replace(REPLACE_COMBINATION.'price_wt_discount_blmod', $this->getPriceFormat($priceWithoutDiscount), $xml);
$xml = str_replace(REPLACE_COMBINATION.'wholesale_price', $this->getPriceFormat($feedPrice->getEditedPrice($wholesalePrice, 'product_wholesale_price', $this->settings)), $xml);
$xml = str_replace(REPLACE_COMBINATION.'id_product', (!empty($this->settings['product_id_prefix']) ? $this->settings['product_id_prefix'] : '').$combinationId, $xml);
$xml = str_replace(REPLACE_COMBINATION.'additional_id_combination', (($mode == 'mir') ? 'PRODUCT' : '').$combinationId, $xml);
$xml = str_replace(REPLACE_COMBINATION.'price', $this->getPriceFormat($basePrice), $xml);
$xml = str_replace(REPLACE_COMBINATION.'stock_status', ($combination['quantity'] > 0 ? 'Y' : 'N'), $xml);
$xml = str_replace(REPLACE_COMBINATION.'product_id_element', $product_class->id.'-'.$combination['id_product_attribute'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'weight', $weight, $xml);
$xml = str_replace(REPLACE_COMBINATION.'additional_ean13_with_prefix', $eanWithPrefix, $xml);
$xml = str_replace(REPLACE_COMBINATION.'cat-block-name', $catBlockName, $xml);
$xml = str_replace(REPLACE_COMBINATION.'location', $combination['location'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'upc', $combination['upc'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'available_date', $combination['available_date'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'availability_label', $this->availabilityLabel->getStatus($product_class, $combination['quantity']), $xml);
if ($mode == 'mal') {
$xml = str_replace('</TITLE>', '</TITLE><ITEMGROUP_TITLE>' . $name . '</ITEMGROUP_TITLE>', $xml);
}
if ($mode == 'pub') {
if ($this->publicGrProducts) {
$xml .= '<attribute><code>variant-group-id</code><value>' . $this->settings['pref_s'] . $product_class->id . $this->settings['pref_e'] . '</value></attribute>';
$xml .= '<attribute><code>shop-sku</code><value>' . $this->settings['pref_s'] . $combinationId . $this->settings['pref_e'] . '</value></attribute>';
$xml .= '<attribute><code>unique-identifier</code><value>' . $this->settings['pref_s'] . 'PRODUCT' . $combinationId . $this->settings['pref_e'] . '</value></attribute>';
} else {
$images = array();
$productTax = $this->getProductTax($product_class->id_tax_rules_group);
$xml .= '<offer-additional-fields>';
if (!empty($this->offerAdditionalFields)) {
foreach ($this->offerAdditionalFields as $oafKey => $oafVal) {
$xml .= '<offer-additional-field><code>' . $oafKey . '</code><value>' . $this->settings['pref_s'] . $oafVal . $this->settings['pref_e'] . '</value></offer-additional-field>';
}
}
$xml .= '<offer-additional-field><code>offervat</code><value>'.$this->settings['pref_s'].$productTax.$this->settings['pref_e'].'</value></offer-additional-field>';
$xml .= '<offer-additional-field><code>shippingvat</code><value>'.$this->settings['pref_s'].$productTax.$this->settings['pref_e'].'</value></offer-additional-field>';
$xml .= '</offer-additional-fields>';
}
}
if (!empty($affiliate_prices)) {
$affiliatePrice = '';
if ($mode == 'wor') {
$affiliatePrice = '<offer-additional-fields>';
}
foreach ($affiliate_prices as $a_price) {
$affiliatePriceFinal = $this->calculateAffiliatePrices(
$combinationSalePrice,
$product_class->price,
$this->productParam['shipping_price'][$product_class->id],
$priceWithoutDiscount,
$combination['wholesale_price'],
$a_price,
$product_class
);
if ($mode == 'ceo') {
break;
}
if ($mode == 'wor') {
$affiliatePrice .= '<offer-additional-field>
<code>price[channel='.$a_price['xml_name'].']</code>
<value>'.$this->settings['pref_s'].$affiliatePriceFinal.$this->settings['pref_e'].'</value>
</offer-additional-field>';
continue;
}
$affiliatePrice .= $this->getDeepTagName($a_price['xml_name']).$this->settings['pref_s'].$affiliatePriceFinal.$this->settings['pref_e'].$this->getDeepTagName($a_price['xml_name'], true);
}
if ($mode == 'wor') {
if (!empty($this->settings['worten_ship_from_country'])) {
$affiliatePrice .= '<offer-additional-field>
<code>ship-from-country-offer</code>
<value>'.$this->settings['worten_ship_from_country'].'</value>
</offer-additional-field>';
}
$affiliatePrice .= '</offer-additional-fields>';
}
$xml = str_replace(REPLACE_COMBINATION.'affiliate_price', $affiliatePrice, $xml);
}
$combinationAvailability = $availabilityName['out'];
if ($product_class->available_for_order == 1 || $product_class->online_only == 1) {
if ($combination['quantity'] > 0) {
$combinationAvailability = $availabilityName['in'];
} else {
if ($isAvailableWhenOutOfStock) {
$combinationAvailability = !empty($availabilityName['on_demand']) ? $availabilityName['on_demand'] : $availabilityName['in'];
}
}
}
$xml = str_replace(REPLACE_COMBINATION.'available_for_order', $combinationAvailability, $xml);
$xml .= $this->getAvailabilityDate($combinationAvailability);
if ($mode == 'ceo') {
$extraParam = '';
if (!empty($weight) && $product_class->weight > 0) {
$extraParam = ' weight="'.$weight.'"';
unset($paramsCeneo['weight']);
}
$addAvailStatus = ' avail="'.$combinationAvailability.'"';
$addStockStatus = ' stock="'.$combination['quantity'].'"';
if (empty($this->settings['is_enabled_field']['available_for_order'])) {
$addAvailStatus = '';
}
if (empty($this->settings['is_enabled_field']['quantity'])) {
$addStockStatus = '';
}
$tagParams = 'id="'.$combinationId.'" url="'.$url.'" price="'.$priceSale.'"'.$addStockStatus.$addAvailStatus;
$xml = str_replace('<o>', '<o '.$tagParams.$extraParam.'>', $xml);
}
$imagesXml = '';
$combinationImagesList = array();
$imageNo = 1;
if (empty($combinationImages) && !empty($images)) {
foreach ($images as $id => $i) {
$combinationImages[] = array('id' => $id);
}
}
if (!empty($images)) {
foreach ($images as $id => $i) {
$images[$id] = str_replace('additional_image_link>', 'image_link>', $i);
}
}
if (!empty($combinationImages)) {
$combinationImagesValues = [];
foreach ($combinationImages as $v) {
$combinationImagesValues[] = $v['id'];
}
foreach ($images as $imageId => $imageUrl) {
if (!in_array($imageId, $combinationImagesValues)) {
continue;
}
$combinationImagesList[] = $images[$imageId];
}
if (!empty($combinationImagesList)) {
if ($mode == 'spa') {
$imagesXml .= '<photos>';
}
if ($mode == 'lw') {
$imageKeys = array_keys($combinationImagesList);
if ($imageNo = 1) {
$imagesXml .= str_replace('1>', '>', $combinationImagesList[$imageKeys[0]]);
unset($combinationImagesList[$imageKeys[0]]);
}
if (empty($combinationImagesList)) {
return str_replace(REPLACE_COMBINATION.'image', $imagesXml, $xml);
}
$imagesXml .= '<additional_imageurl>';
}
if ($mode == 'ceo') {
$imagesXml .= '<imgs>';
}
if ($mode == 'mal') {
foreach ($combinationImagesList as $image) {
$isCover = !empty($imagesXml) ? 'false' : 'true';
$imagesXml .= '<MEDIA>'.$image.'<MAIN>'.$isCover.'</MAIN></MEDIA>';
if (empty($this->settings['all_images'])) {
break;
}
}
} elseif ($mode == 'tro') {
foreach ($combinationImagesList as $image) {
$imagesXml .= str_replace('e>', 'e'.($imageNo == 1 ? '' : $imageNo).'>', $image);
$imageNo++;
}
} elseif ($mode == 'ceo') {
$isCover = false;
foreach ($combinationImagesList as $image) {
$image = str_replace(['<![CDATA[', ']]>'],'', $image);
if (empty($isCover)) {
$imagesXml .= '<main url="' . strip_tags($image) . '"></main>';
} else {
$imagesXml .= '<i url="' . strip_tags($image) . '"></i>';
}
$isCover = true;
if (empty($this->settings['all_images'])) {
break;
}
}
} elseif ($mode == 'pub') {
$uId = 0;
foreach ($combinationImagesList as $u) {
$u = str_replace(array('<mainImage>', '</mainImage>'), '', $u);
$xml .= '<attribute><code>' . ($uId < 1 ? 'mainImage1' : 'varExtraImage' . $uId) . '</code><value>' . $u . '</value></attribute>';
$xml .= '<attribute><code>' . ($uId < 1 ? 'mainImageThumb' : 'varExtraImageThumb' . $uId) . '</code><value>' . $u . '</value></attribute>';
$uId++;
if (empty($this->settings['all_images'])) {
break;
}
}
} elseif ($mode == 'mala') {
$imagesXml = '<Image>'.implode(',', $combinationImagesList).'</Image>';
} elseif ($mode == 'kog') {
$imagesXml = '<IMAGES>'.implode('|', $combinationImagesList).'</IMAGES>';
} elseif ($mode == 'mir') {
$imagesXml = '<mainImage>'.implode(',', $combinationImagesList).'</mainImage>';
$imagesXml .= '<mainImageThumb>'.implode(',', $combinationImagesList).'</mainImageThumb>';
} elseif ($mode == 'gla') {
$isCover = true;
foreach ($combinationImagesList as $c) {
if ($isCover) {
$imagesXml .= $c;
$isCover = false;
continue;
}
$imagesXml .= str_replace('IMGURL>', 'IMGURL_ALTERNATIVE>', $c);
}
} else {
foreach ($combinationImagesList as $c) {
if ($mode == 's' || $mode == 'bp' || $mode == 'dm') {
$c = empty($imagesXml) ? str_replace('additional_imageurl>', 'image>', $c) : str_replace('image>', 'additional_imageurl>', $c);
}
if (!empty($imagesXml)) {
$c = str_replace('image_link>', 'additional_image_link>', $c);
}
$imagesXml .= str_replace('1>', (($mode == 'bee' && $imageNo == 1) ? '' : $imageNo) . '>', $c);
$imageNo++;
if (empty($this->settings['all_images']) || ($mode == 'mm' && $imageNo > 5)) {
break;
}
}
}
if ($mode == 'ceo') {
$imagesXml .= '</imgs>';
}
if ($mode == 'spa') {
$imagesXml .= '</photos>';
}
if ($mode == 'lw') {
$imagesXml .= '</additional_imageurl>';
}
}
}
$xml = str_replace(REPLACE_COMBINATION.'image', $imagesXml, $xml);
if (!empty($paramsCeneo) && $mode == 'ceo') {
$xml .= '<attrs>';
foreach ($paramsCeneo as $k => $v) {
$v = ($v == REPLACE_COMBINATION.'ean13') ? str_replace($v, $combination['ean13'], $v) : $v;
$v = ($v == REPLACE_COMBINATION.'reference') ? str_replace($v, $combination['reference'], $v) : $v;
$v = ($v == REPLACE_COMBINATION.'isbn') ? str_replace($v, $combination['isbn'], $v) : $v;
$v = ($v == REPLACE_COMBINATION.'upc') ? str_replace($v, $combination['upc'], $v) : $v;
$xml .= '<a name="'.$k.'">'.$this->settings['pref_s'].$v.$this->settings['pref_e'].'</a>';
}
$xml .= '</attrs>';
}
if (!empty($this->settings['spartoo_size'])) {
$xml .= $this->getSpartooSizeBlock($combinationAttributes, $combination['ean13']);
}
if ($mode == 'spa' && count($this->langIdWitIso) > 1) {
$xml .= '<languages>';
foreach ($this->langIdWitIso as $langIdFromList => $iso) {
if (empty($this->productLangValues[$product_class->id.$iso])) {
continue;
}
$color = '';
foreach ($this->productAttributesAllLanguages[$langIdFromList] as $a) {
if ($a['id_product_attribute'] == $combination['id_product_attribute'] && $a['id_attribute_group'] == 2) {
$color = $a['attribute_name'];
}
}
$xml .= '<language>';
$xml .= '<code>'.Tools::strtoupper($iso).'</code>';
$xml .= str_replace(REPLACE_COMBINATION.'name-'.$iso, $productTitleList[$iso], $this->productLangValues[$product_class->id.$iso]);
$xml .= '<product_color>'.$color.'</product_color>';
$xml .= '<product_price>'.$this->getPriceFormat($priceWithoutDiscount).'</product_price>';
$xml .= '</language>';
}
$xml .= '</languages>';
}
return $xml;
}
public function replaceCombinationToEmpty($xml, $combination, $images, $product_class, $mode, $paramsCeneo, $affiliatePriceFinal, $isParent = false)
{
$feedPrice = new FeedPrice();
$quantity = !empty($combination['quantity']) ? (int)$combination['quantity'] : 0;
$url = !empty($combination['url']) ? $combination['url'] : '';
$price = $this->getPriceFormat(!empty($combination['price']) ? $combination['price'] : 0);
//$price = $feedPrice->getEditedPrice($product_class->getPriceStatic($product_class->id, false, null, 2), 'product_price', $this->settings);
$priceSale = $this->getPriceFormat(!empty($combination['sale_blmod']) ? $feedPrice->getEditedPrice($combination['sale_blmod'], 'sale_blmod', $this->settings) : 0);
$priceWtDiscount = $this->getPriceFormat(!empty($combination['price_wt_discount_blmod']) ? $feedPrice->getEditedPrice($combination['price_wt_discount_blmod'], 'price_wt_discount_blmod', $this->settings) : 0);
$availability = isset($combination['available_for_order']) ? $combination['available_for_order'] : '';
$ean = !empty($combination['ean13']) ? $combination['ean13'] : '';
$reference = !empty($combination['reference']) ? $combination['reference'] : '';
$combination['isbn'] = isset($combination['isbn']) ? $combination['isbn'] : '';
$combination['upc'] = !empty($combination['upc']) ? $combination['upc'] : '';
$wholesalePrice = ($product_class->wholesale_price < 0.01) ? $product_class->price : $product_class->wholesale_price;
$taxRate = $this->productParam['tax_rate'][$product_class->id];
$salePriceOriginal = $this->productParam['sale_price'][$product_class->id];
$saleTaxExcl = $this->getPriceFormat($feedPrice->getEditedPrice(Tools::ps_round(($salePriceOriginal / (1 + $taxRate / 100)), 2, 1), 'sale_tax_excl_blmod', $this->settings));
$elementsByKey = array(
3 => (!empty($this->settings['product_id_prefix']) ? $this->settings['product_id_prefix'] : '').$product_class->id,
4 => !empty($this->productParam['reference'][$product_class->id]) ? $this->productParam['reference'][$product_class->id] : '',
5 => !empty($this->productParam['ean13'][$product_class->id]) ? $this->productParam['ean13'][$product_class->id] : '',
6 => isset($this->productParam['isbn'][$product_class->id]) ? $this->productParam['isbn'][$product_class->id] : '',
7 => !empty($this->productParam['category'][$product_class->id]) ? $this->productParam['category'][$product_class->id] : '',
8 => !empty($this->productParam['manufacturer'][$product_class->id]) ? $this->productParam['manufacturer'][$product_class->id] : '',
);
$productTitleList = [];
foreach ($this->langIdAll as $iso) {
$name = !empty($this->productParam['title-'.$iso][$product_class->id]) ? $this->productTitleEditor->replaceTitleByKey($this->productParam['title-'.$iso][$product_class->id], $this->productTitleEditorValues) : '';
$name = $this->productTitleEditor->addElementsToTitle($name, $this->settings['title_elements'], $elementsByKey);
$name = $this->productTitleEditor->addAttributesToTile($name, $this->settings['title_elements'], $this->productAttributes);
$nameWithoutTransform = $name;
$name = $this->productTitleEditor->titleTransformer($name, $this->settings);
$xml = str_replace(REPLACE_COMBINATION.'name-'.$iso, $name, $xml);
$productTitleList[$iso] = $name;
$replaceEmptyDescription = '';
switch ($this->settings['empty_description']) {
case 1:
$replaceEmptyDescription = $nameWithoutTransform;
break;
case 2:
$replaceEmptyDescription = $this->settings['empty_description_text'];
break;
}
$xml = str_replace(REPLACE_COMBINATION . 'description-' . $iso, $replaceEmptyDescription, $xml);
$xml = str_replace(REPLACE_COMBINATION . 'description_short-' . $iso, $replaceEmptyDescription, $xml);
}
if (empty($ean) && $mode == 'sfl') {
$ean = $this->settings['domain'].'-'.$product_class->id;
}
$eanWithPrefix = '';
if (!empty($product_class->ean13)) {
$eanWithPrefix = (!empty($this->settings['ean_prefix']) ? $this->settings['ean_prefix'] : '').$product_class->ean13;
}
$referenceWithPrefix = '';
if (!empty($this->productParam['reference'][$product_class->id])) {
$referenceWithPrefix = (!empty($this->settings['reference_prefix']) ? $this->settings['reference_prefix'] : '').$this->productParam['reference'][$product_class->id];
}
$catBlockName = '';
if ($mode == 'bee') {
$catBlockName = ' idp="' . $product_class->id . '" idd="0" type="'.($isParent ? 'parent' : 'simple').'"';
}
if (!empty($this->settings['max_quantity']) && !empty($this->settings['max_quantity_status']) && $quantity > $this->settings['max_quantity']) {
$quantity = $this->settings['max_quantity'];
}
$xml = str_replace(REPLACE_COMBINATION.'quantity', $quantity, $xml);
$xml = str_replace(REPLACE_COMBINATION.'minimal_quantity', $product_class->minimal_quantity, $xml);
$xml = str_replace(REPLACE_COMBINATION.'available_for_order', $availability, $xml);
$xml = str_replace(REPLACE_COMBINATION.'ean13', $ean, $xml);
$xml = str_replace(REPLACE_COMBINATION.'isbn', $combination['isbn'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'mpn', $product_class->mpn, $xml);
$xml = str_replace(REPLACE_COMBINATION.'supplier_reference', !empty($combination['supplier_reference']) ? $combination['supplier_reference'] : '', $xml);
$xml = str_replace(REPLACE_COMBINATION.'reference', $reference, $xml);
$xml = str_replace(REPLACE_COMBINATION.'additional_reference', $referenceWithPrefix, $xml);
$xml = str_replace(REPLACE_COMBINATION.'url', $url, $xml);
$xml = str_replace(REPLACE_COMBINATION.'additional_url', $url, $xml);
$xml = str_replace(REPLACE_COMBINATION.'wholesale_price', $this->getPriceFormat($feedPrice->getEditedPrice($wholesalePrice, 'product_wholesale_price', $this->settings)), $xml);
$xml = str_replace(REPLACE_COMBINATION.'sale_blmod', $priceSale, $xml);
$xml = str_replace(REPLACE_COMBINATION.'sale_tax_excl_blmod', $saleTaxExcl, $xml);
$xml = str_replace(REPLACE_COMBINATION.'price_wt_discount_blmod', $priceWtDiscount, $xml);
$xml = str_replace(REPLACE_COMBINATION.'id_product', (!empty($this->settings['product_id_prefix']) ? $this->settings['product_id_prefix'] : '').$product_class->id.(!empty($this->settings['product_id_with_zero']) ? '-0' : ''), $xml);
$xml = str_replace(REPLACE_COMBINATION.'additional_id_combination', ($mode == 'mir' ? 'PRODUCT' : '').$product_class->id, $xml);
$xml = str_replace(REPLACE_COMBINATION.'price', $price, $xml);
$xml = str_replace(REPLACE_COMBINATION.'stock_status', !empty($combination['stock_status']) ? $combination['stock_status'] : '', $xml);
$xml = str_replace(REPLACE_COMBINATION.'product_id_element', $product_class->id, $xml);
$xml = str_replace(REPLACE_COMBINATION.'weight', $product_class->weight, $xml);
$xml = str_replace(REPLACE_COMBINATION.'additional_ean13_with_prefix', $eanWithPrefix, $xml);
$xml = str_replace(REPLACE_COMBINATION.'cat-block-name', $catBlockName, $xml);
$xml = str_replace(REPLACE_COMBINATION.'location', $product_class->location, $xml);
$xml = str_replace(REPLACE_COMBINATION.'upc', $combination['upc'], $xml);
$xml = str_replace(REPLACE_COMBINATION.'available_date', $product_class->available_date, $xml);
$xml = str_replace(REPLACE_COMBINATION.'availability_label', $this->availabilityLabel->getStatus($product_class, $quantity), $xml);
$xml .= $this->getAvailabilityDate($availability);
if ($mode == 'pub') {
if ($this->publicGrProducts) {
$xml .= '<attribute><code>variant-group-id</code><value>' . $this->settings['pref_s'] . $product_class->id . $this->settings['pref_e'] . '</value></attribute>';
$xml .= '<attribute><code>shop-sku</code><value>' . $this->settings['pref_s'] . $product_class->id . $this->settings['pref_e'] . '</value></attribute>';
$xml .= '<attribute><code>unique-identifier</code><value>' . $this->settings['pref_s'] . 'PRODUCT' . $product_class->id . $this->settings['pref_e'] . '</value></attribute>';
} else {
$productTax = $this->getProductTax($product_class->id_tax_rules_group);
$xml .= '<offer-additional-fields>';
if (!empty($this->offerAdditionalFields)) {
foreach ($this->offerAdditionalFields as $oafKey => $oafVal) {
$xml .= '<offer-additional-field><code>' . $oafKey . '</code><value>' . $this->settings['pref_s'] . $oafVal . $this->settings['pref_e'] . '</value></offer-additional-field>';
}
}
$xml .= '<offer-additional-field><code>offervat</code><value>' . $this->settings['pref_s'] . $productTax . $this->settings['pref_e'] . '</value></offer-additional-field>';
$xml .= '<offer-additional-field><code>shippingvat</code><value>' . $this->settings['pref_s'] . $productTax . $this->settings['pref_e'] . '</value></offer-additional-field>';
$xml .= '</offer-additional-fields>';
}
}
if ($mode == 'ceo') {
$extraParam = '';
if (!empty($paramsCeneo['weight']) && $product_class->weight > 0) {
$extraParam = ' weight="'.$product_class->weight.'"';
unset($paramsCeneo['weight']);
}
$addAvailStatus = ' avail="'.$availability.'"';
$addStockStatus = ' stock="'.$quantity.'"';
if (empty($this->settings['is_enabled_field']['available_for_order'])) {
$addAvailStatus = '';
}
if (empty($this->settings['is_enabled_field']['quantity'])) {
$addStockStatus = '';
}
$tagParams = 'id="'.$product_class->id.'" url="'.$url.'" price="'.(!empty($affiliatePriceFinal) ? $affiliatePriceFinal : $priceSale).'"'.$addStockStatus.$addAvailStatus;
$xml = str_replace('<o>', '<o '.$tagParams.$extraParam.'>', $xml);
}
$imagesXml = '';
$imageNo = 1;
if ($mode == 'mala' || $mode == 'kog' || $mode == 'mir') {
$images = array();
}
if (!empty($images)) {
if ($mode == 'spa') {
$imagesXml = '<photos>';
}
$imageKeys = array_keys($images);
if ($mode == 'lw') {
if ($imageNo = 1) {
$imagesXml .= str_replace('1>', '>', $images[$imageKeys[0]]);
unset($images[$imageKeys[0]]);
}
if (empty($images)) {
return str_replace(REPLACE_COMBINATION.'image', $imagesXml, $xml);
}
$imagesXml .= '<additional_imageurl>';
}
if ($mode == 'ceo') {
$imagesXml .= '<imgs>';
}
if ($mode == 'mal') {
foreach ($images as $image) {
$isCover = !empty($imagesXml) ? 'false' : 'true';
$imagesXml .= '<MEDIA>'.$image.'<MAIN>'.$isCover.'</MAIN></MEDIA>';
if (empty($this->settings['all_images'])) {
break;
}
}
} elseif ($mode == 'ceo') {
$isCover = false;
foreach ($images as $image) {
$image = str_replace(['<![CDATA[', ']]>'],'', $image);
if (empty($isCover)) {
$imagesXml .= '<main url="' . strip_tags($image) . '"></main>';
} else {
$imagesXml .= '<i url="' . strip_tags($image) . '"></i>';
}
$isCover = true;
if (empty($this->settings['all_images'])) {
break;
}
}
} elseif ($mode == 'gla') {
$isCover = true;
foreach ($images as $image) {
if ($isCover) {
$imagesXml .= $image;
$isCover = false;
continue;
}
$imagesXml .= str_replace('IMGURL>', 'IMGURL_ALTERNATIVE>', $image);
}
} elseif ($mode == 'tro') {
foreach ($images as $image) {
$imagesXml .= str_replace('e>', 'e'.($imageNo == 1 ? '' : $imageNo).'>', $image);
$imageNo++;
}
} else {
foreach ($images as $image) {
$imagesXml .= str_replace('1>', (($mode == 'bee' && $imageNo == 1) ? '' : $imageNo).'>', $image);
$imageNo++;
if (empty($this->settings['all_images']) || ($mode == 'mm' && $imageNo > 5)) {
break;
}
}
}
if ($mode == 'ceo') {
$imagesXml .= '</imgs>';
}
if ($mode == 'spa') {
$imagesXml .= '</photos>';
}
if ($mode == 'lw') {
$imagesXml .= '</additional_imageurl>';
}
}
$xml = str_replace(REPLACE_COMBINATION.'image', $imagesXml, $xml);
if (!empty($paramsCeneo) && $mode == 'ceo') {
$xml .= '<attrs>';
foreach ($paramsCeneo as $k => $v) {
$v = ($v == REPLACE_COMBINATION.'ean13') ? str_replace($v, $ean, $v) : $v;
$v = ($v == REPLACE_COMBINATION.'reference') ? str_replace($v, $reference, $v) : $v;
$v = ($v == REPLACE_COMBINATION.'isbn') ? str_replace($v, $combination['isbn'], $v) : $v;
$v = ($v == REPLACE_COMBINATION.'upc') ? str_replace($v, $combination['upc'], $v) : $v;
$xml .= '<a name="'.$k.'">'.$this->settings['pref_s'].$v.$this->settings['pref_e'].'</a>';
}
$xml .= '</attrs>';
}
if ($mode == 'spa' && count($this->langIdAll) > 1) {
$xml .= '<languages>';
foreach ($this->langIdAll as $iso) {
if (empty($this->productLangValues[$product_class->id.$iso])) {
continue;
}
$xml .= '<language>';
$xml .= '<code>'.Tools::strtoupper($iso).'</code>';
$xml .= str_replace(REPLACE_COMBINATION.'name-'.$iso, $productTitleList[$iso], $this->productLangValues[$product_class->id.$iso]);
$xml .= '<product_color></product_color>';
$xml .= '<product_price>'.$priceWtDiscount.'</product_price>';
$xml .= '</language>';
}
$xml .= '</languages>';
}
return $xml;
}
public function getProductGroupedAttributeBranch($fieldGroupedAttributes, $attributesList, $id_product_attribute = 0, $paramsCeneo = array())
{
$xmlProduct = '';
$mode = $this->settings['feed_mode'];
if (!empty($fieldGroupedAttributes) && !empty($attributesList)) {
$attributeByGroup = array();
foreach ($attributesList as $a) {
if (empty($a['quantity'])) {
//continue;
}
if (!empty($id_product_attribute)) {
if ($id_product_attribute != $a['id_product_attribute']) {
continue;
}
}
$attributeByGroup[$a['id_attribute_group']][] = !empty($this->attributeMapValues[$a['id_attribute_group'].'-'.$a['id_attribute']]) ? $this->attributeMapValues[$a['id_attribute_group'].'-'.$a['id_attribute']] : $a['attribute_name'];
}
$paramName = ($mode == 'mal') ? 'NAME' : 'PARAM_NAME';
if ($mode == 'man') {
$xmlProduct .= '<params>';
}
foreach ($fieldGroupedAttributes as $ag) {
$attributeByGroup[$ag['name']] = !empty($attributeByGroup[$ag['name']]) ? $attributeByGroup[$ag['name']] : array();
if ($mode == 'gla' || $mode == 'u' || $mode == 'mal' || $mode == 'naj' || $mode == 'zbo' || $mode == 'tov') {
$fieldName = ($mode == 'mal') ? 'VALUE' : 'VAL';
$valueList = array_unique($attributeByGroup[$ag['name']]);
if (empty($valueList)) {
continue;
}
foreach ($valueList as $v) {
if ($mode == 'mal') {
$this->productAttributeAndFeatureName[] = $ag['title_xml'];
}
$xmlProduct .= '<PARAM><'.$paramName.'>'.$ag['title_xml'].'</'.$paramName.'><'.$fieldName.'>'.$this->settings['pref_s'].$v.$this->settings['pref_e'].'</'.$fieldName.'></PARAM>';
}
} elseif ($mode == 'ceo') {
$paramsCeneo[$ag['title_xml']] = implode(',', array_unique($attributeByGroup[$ag['name']]));
} elseif ($mode == 'man') {
$xmlProduct .= '<param><param_name>'.$ag['title_xml'].'</param_name><param_value>'.$this->settings['pref_s'].implode(',', array_unique($attributeByGroup[$ag['name']])).$this->settings['pref_e'].'</param_value></param>';
} elseif ($mode == 'pub') {
$xmlProduct .= '<attribute><code>'.$ag['title_xml'].'</code><value>'.$this->settings['pref_s'].implode(',', array_unique($attributeByGroup[$ag['name']])).$this->settings['pref_e'].'</value></attribute>';
} elseif ($mode == 'wum') {
$attributesUniqueList = array_unique($attributeByGroup[$ag['name']]);
if (!empty($attributesUniqueList)) {
foreach ($attributesUniqueList as $n) {
$xmlProduct .= '<feature id="'.(!empty($this->featuresKeyByName[$n]) ? $this->featuresKeyByName[$n] : 0).'">'.$this->settings['pref_s'].$n.$this->settings['pref_e'].'</feature>';
}
}
} elseif ($mode == 'ho') {
$valueList = array_unique($attributeByGroup[$ag['name']]);
if (empty($valueList)) {
continue;
}
foreach ($valueList as $v) {
$xmlProduct .= '<param name="'.$ag['title_xml'].'">'.$this->settings['pref_s'].$v.$this->settings['pref_e'].'</param>';
}
} else {
$xmlProduct .= $this->getDeepTagName($ag['title_xml']) . $this->settings['pref_s'] . implode(',', array_unique($attributeByGroup[$ag['name']])) . $this->settings['pref_e'] . $this->getDeepTagName($ag['title_xml'], true);
}
}
if ($mode == 'man') {
$xmlProduct .= '</params>';
}
}
return array('xml' => $xmlProduct, 'paramsCeneo' => $paramsCeneo);
}
public function getProductGroupedAttributeBranchByParentGroup($fieldGroupedAttributes, $attributesByParentGroup, $parentGroupName, $parentGroupId)
{
$xmlProduct = '';
$attributesByParentGroup[$parentGroupName][$parentGroupId][] = $parentGroupName;
foreach ($attributesByParentGroup[$parentGroupName] as $id => $ag) {
if (!empty($this->settings['spartoo_size']) && $id == $this->settings['spartoo_size']) {
continue;
}
$xmlProduct .= $this->getDeepTagName($fieldGroupedAttributes[$id]['title_xml']) . $this->settings['pref_s'] . implode(',', array_unique($ag)) . $this->settings['pref_e'] . $this->getDeepTagName($fieldGroupedAttributes[$id]['title_xml'], true);
}
return $xmlProduct;
}
public function getProductAttributeBranchMru($extra_attributes, $attributesList, $block_name, $one_branch, $id_product_attribute = 0)
{
$xmlProduct = '';
if (empty($extra_attributes) || empty($attributesList)) {
return $xmlProduct;
}
$list = array();
$row = 0;
$extra_attributes = array_reverse($extra_attributes);
foreach ($attributesList as $ag) {
if (!empty($id_product_attribute)) {
if ($id_product_attribute != $ag['id_product_attribute']) {
continue;
}
}
foreach ($extra_attributes as $a) {
if (isset($list[$row][$a['title_xml']])) {
$row++;
}
$list[$row][$a['title_xml']] = ($a['title_xml'] == 'code') ? $ag[$a['name']] : $this->settings['pref_s'].$ag[$a['name']].$this->settings['pref_e'];
}
}
if (empty($list)) {
return $xmlProduct;
}
foreach ($list as $element) {
$xmlProduct .= '<attribute>';
foreach ($element as $k => $e) {
$xmlProduct .= '<'.$k.'>'.$e.'</'.$k.'>';
}
$xmlProduct .= '</attribute>';
}
return $xmlProduct;
}
public function getProductAttributeBranch($extra_attributes, $attributesList, $block_name, $one_branch, $id_product_attribute = 0)
{
$xmlProduct = '';
if (!empty($extra_attributes) && !empty($attributesList)) {
if (empty($one_branch)) {
$xmlProduct .= '<'.$block_name['attributes-block-name'].'>';
}
$nr = 0;
foreach ($attributesList as $ag) {
if (!empty($id_product_attribute)) {
if ($id_product_attribute != $ag['id_product_attribute']) {
continue;
}
}
++$nr;
if (empty($one_branch)) {
$xmlProduct .= '<'.$block_name['attributes-block-name'].'-'.$nr.'>';
}
foreach ($extra_attributes as $a) {
$xmlProduct .= $this->getDeepTagName($a['title_xml']).$this->settings['pref_s'].$ag[$a['name']].$this->settings['pref_e'].$this->getDeepTagName($a['title_xml'], true);
}
if (empty($one_branch)) {
$xmlProduct .= '</'.$block_name['attributes-block-name'].'-'.$nr.'>';
}
}
if (empty($one_branch)) {
$xmlProduct .= '</'.$block_name['attributes-block-name'].'>';
}
}
return $xmlProduct;
}
public function attributeName($n)
{
$n = trim($n, ':');
return $n;
}
public function getPriceFormat($price = 0)
{
if (!empty($this->settings['currencyIdConvert'])) {
$price = Tools::convertPrice($price, $this->settings['currencyIdConvert']);
}
return PriceFormat::convertByType($price, $this->settings['price_format_id']).$this->settings['currencyIso'];
}
public function whereType($type)
{
if (!empty($type)) {
return ' AND ';
}
return ' WHERE ';
}
public function getProductCategories($productId, $langId = false, $defaultCatId = 0, $returnId = false)
{
$separator = !empty($this->settings['category_tree_separator']) ? $this->settings['category_tree_separator'] : ' > ';
$list = array();
$fieldName = 'name';
if ($returnId) {
$fieldName = 'id_category';
$separator = ',';
}
if (!empty($this->settings['category_tree_type'])) {
if (!$returnId && !empty($defaultCatId)) {
$path = '';
if ($this->settings['totalGetPathMethods'] == 2) {
$path = Tools::getPath('', $defaultCatId);
} elseif ($this->settings['totalGetPathMethods'] == 1) {
$path = Tools::getPath($defaultCatId);
}
$path = trim(html_entity_decode(strip_tags($path), ENT_QUOTES, 'UTF-8'));
if (!empty($path)) {
return str_replace('>', $separator, $path);
}
}
}
if (!empty($defaultCatId) && $this->isExistsCategoryGetAllParents && !$returnId) {
$categoryDefault = new Category($defaultCatId, $langId);
$list = [];
$allParents = $categoryDefault->getAllParents($langId);
foreach ($allParents as $category) {
if ($category->id_parent != 0 && !$category->is_root_category) {
$list[] = $category->$fieldName;
}
}
if (!$categoryDefault->is_root_category) {
if ($category->id_parent != 0 && !$category->is_root_category) {
$list[] = $categoryDefault->$fieldName;
}
}
if (empty($list)) {
$list[] = $categoryDefault->$fieldName;
}
}
if (!empty($list)) {
return implode($separator, $list);
}
if (empty($defaultCatId) && empty($returnId)) {
$separator = ',|||,';
}
$categories = Db::getInstance()->executeS('SELECT DISTINCT(p.id_category), l.name
FROM '._DB_PREFIX_.'category_product p
LEFT JOIN '._DB_PREFIX_.'category c ON
p.id_category = c.id_category
LEFT JOIN '._DB_PREFIX_.'category_lang l ON
(p.id_category = l.id_category AND l.id_lang = "'.(int)$langId.'")
WHERE p.id_product = "'.(int)$productId.'" AND c.level_depth != "0"
ORDER BY c.level_depth ASC');
if (empty($categories)) {
return false;
}
foreach ($categories as $c) {
$list[] = $c[$fieldName];
}
return implode($separator, $list);
}
public function getGoogleCatMap($mode, $settings)
{
$categoryMap = new CategoryMap();
$fileName = $categoryMap->getFileNameById($settings['category_map_id']);
$googleCategory = new GoogleCategoryBlMod($fileName);
$googleCategories = $googleCategory->getList();
$categoriesMap = Db::getInstance()->ExecuteS('SELECT `category_id`, `g_category_id`
FROM '._DB_PREFIX_.'blmod_xml_g_cat
WHERE type = "'.pSQL($settings['category_map_id']).'"');
if (empty($categoriesMap)) {
return array();
}
$googleCategoriesMap = array();
foreach ($categoriesMap as $m) {
if ($fileName == 'kogan_ebay-en-EN.txt') {
$googleCategoriesMap[$m['category_id']] = array(
'id' => $m['g_category_id'],
'name' => 'ebay:'.$m['g_category_id'],
);
continue;
}
if ($mode == 'a' || $mode == 'spa') {
$googleCategoriesMap[$m['category_id']] = array(
'id' => $m['g_category_id'],
'name' => $m['g_category_id'],
);
continue;
}
$nameFinal = isset($googleCategories[$m['g_category_id']]) ? $googleCategories[$m['g_category_id']] : '';
if ($mode == 'mal') {
$name = explode(' | ', $nameFinal);
$nameFinal = $name[1];
}
if ($fileName == 'car_gr-gr-GR.txt') {
$nameFinal = $m['g_category_id'];
}
$googleCategoriesMap[$m['category_id']] = array(
'id' => $m['g_category_id'],
'name' => $nameFinal,
);
}
return $googleCategoriesMap;
}
public function getAvailabilityByMode($product, $feedSettings, $configurationLang)
{
if ((!empty($feedSettings['in_stock_text']) || (string)$feedSettings['in_stock_text'] == '0') || !empty($feedSettings['out_of_stock_text'])) {
return array(
'in' => (!empty($feedSettings['in_stock_text']) || (string)$feedSettings['in_stock_text'] == '0') ? $feedSettings['in_stock_text'] : '',
'out' => !empty($feedSettings['out_of_stock_text']) ? $feedSettings['out_of_stock_text'] : '',
'on_demand' => !empty($feedSettings['on_demand_stock_text']) ? $feedSettings['on_demand_stock_text'] : (!empty($this->PS_LABEL_OOS_PRODUCTS_BOA) ? $this->PS_LABEL_OOS_PRODUCTS_BOA : ''),
);
}
$id = !empty($feedSettings['in_stock_text']) ? $feedSettings['in_stock_text'] : 'in stock';
$out = !empty($feedSettings['out_of_stock_text']) ? $feedSettings['out_of_stock_text'] : 'out of stock';
$onDemand = !empty($feedSettings['on_demand_stock_text']) ? $feedSettings['on_demand_stock_text'] : 'on demand';
$product->additional_delivery_times = !empty($product->additional_delivery_times) ? $product->additional_delivery_times : 0;
if ($product->additional_delivery_times == 1) {
return array(
'in' => !empty($configurationLang['PS_LABEL_DELIVERY_TIME_AVAILABLE']) ? $configurationLang['PS_LABEL_DELIVERY_TIME_AVAILABLE'] : $id,
'out' => !empty($configurationLang['PS_LABEL_DELIVERY_TIME_OOSBOA']) ? $configurationLang['PS_LABEL_DELIVERY_TIME_OOSBOA'] : $out,
'on_demand' => !empty($this->PS_LABEL_OOS_PRODUCTS_BOA) ? $this->PS_LABEL_OOS_PRODUCTS_BOA : $onDemand,
);
}
if ($product->additional_delivery_times == 2) {
return array(
'in' => !empty($product->delivery_in_stock) ? $product->delivery_in_stock : $id,
'out' => !empty($product->delivery_out_stock) ? $product->delivery_out_stock : $out,
'on_demand' => !empty($this->PS_LABEL_OOS_PRODUCTS_BOA) ? $this->PS_LABEL_OOS_PRODUCTS_BOA : $onDemand,
);
}
return array(
'in' => $id,
'out' => $out,
'on_demand' => $onDemand,
);
}
public function getLanguageCodeLong($code = '')
{
$list = array(
'lt' => 'lit',
'en' => 'eng',
'es' => 'spa',
'ru' => 'rus',
'fr' => 'fra',
'lv' => 'lav',
'it' => 'ita',
'gr' => 'gre',
'de' => 'deu',
);
return !empty($list[$code]) ? $list[$code] : $code;
}
public function getDeepTagName($tag = '', $close = false)
{
if (strpos($tag, '/') === false) {
return '<'.($close ? '/' : '').$tag.'>';
}
if ($close) {
return '</vBLMOD></sBLMOD>';
}
return '<sBLMOD><nBLMOD>'.str_replace('/', '_lBLMOD_', $tag).'</nBLMOD><vBLMOD>';
}
public function fieldSorting($xml, $mode, $xmlProductExtra = '', $isCombinations = false)
{
if ($mode == 'cgr') {
return $this->fieldSortingCarGr($xml);
}
if ($mode == 'vi' && !$isCombinations) {
return $this->fieldSortingVivino($xml);
}
if ($mode != 'mal') {
return $xml;
}
$p = xml_parser_create();
xml_parse_into_struct($p, $xml, $values, $index);
xml_parser_free($p);
$tagList = [];
$mainTag = '';
foreach ($values as $v) {
if ($v['level'] == 1) {
$mainTag = $v['tag'];
continue;
}
if ($v['level'] != 2) {
continue;
}
if (in_array($v['tag'], $tagList)) {
continue;
}
$tagList[$v['tag']] = $v['tag'];
}
$newXml = '<'.$mainTag.'>';
$fields = array_unique(array_merge([
'ID',
'STAGE',
'ITEMGROUP_ID',
'ITEMGROUP_TITLE',
'CATEGORY_ID',
'BRAND_ID',
'TITLE',
'SHORTDESC',
'LONGDESC',
'PRIORITY',
'PACKAGE_SIZE',
'BARCODE',
'PRICE',
'VAT',
'RRP',
'PARAM',
'VARIABLE_PARAMS',
'MEDIA',
'PROMOTION',
'DIMENSIONS',
'LABEL',
'DELIVERY_DELAY',
'FREE_DELIVERY',
], $tagList));
$xmlBottomDeliveryDelay = '';
$xmlBottomFreeDelivery = '';
foreach ($fields as $s) {
if ($s == 'ITEMGROUP_ID' && !$isCombinations) {
continue;
}
preg_match_all("'<".$s.">(.*?)</".$s.">'si", $xml, $rows);
if ($s == 'DELIVERY_DELAY' && !empty($rows[0])) {
$xmlBottomDeliveryDelay = $rows[0][0];
continue;
}
if ($s == 'FREE_DELIVERY' && !empty($rows[0])) {
$xmlBottomFreeDelivery = $rows[0][0];
continue;
}
foreach ($rows[0] as $r) {
$newXml .= $r;
}
}
$closeTag = '</'.$mainTag.'>';
if ($isCombinations && strpos($xml, $closeTag) !== false) {
$closeTag = '';
}
if ($isCombinations && strpos($xml, REPLACE_COMBINATION.'image') !== false) {
$newXml .= REPLACE_COMBINATION.'image';
}
$newXml = str_replace('PARAM_replace', 'PARAM', $newXml);
return $newXml.$xmlProductExtra.$xmlBottomDeliveryDelay.$xmlBottomFreeDelivery.$closeTag;
}
public function fieldSortingVivino($xml)
{
$p = xml_parser_create();
xml_parse_into_struct($p, $xml, $values, $index);
xml_parser_free($p);
$tagList = [];
$mainTag = '';
foreach ($values as $v) {
if ($v['level'] == 2 && $v['type'] == 'open') {
$mainTag = Tools::strtolower($v['tag']);
continue;
}
if ($v['level'] != 3) {
continue;
}
$tagList[] = Tools::strtolower($v['tag']);
}
$fields = array_unique(array_merge([
'producer',
'wine-name',
'appellation',
'vintage',
'country',
'color',
'description',
'alcohol',
'producer-address',
], $tagList));
$newXml = '';
foreach ($fields as $s) {
preg_match_all("'<".$s.">(.*?)</".$s.">'si", $xml, $rows);
if (empty($rows[0])) {
continue;
}
foreach ($rows[0] as $r) {
$newXml .= $r;
}
}
preg_match("'<".$mainTag.">(.*?)</".$mainTag.">'si", $xml, $extrasBranch);
$xml = str_replace($extrasBranch[0], '', $xml);
$xml = str_replace('</product>', '<'.$mainTag.'>'.$newXml.'</'.$mainTag.'></product>', $xml);
return $xml;
}
public function fieldSortingCarGr($xml)
{
$p = xml_parser_create();
xml_parse_into_struct($p, $xml, $values, $index);
xml_parser_free($p);
$tagList = [];
$mainTag = '';
foreach ($values as $v) {
if ($v['level'] == 1 && $v['type'] == 'open') {
$mainTag = Tools::strtolower($v['tag']);
continue;
}
if ($v['level'] != 2) {
continue;
}
$tagList[] = Tools::strtolower($v['tag']);
}
$fields = array_unique(array_merge([
'unique_id',
'manufacturer_number',
'aftermarket_number',
'title',
'description',
'category_id',
'price',
'makemodels',
'photos',
'condition',
], $tagList));
$newXml = '';
foreach ($fields as $s) {
preg_match_all("'<".$s.">(.*?)</".$s.">'si", $xml, $rows);
if (empty($rows[0])) {
continue;
}
foreach ($rows[0] as $r) {
$newXml .= $r;
}
}
$final = '<'.$mainTag.'>'.$newXml.'</'.$mainTag.'>';
return $final;
}
public function getFrontFeatures($langId, $productId, $multistoreId)
{
if (!$this->isFeatureActive) {
return array();
}
$multistoreId = !empty($multistoreId) ? (int)$multistoreId : 1;
return Db::getInstance()->executeS('SELECT fl.`name`, fvl.`value`, pf.id_feature, fvl.`id_feature_value`
FROM '._DB_PREFIX_.'feature_product pf
LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON
(fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$langId.')
LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON
(fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$langId.')
LEFT JOIN '._DB_PREFIX_.'feature f ON
(f.id_feature = pf.id_feature AND fl.id_lang = '.(int)$langId.')
INNER JOIN '._DB_PREFIX_.'feature_shop feature_shop ON
(feature_shop.id_feature = f.id_feature AND feature_shop.id_shop = '.(int)$multistoreId.')
WHERE pf.id_product = '.(int)$productId);
}
public function getAllCategories($languages, $multistoreId)
{
$l_where_cat = '';
foreach ($languages as $ll) {
$l_where_cat .= 'OR c.`id_lang`='.(int)$ll['name'].' ';
if ($this->settings['feed_mode'] == 'ep') {
break;
}
}
$l_where_cat = '('.trim($l_where_cat, 'OR').')';
if (_PS_VERSION_ >= '1.5') {
$l_where_cat .= ' AND id_shop = "'.(!empty($multistoreId) ? (int)$multistoreId : "1").'"';
}
return Db::getInstance()->ExecuteS('SELECT c.`id_category`, c.`name`, c.`id_lang`, l.iso_code, cr.id_parent
FROM '._DB_PREFIX_.'category_lang c
LEFT JOIN '._DB_PREFIX_.'category cr ON
cr.id_category = c.id_category
INNER JOIN '._DB_PREFIX_.'lang l ON
l.id_lang = c.id_lang
WHERE '.$l_where_cat.'
ORDER BY c.`id_category`');
}
public function getAllAttributes($langId)
{
return Db::getInstance()->ExecuteS('SELECT al.id_attribute, al.name FROM '._DB_PREFIX_.'attribute_lang al WHERE al.id_lang = '.(int)$langId);
}
public function loadProductFeatures($langId, $productId, $multistoreId)
{
$features = $this->getFrontFeatures($langId, $productId, $multistoreId);
$this->productFeatures = [];
$this->productFeaturesWithId = [];
if (empty($features)) {
return false;
}
foreach ($features as $f) {
$this->productFeatures[$f['id_feature']] = !empty($this->featureMapValues[$f['id_feature'].'-'.$f['id_feature_value']]) ? $this->featureMapValues[$f['id_feature'].'-'.$f['id_feature_value']] : $f['value'];
$this->productFeaturesWithId[$f['id_feature']] = $f['id_feature_value'];
}
return $this->productFeatures;
}
public function getSpartooSizeBlock($combinations, $defaultEan13 = '')
{
$spartooSizeList = [];
if (empty($combinations)) {
return '';
}
if (!empty($this->groupedAttributesByParent['childValues']) && !empty($this->groupedAttributesByParent['parentName'])) {
foreach ($this->groupedAttributesByParent['childValues'][$this->groupedAttributesByParent['parentName']] as $a) {
$groupedAttributes = $a;
break;
}
}
if (empty($groupedAttributes)) {
foreach ($combinations as $c) {
if ($c['quantity'] < 1 && !empty($this->settings['only_in_stock'])) {
continue;
}
$sizeName = '';
foreach ($this->productAttributes as $a) {
if ($c['id_product_attribute'] == $a['id_product_attribute'] && $a['id_attribute_group'] == $this->settings['spartoo_size']) {
$sizeName = !empty($this->attributeMapValues[$this->settings['spartoo_size'] . '-' . $a['id_attribute']]) ? $this->attributeMapValues[$this->settings['spartoo_size'] . '-' . $a['id_attribute']] : $a['attribute_name'];
break 1;
}
}
if (empty($spartooSizeList[$sizeName])) {
$spartooSizeList[$sizeName] = [
'size_name' => $sizeName,
'size_quantity' => $c['quantity'],
'size_reference' => $c['reference'],
'ean13' => !empty($c['ean13']) ? $c['ean13'] : $defaultEan13,
];
} else {
$spartooSizeList[$sizeName]['size_quantity'] += $c['quantity'];
}
}
} else {
foreach ($this->productAttributes as $aParent) {
if ($aParent['id_attribute_group'] == $this->settings['merge_attributes_parent']) {
foreach ($this->productAttributes as $aChild) {
if ($aChild['quantity'] < 1 && !empty($this->settings['only_in_stock'])) {
continue;
}
if ($aParent['attribute_name'] != $this->groupedAttributesByParent['parentName']) {
continue;
}
if ($aParent['id_attribute_group'] == $aChild['id_attribute_group'] || !in_array($aChild['attribute_name'], $groupedAttributes)) {
continue;
}
if ($aParent['id_product_attribute'] == $aChild['id_product_attribute']) {
$aChild['size_name'] = $aChild['attribute_name'];
$aChild['size_quantity'] = $aChild['quantity'];
$aChild['size_reference'] = $aChild['reference'];
$spartooSizeList[] = $aChild;
}
}
}
}
}
$xmlProduct = '<size_list>';
if (!empty($spartooSizeList)) {
foreach ($spartooSizeList as $s) {
$xmlProduct .= '<size>';
$xmlProduct .= '<size_name>'.$s['size_name'].'</size_name>';
$xmlProduct .= '<size_quantity>'.$s['size_quantity'].'</size_quantity>';
$xmlProduct .= '<size_reference>'.$s['size_reference'].'</size_reference>';
$xmlProduct .= '<ean>'.$s['ean13'].'</ean>';
$xmlProduct .= '</size>';
}
}
$xmlProduct .= '</size_list>';
return $xmlProduct;
}
protected function calculateAffiliatePrices(
$salePrice = 0,
$basePrice = 0,
$shippingPrice = 0,
$priceWithoutDiscount = 0,
$wholesalePrice = 0,
$affiliate = [],
$product
) {
if (empty($salePrice)) {
return $this->getPriceFormat('0.00');
}
if (empty($affiliate['affiliate_formula'])) {
return $this->getPriceFormat('0.00');
}
$formula = $affiliate['affiliate_formula'];
if (!empty($affiliate['category_id_list'])) {
$affiliateCategoryList = explode(',', $affiliate['category_id_list']);
if (!empty($affiliate['category_type'])) {
$productAllCategories = $this->getProductCategories($product->id, $this->langId, $product->id_category_default, true);
$productAllCategories = !empty($productAllCategories) ? explode(',', $productAllCategories) : [];
$hasCategory = array_intersect($affiliateCategoryList, $productAllCategories);
if (empty($hasCategory)) {
return $this->getPriceFormat($salePrice);
}
} else {
if (!in_array($product->id_category_default, $affiliateCategoryList)) {
return $this->getPriceFormat($salePrice);
}
}
}
list($shippingPrice) = explode(' ', $shippingPrice);
$formula = str_replace('wholesale_price', $wholesalePrice, $formula);
$formula = str_replace('price_without_discount', $priceWithoutDiscount, $formula);
$formula = str_replace('base_price', $basePrice, $formula);
$formula = str_replace('sale_price', $salePrice, $formula);
$formula = str_replace('shipping_price', $shippingPrice, $formula);
$formula = str_replace('tax_price', ($salePrice - $basePrice), $formula);
$formula = str_replace('price_sale', $salePrice, $formula);
$formula = str_replace('price', $salePrice, $formula);
$parser = new FormulaParser($formula);
return $this->getPriceFormat(number_format($parser->getResultValue(), 2, '.', ''));
}
public function isExcludeByMinimumOrderQuantity($quantity = 0)
{
$from = (int)$this->settings['exclude_minimum_order_qty_from'];
$to = (int)$this->settings['exclude_minimum_order_qty_to'];
if (empty($from) && empty($to)) {
return false;
}
if ($quantity >= $from && $quantity <= $to) {
return true;
}
if ($quantity >= $from && empty($to)) {
return true;
}
if ($quantity <= $to && empty($from)) {
return true;
}
return false;
}
public function isEnabledField($feedId, $name, $table)
{
return (int)Db::getInstance()->getValue('SELECT f.status
FROM '._DB_PREFIX_.'blmod_xml_fields f
WHERE f.category = '.(int)$feedId.' AND f.name = "'.htmlspecialchars($name, ENT_QUOTES).'" AND f.table = "'.htmlspecialchars($table, ENT_QUOTES).'"');
}
public function getTaxRation($product_class, $address, $context)
{
/*
$tax_manager = TaxManagerFactory::getManager($address, Product::getIdTaxRulesGroupByIdProduct((int) $product_class->id, $context));
$product_tax_calculator = $tax_manager->getTaxCalculator();
return $product_tax_calculator->getTotalRate();
*/
return $this->getProductTax($product_class->id_tax_rules_group);
}
protected function getAvailabilityDate($availability)
{
if (empty($this->settings['is_enabled_field']['available_for_order']) ||
$this->settings['feed_mode_final'] != 'g' ||
!in_array($availability, ['preorder', 'backorder', 'on demand',])) {
return '';
}
return '<g:availability_date>'.date('Y-m-d H:i:s', strtotime('+7days')).'T12:00-0800</g:availability_date>';
}
protected function getRelatedProducts($productId)
{
return Db::getInstance()->ExecuteS('SELECT a.id_product_2
FROM '._DB_PREFIX_.'accessory a
WHERE a.id_product_1 = '.(int)$productId);
}
protected function addVariants($xmlProduct, $product_class, $isAvailableWhenOutOfStock, $availabilityName)
{
if (empty($this->settings['skroutz_variant_size'])) {
return $xmlProduct;
}
$link = new Link();
$feedPrice = new FeedPrice();
$productCombination = new ProductCombinations();
$combinations = $productCombination->getCombinations($product_class, $this->langId);
$sizeList = [];
if (empty($combinations)) {
return $xmlProduct;
}
if (!empty($this->groupedAttributesByParent['childValues']) && !empty($this->groupedAttributesByParent['parentName'])) {
foreach ($this->groupedAttributesByParent['childValues'][$this->groupedAttributesByParent['parentName']] as $a) {
$groupedAttributes = $a;
break;
}
}
if (empty($groupedAttributes)) {
foreach ($combinations as $c) {
if ($c['quantity'] < 1 && !empty($this->settings['only_in_stock'])) {
continue;
}
$sizeName = '';
foreach ($this->productAttributes as $a) {
if ($c['id_product_attribute'] == $a['id_product_attribute'] && $a['id_attribute_group'] == $this->settings['skroutz_variant_size']) {
$sizeName = !empty($this->attributeMapValues[$this->settings['skroutz_variant_size'] . '-' . $a['id_attribute']]) ? $this->attributeMapValues[$this->settings['skroutz_variant_size'] . '-' . $a['id_attribute']] : $a['attribute_name'];
break 1;
}
}
if (empty($sizeList[$sizeName])) {
$sizeList[$sizeName] = [
'id_product_attribute' => $c['id_product_attribute'],
'size_name' => $sizeName,
'size_quantity' => $c['quantity'],
'size_reference' => $c['reference'],
'mpn' => $c['mpn'],
'ean13' => !empty($c['ean13']) ? $c['ean13'] : '',
];
} else {
$sizeList[$sizeName]['size_quantity'] += $c['quantity'];
}
}
} else {
foreach ($this->productAttributes as $aParent) {
if ($aParent['id_attribute_group'] == $this->settings['merge_attributes_parent']) {
foreach ($this->productAttributes as $aChild) {
if ($aChild['quantity'] < 1 && !empty($this->settings['only_in_stock'])) {
continue;
}
if ($aParent['attribute_name'] != $this->groupedAttributesByParent['parentName']) {
continue;
}
if ($aParent['id_attribute_group'] == $aChild['id_attribute_group'] || !in_array($aChild['attribute_name'], $groupedAttributes)) {
continue;
}
if ($aParent['id_product_attribute'] == $aChild['id_product_attribute']) {
$aChild['size_name'] = $aChild['attribute_name'];
$aChild['size_quantity'] = $aChild['quantity'];
$aChild['size_reference'] = $aChild['reference'];
$sizeList[] = $aChild;
}
}
}
}
}
$xmlProduct .= '<variations>';
if (!empty($sizeList)) {
foreach ($sizeList as $s) {
$extraUrl = !empty($this->extraFieldByName['product_url_utm_blmod']) ? htmlspecialchars_decode($this->extraFieldByName['product_url_utm_blmod'], ENT_QUOTES) : '';
$url = $link->getProductLink($product_class, null, null, null, $this->langId, null, $s['id_product_attribute'], Configuration::get('PS_REWRITING_SETTINGS'), false, true).$extraUrl;
$salePrice = $feedPrice->getEditedPrice($product_class->getPriceStatic($product_class->id, true, $s['id_product_attribute'], (empty($this->settings['price_rounding_type']) ? 6 : 2)), 'sale_blmod', $this->settings);
$combinationAvailability = $availabilityName['out'];
if ($product_class->available_for_order == 1 || $product_class->online_only == 1) {
if ($s['size_quantity'] > 0) {
$combinationAvailability = $availabilityName['in'];
} else {
if ($isAvailableWhenOutOfStock) {
$combinationAvailability = !empty($availabilityName['on_demand']) ? $availabilityName['on_demand'] : $availabilityName['in'];
}
}
}
$xmlProduct .= '<variation>';
$xmlProduct .= '<variationid>'.(!empty($this->settings['product_id_prefix']) ? $this->settings['product_id_prefix'] : '').$product_class->id.'-'.$s['id_product_attribute'].'</variationid>';
$xmlProduct .= '<link>'.$this->settings['pref_s'].$url.$this->settings['pref_e'].'</link>';
$xmlProduct .= '<availability>'.$combinationAvailability.'</availability>';
$xmlProduct .= '<manufacturersku>'.$s['mpn'].'</manufacturersku>';
$xmlProduct .= '<ean>'.$s['ean13'].'</ean>';
$xmlProduct .= '<price_with_vat>'.$this->getPriceFormat($salePrice).'</price_with_vat>';
$xmlProduct .= '<size>'.$s['size_name'].'</size>';
$xmlProduct .= '<quantity>'.$s['size_quantity'].'</quantity>';
$xmlProduct .= '</variation>';
}
}
$xmlProduct .= '</variations>';
return $xmlProduct;
}
protected function getVirtualProductsByProductId($productId)
{
return Db::getInstance()->ExecuteS('SELECT d.*
FROM '._DB_PREFIX_.'product_download d
WHERE d.id_product = "'.(int)$productId.'"
ORDER BY d.id_product_download ASC');
}
}