first commit

This commit is contained in:
2025-01-06 20:47:25 +01:00
commit 3bdbd78c2f
25591 changed files with 3586440 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class AccessLog
{
public static function save($feedId, $action, $sessionId, $isCron = 0, $getParam = [], $argParam = [])
{
Db::getInstance()->Execute('
INSERT INTO '._DB_PREFIX_.'blmod_xml_access_log
(`feed_id`, `is_cron`, `action`, session_id, get_param, argv_param, created_at)
VALUES
("'.(int)$feedId.'", "'.(int)$isCron.'", "'.pSQL($action).'", "'.pSQL($sessionId).'", "'.pSQL(serialize($getParam)).'", "'.pSQL(serialize($argParam)).'", "'.pSQL(date('Y-m-d H:i:s')).'")
');
}
public static function deleteOld()
{
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_access_log WHERE created_at < "'.XmlFeedsTools::dateMinusDays(180).'"');
}
}

View File

@@ -0,0 +1,60 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class AccessLogAdmin extends Xmlfeeds
{
const LIMIT = 200;
private $pageId = 0;
/**
* @param int $pageId
*/
public function setPageId($pageId)
{
$this->pageId = $pageId;
}
/**
* @return int
*/
public function getPageId()
{
return $this->pageId;
}
public function getContent()
{
return array(
'limit' => self::LIMIT,
'logs' => $this->getByFeedId($this->getPageId()),
);
}
public function getByFeedId($feedId)
{
$result = Db::getInstance()->executeS('SELECT l.*
FROM '._DB_PREFIX_.'blmod_xml_access_log l
WHERE l.feed_id = "'.(int)$feedId.'"
ORDER BY l.id DESC
LIMIT '.(int)self::LIMIT);
return $result;
}
}

View File

@@ -0,0 +1,87 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class AvailabilityLabel
{
protected $settings = [];
protected $isAvailableWhenOutOfStock = false;
/**
* @param array $settings
*/
public function setSettings(array $settings)
{
$this->settings = $settings;
}
/**
* @return array
*/
public function getSettings()
{
return $this->settings;
}
/**
* @param bool $isAvailableWhenOutOfStock
*/
public function setIsAvailableWhenOutOfStock($isAvailableWhenOutOfStock)
{
$this->isAvailableWhenOutOfStock = $isAvailableWhenOutOfStock;
}
/**
* @return bool
*/
public function isAvailableWhenOutOfStock()
{
return $this->isAvailableWhenOutOfStock;
}
public function getStatus($product, $productQty)
{
$settings = $this->getSettings();
$inStock = !empty($settings['label_in_stock_text']) ? $settings['label_in_stock_text'] : $product->available_now;
$inStock = !empty($inStock) ? $inStock : $settings['configurationLang']['PS_LABEL_IN_STOCK_PRODUCTS'];
$outOfStockAllowed = !empty($settings['label_out_of_stock_text']) ? $settings['label_out_of_stock_text'] : $product->available_later;
$outOfStockAllowed = !empty($outOfStockAllowed) ? $outOfStockAllowed : $settings['configurationLang']['PS_LABEL_OOS_PRODUCTS_BOA'];
$outOfStockDenied = !empty($settings['label_on_demand_stock_text']) ? $settings['label_on_demand_stock_text'] : $settings['configurationLang']['PS_LABEL_OOS_PRODUCTS_BOD'];
if ($product->available_for_order != 1 && $product->online_only != 1) {
return $outOfStockDenied;
}
if ($productQty > 0) {
return $inStock;
}
if ($productQty == 0 && $this->isAvailableWhenOutOfStock()) {
return $outOfStockAllowed;
}
if ($productQty == 0 && !$this->isAvailableWhenOutOfStock()) {
return $outOfStockDenied;
}
return '';
}
}

View File

@@ -0,0 +1,135 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class CategoryMap
{
private $errors = [];
public function saveMapFile()
{
$this->errors = [];
$title = Tools::getValue('category_map_name');
if (empty($_FILES['map_file']['name']) || empty($title)) {
$this->errors[] = 'Empty file or title';
return false;
}
if ($_FILES['map_file']['type'] != 'text/plain') {
$this->errors[] = 'Invalid file format, should be .txt';
return false;
}
if (empty($_FILES['map_file']['size'])) {
$this->errors[] = 'File is empty';
return false;
}
$extension = strtolower(pathinfo($_FILES['map_file']['name'], PATHINFO_EXTENSION));
if ($extension != 'txt') {
$this->errors[] = 'Invalid file format, should be .txt';
return false;
}
if (Tools::getOctets(ini_get('upload_max_filesize')) <= $_FILES['map_file']['size']) {
$this->errors[] = 'File to big, max size '.ini_get('upload_max_filesize');
return false;
}
$name = ($this->getLastMapId()+1).'_'.$this->sanitizeName($_FILES['map_file']['name']);
if (!move_uploaded_file($_FILES['map_file']['tmp_name'], $this->getFilePath($name))) {
$this->errors[] = 'System error, please check "/modules/xmlfeeds/ga_categories" directory permissions';
return false;
}
Db::getInstance()->insert(
'blmod_xml_category_map',
array(
'title' => pSQL($title),
'file_name' => pSQL($name),
)
);
return true;
}
public function getErrors()
{
return $this->errors;
}
public function delete($id)
{
if (empty($id)) {
return false;
}
$fileName = $this->getFileNameById($id);
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_category_map WHERE id = "'.(int)$id.'"');
if (empty($fileName)) {
return false;
}
unlink($this->getFilePath($fileName));
return true;
}
public function getFilePath($name = '')
{
return dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ga_categories' . DIRECTORY_SEPARATOR . $name;
}
public function sanitizeName($name)
{
return Tools::strtolower(htmlspecialchars(preg_replace('/[^a-zA-Z0-9_.-]/', '_', $name)));
}
public function getLastMapId()
{
return (int)Db::getInstance()->getValue('SELECT m.id
FROM '._DB_PREFIX_.'blmod_xml_category_map m
ORDER BY m.id DESC');
}
public function getList()
{
return Db::getInstance()->ExecuteS('SELECT m.id, m.title, m.file_name
FROM '._DB_PREFIX_.'blmod_xml_category_map m
ORDER BY m.title ASC');
}
public function getFileNameById($id)
{
return Db::getInstance()->getValue('SELECT m.file_name
FROM '._DB_PREFIX_.'blmod_xml_category_map m
WHERE m.id = "'.(int)$id.'"');
}
public function getIdByKey($key)
{
return Db::getInstance()->getValue('SELECT m.id
FROM '._DB_PREFIX_.'blmod_xml_category_map m
WHERE m.`key` = "'.pSQL($key).'"');
}
}

View File

@@ -0,0 +1,254 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class CategoryTreeGenerator
{
private $htmlCategory = '';
private $recurseDone = [];
private $isGoogle = false;
private $isGender = false;
private $genderValues = [];
protected $context;
protected $shotLang = 0;
protected $moduleImgPath = '';
protected $googleCategoriesMap = [];
protected $feedId = 0;
/**
* @param mixed $context
*/
public function setContext($context)
{
$this->context = $context;
}
/**
* @param int $shotLang
*/
public function setShotLang($shotLang)
{
$this->shotLang = $shotLang;
}
/**
* @param string $moduleImgPath
*/
public function setModuleImgPath($moduleImgPath)
{
$this->moduleImgPath = $moduleImgPath;
}
/**
* @param array $googleCategoriesMap
*/
public function setGoogleCategoriesMap($googleCategoriesMap)
{
$this->googleCategoriesMap = $googleCategoriesMap;
}
/**
* @param int $feedId
*/
public function setFeedId($feedId)
{
$this->feedId = $feedId;
}
public function save($feedId, $genderCategories)
{
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_gender_map WHERE feed_id = '.(int)$feedId);
if (empty($genderCategories)) {
return true;
}
foreach ($genderCategories as $cateogyrId => $name) {
if (empty($name)) {
continue;
}
Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'blmod_xml_gender_map
(`feed_id`, `category_id`, `name`)
VALUE
("'.(int)$feedId.'", "'.(int)$cateogyrId.'", "'.pSQL($name).'")');
}
return true;
}
public function get($feedId)
{
$categories = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'blmod_xml_gender_map WHERE feed_id = '.(int)$feedId);
$values = [];
foreach ($categories as $c) {
$values[$c['category_id']] = $c['name'];
}
return $values;
}
public function categoriesTree($selected = false, $isGoogleCat = false, $checkboxName = 'categoryBox', $isGender = false)
{
$this->isGoogle = $isGoogleCat;
$this->isGender = $isGender;
$this->recurseDone = [];
$langId = !empty($this->shopLang) ? $this->shopLang : $this->context->language->id;
if (!empty($selected)) {
$sel_array = explode(',', $selected);
} else {
$sel_array = [];
}
$margin = 'margin-right: 9px;';
$border = '';
$checkDelBoxes = "checkDelBoxes(this.form, '".$checkboxName."[]', this.checked)";
$hideMessage = '<div class="categories_list_button" style="cursor: pointer; color: #268CCD; text-align: left; margin-top: 10px;">'.$this->l('[Hide]').'</div>';
$selectBox = '<th><input type="checkbox" name="checkme" class="noborder" onclick="'.$checkDelBoxes.'"></th>';
$this->htmlCategory = '';
if ($this->isGoogle || $this->isGender) {
$margin = '';
$border = 'border: 0px; margin-top: 6px;';
$hideMessage = '';
$selectBox = '';
}
if ($this->isGender) {
$this->genderValues = $this->get($this->feedId);
}
$this->htmlCategory .= '<div style = "'.$margin.'">
<table cellspacing="0" cellpadding="0" class="table blmod-table-light table-no-space" id="radio_div" style="'.$border.'">
<tr>
'.$selectBox.'
<th>'.$this->l('ID').'</th>
<th style="width: 400px">'.$this->l('Name').'</th>
</tr>';
$categories = Category::getCategories($langId, false);
if (!empty($categories)) {
$categories[0][1] = isset($categories[0][1]) ? $categories[0][1] : false;
$this->recurseCategoryForIncludePref(null, $categories, $categories[0][1], 1, null, $sel_array, $checkboxName);
}
$this->htmlCategory .= '</table>
'.$hideMessage.'
</div>';
return $this->htmlCategory;
}
protected function recurseCategoryForIncludePref($indexedCategories, $categories, $current, $id_category = 1, $id_category_default = null, $selected = array(), $checkboxName = 'categoryBox')
{
$img_type = 'png';
static $irow;
if (!isset($this->recurseDone[$current['infos']['id_parent']])) {
$this->recurseDone[$current['infos']['id_parent']] = 0;
}
$this->recurseDone[$current['infos']['id_parent']] += 1;
$categories[$current['infos']['id_parent']] = isset($categories[$current['infos']['id_parent']]) ? $categories[$current['infos']['id_parent']] : false;
$todo = count($categories[$current['infos']['id_parent']]);
$doneC = $this->recurseDone[$current['infos']['id_parent']];
$level = $current['infos']['level_depth'] + 1;
$img = $level == 1 ? 'lv1.'.$img_type : 'lv'.$level.'_'.($todo == $doneC ? 'f' : 'b').'.'.$img_type;
$levelImg = '<img src="'.$this->moduleImgPath.''.$img.'" alt="" />';
if ($level > 5) {
$levelSpace = (($level - 2) * 24) - 12;
$levelImg = '<div class="category-level" style="width: '.$levelSpace.'px;"><br></div>';
$levelImg .= '<div class="category-level-'.($todo == $doneC ? 'f' : 'b').'"><br></div>';
}
$checked = false;
if (in_array($id_category, $selected)) {
$checked = 'checked="yes"';
}
$selectBox = '<td class="center">
<input type="checkbox" id="'.$checkboxName.'_'.$id_category.'" name="'.$checkboxName.'[]" '.$checked.' value="'.$id_category.'" class="noborder">
</td>';
$selectBoxW = '';
$inputField = '';
if ($this->isGoogle) {
$selectBox = '';
$selectBoxW = 'width: 25px;';
$googleCatValue = '';
if (!empty($this->googleCategoriesMap[$id_category])) {
$googleCatValue = $this->googleCategoriesMap[$id_category]['name'];
}
$inputField = '
<div><input type="text" placeholder="'.$this->l('Enter category name').'" id="google_cat_map_'.$id_category.'" class="google_cat_map_blmod" name="google_cat_map['.$id_category.']" value="'.$googleCatValue.'"></div>
<div style="clear: both;"></div>';
}
if ($this->isGender) {
$selectBox = '';
$selectBoxW = 'width: 25px;';
$inputField = '
<div><input type="text" placeholder="'.$this->l('Enter gender').'" name="gender_category['.$id_category.']" value="'.(!empty($this->genderValues[$id_category]) ? htmlspecialchars($this->genderValues[$id_category], ENT_QUOTES) : '').'"></div>
<div style="clear: both;"></div>';
}
$this->htmlCategory .= '<tr class="'.($irow++ % 2 ? 'alt_row' : '').'">
'.$selectBox.'
<td style="'.$selectBoxW.'">
'.$id_category.'
</td>
<td>
<div style="float: left;">'.$levelImg.'</div>
<div style="float: left;">
<label style="line-height: 26px;" for="'.$checkboxName.'_'.$id_category.'" class="t">'.Tools::stripslashes($current['infos']['name']).'</label>
</div>
<div style="clear: both;"></div>
'.$inputField.'
</td>
</tr>';
if (isset($categories[$id_category])) {
foreach ($categories[$id_category] as $key => $row) {
if ($key != 'infos') {
$this->recurseCategoryForIncludePref($indexedCategories, $categories, $categories[$id_category][$key], $key, null, $selected, $checkboxName);
}
}
}
}
protected function l($string)
{
return $string;
}
}

View File

@@ -0,0 +1,145 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class Compressor
{
const ZIP = 1;
const GZ = 2;
const GZIP = 3;
protected $settings = [];
/**
* @param array $settings
*/
public function setSettings($settings)
{
$this->settings = $settings;
}
public function getCompressorName($typeId)
{
$list = [
self::ZIP => 'ZIP',
self::GZ => 'GZ',
self::GZIP => 'GZIP',
];
return !empty($list[$typeId]) ? $list[$typeId] : '';
}
public function compress($xmlFileName = '', $fromString = '')
{
if (empty($this->settings['zip_file_name']) || empty($this->settings['compressor_type'])) {
return false;
}
if (empty($xmlFileName) && empty($fromString)) {
return false;
}
$methods = [
self::ZIP => 'createZipFile',
self::GZ => 'createGZipFile',
self::GZIP => 'createGZipFile',
];
$name = $methods[$this->settings['compressor_type']];
if (empty($name)) {
return false;
}
return $this->$name($xmlFileName, $fromString);
}
public function createGZipFile($xmlFileName = '', $fromString = '', $level = 9)
{
$filename = $this->settings['zip_file_name'].'.xml.'.($this->settings['compressor_type'] == self::GZIP ? 'gzip' : 'gz');
$path = _PS_ROOT_DIR_.'/modules/xmlfeeds/xml_files/';
$tempFileName = 'temp_blmod_rand_'.$this->settings['zip_file_name'].'.xml';
if (!empty($fromString)) {
$this->removeFile($path.$tempFileName);
file_put_contents($path.$tempFileName, $fromString);
$xmlFileName = $tempFileName;
}
$this->removeFile($path.$filename);
if ($fp_out = gzopen($path.$filename, 'wb'.$level)) {
if ($fp_in = fopen($path . $xmlFileName,'rb')) {
while (!feof($fp_in)) {
gzwrite($fp_out, fread($fp_in, 1024 * 512));
}
fclose($fp_in);
} else {
return false;
}
gzclose($fp_out);
} else {
return false;
}
$this->removeFile($path.$tempFileName);
return true;
}
public function createZipFile($xmlFileName = '', $fromString = '')
{
$filename = $this->settings['zip_file_name'].'.zip';
$path = _PS_ROOT_DIR_.'/modules/xmlfeeds/xml_files/';
$this->removeFile($path.$filename);
$zip = new ZipArchive();
if ($zip->open($path.$filename, ZipArchive::CREATE ) === true) {
if (empty($fromString)) {
$zip->addFile($path.$xmlFileName, $this->settings['zip_file_name'].'.xml');
} else {
$zip->addFromString($this->settings['zip_file_name'].'.xml', $fromString);
}
$zip->close();
}
}
public function getExtensionByType($type)
{
$extensions = [
self::ZIP => 'zip',
self::GZ => 'gz',
self::GZIP => 'gzip',
];
return !empty($extensions[$type]) ? $extensions[$type] : '';
}
protected function removeFile($path)
{
if (file_exists($path)) {
unlink($path);
}
}
}

View File

@@ -0,0 +1,76 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class DatabaseTableConnector
{
const KEY = 'BLMOD_XML_FEED_CUSTOM_FIELDS';
public function save($feedId)
{
$customFieldsFromDatabase = $this->getAllValues();
if (empty($customFieldsFromDatabase)) {
$customFieldsFromDatabase = [];
}
$customFieldsFromDatabase[$feedId]['name'] = Tools::getValue('custom_field_name');
$customFieldsFromDatabase[$feedId]['column_connector'] = Tools::getValue('table_column_connector');
$customFieldsFromDatabase[$feedId]['column_value'] = Tools::getValue('table_column_value');
Configuration::updateValue(self::KEY, htmlspecialchars(json_encode($customFieldsFromDatabase), ENT_QUOTES));
}
public function get($feedId)
{
$value = $this->getAllValues();
if (empty($value[$feedId])) {
return [
'name' => [
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
],
'column_connector' => [
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
],
'column_value' => [
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
],
];
}
return $value[$feedId];
}
protected function getAllValues()
{
return json_decode(htmlspecialchars_decode(Configuration::get(self::KEY)), true);;
}
}

View File

@@ -0,0 +1,124 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class FeedMeta
{
public function save($feedId)
{
$feedMeta = $this->getFeedMeta($feedId);
$fields = $this->getFeedMetaFields();
foreach ($fields as $mField) {
$feedMeta[$feedId][$mField] = Tools::getValue($mField, '');
}
Configuration::updateValue('BLMOD_XML_FEED_META', htmlspecialchars(json_encode($feedMeta), ENT_QUOTES));
}
public function saveFromArray($feedId, $data)
{
$feedMeta = $this->getFeedMeta($feedId);
$fields = $this->getFeedMetaFields();
foreach ($fields as $mField) {
$feedMeta[$feedId][$mField] = isset($data[$mField]) ? $data[$mField] : '';
}
Configuration::updateValue('BLMOD_XML_FEED_META', htmlspecialchars(json_encode($feedMeta), ENT_QUOTES));
}
public function getFeedMeta($feedId)
{
$meta = json_decode(htmlspecialchars_decode(Configuration::get('BLMOD_XML_FEED_META')), true);
$fields = $this->getFeedMetaFields();
if (empty($meta[$feedId])) {
foreach ($fields as $mField) {
$meta[$feedId][$mField] = '';
}
return $meta;
}
foreach ($fields as $mField) {
$meta[$feedId][$mField] = !empty($meta[$feedId][$mField]) ? $meta[$feedId][$mField] : '';
}
return $meta;
}
public function duplicateValues($feedIdOld, $feedIdNew)
{
$feedMeta = $this->getFeedMeta($feedIdOld);
$feedMeta[$feedIdNew] = [];
$feedMeta[$feedIdNew] = $feedMeta[$feedIdOld];
Configuration::updateValue('BLMOD_XML_FEED_META', htmlspecialchars(json_encode($feedMeta), ENT_QUOTES));
}
public function getFeedMetaFields()
{
return [
'vivino_bottle_size',
'vivino_lot_size',
'shipping_price_mode',
'spartoo_size',
'vivino_bottle_size_default',
'vivino_lot_size_default',
'last_modified_header',
'skroutz_analytics_id',
'edit_price_type',
'edit_price_value',
'filter_visibility',
'product_id_prefix',
'item_starts_on_a_new_line',
'is_htmlspecialchars',
'category_tree_separator',
'exclude_minimum_order_qty_from',
'exclude_minimum_order_qty_to',
'affiliate',
'price_rounding_type',
'product_id_with_zero',
'empty_description',
'empty_description_text',
'title_transform',
'title_length',
'ean_prefix',
'reference_prefix',
'gender_field_category_status',
'gender_field_category_name',
'gender_field_category_prime_value',
'filter_created_before_days',
'create_zip_file',
'zip_file_name',
'compressor_type',
'category_tree_type',
'max_quantity',
'max_quantity_status',
'skroutz_variant_size',
'attribute_id_as_combination_id',
'unit_price_without_unit',
'shipping_countries',
'shipping_countries_status',
'label_in_stock_text',
'label_out_of_stock_text',
'worten_ship_from_country',
];
}
}

View File

@@ -0,0 +1,92 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class FeedPrice
{
public function getEditedPrice($priceValue, $priceName, $settings)
{
$editSettings = $this->getEditSettings($priceName, $settings);
if (empty($editSettings['value'])) {
return $priceValue;
}
return $this->editPriceAction($priceValue, $editSettings['type'], $editSettings['value']);
}
protected function getEditSettings($priceName, $settings)
{
$nameMap = [
'product_price' => 'price+product',
'sale_blmod' => 'price_sale_blmod+bl_extra',
'product_wholesale_price' => 'wholesale_price+product',
'shipping_price' => 'price_shipping_blmod+bl_extra',
'price_wt_discount_blmod' => 'price_wt_discount_blmod+bl_extra',
'sale_tax_excl_blmod' => 'price_sale_tax_excl_blmod+bl_extra',
];
if (empty($nameMap[$priceName])) {
return [
'type' => '',
'value' => 0,
];
}
$priceName = $nameMap[$priceName];
if (empty($settings['edit_price_type']) || empty($settings['edit_price_value'])) {
return [
'type' => '',
'value' => 0,
];
}
if (!empty($settings['edit_price_type'][$priceName]) && !empty($settings['edit_price_value'][$priceName])) {
return [
'type' => (int)$settings['edit_price_type'][$priceName],
'value' => $settings['edit_price_value'][$priceName],
];
}
return [
'type' => '',
'value' => 0,
];
}
protected function editPriceAction($price, $type, $value)
{
switch ($type) {
case 1:
return $price + $value;
case 2:
return $price - $value;
case 3:
return $price * $value;
case 4:
return $price / $value;
case 5:
return $price * (1 + $value / 100);
case 6:
return $price * (1 - $value / 100);
}
return $price;
}
}

View File

@@ -0,0 +1,203 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class FeedSettingsAdmin extends Xmlfeeds
{
protected $langId = 1;
public function __construct($langId = 1)
{
parent::__construct();
$this->langId = $langId;
}
public function getFilterDateTypes()
{
return array(
OrderSettings::FILTER_DATE_NONE => 'None',
OrderSettings::FILTER_DATE_TODAY => 'Today',
OrderSettings::FILTER_DATE_YESTERDAY=> 'Yesterday',
OrderSettings::FILTER_DATE_THIS_WEEK => 'Current week',
OrderSettings::FILTER_DATE_THIS_MONTH => 'Current month',
OrderSettings::FILTER_DATE_THIS_YEAR => 'Current year',
OrderSettings::FILTER_DATE_CUSTOM_DAYS => 'Custom days',
OrderSettings::FILTER_DATE_DATE_RANGE => 'Date range',
);
}
public function manufacturersList($active = false)
{
$class = 'ManufacturerCore';
if (!class_exists('ManufacturerCore', false)) {
$class = 'Manufacturer';
}
$manufacturers = $class::getManufacturers();
$this->smarty->assign([
'manufacturers' => $manufacturers,
'activeList' => explode(',', $active),
]);
return $this->displaySmarty('views/templates/admin/element/manufacturerList.tpl');
}
public function supplierList($active = false)
{
$class = 'SupplierCore';
if (!class_exists('SupplierCore', false)) {
$class = 'Supplier';
}
$supplier = $class::getSuppliers();
$this->smarty->assign([
'suppliers' => $supplier,
'activeList' => explode(',', $active),
]);
return $this->displaySmarty('views/templates/admin/element/supplierList.tpl');
}
public function getOrderStatusList($active = '')
{
$states = Db::getInstance()->ExecuteS(
'SELECT sl.id_order_state, sl.name, s.color
FROM '._DB_PREFIX_.'order_state_lang sl
LEFT JOIN '._DB_PREFIX_.'order_state s ON
s.id_order_state = sl.id_order_state
WHERE sl.id_lang = "'.(int)$this->langId.'"
ORDER BY sl.name ASC'
);
if (empty($states)) {
return '';
}
$this->smarty->assign([
'states' => $states,
'activeList' => explode(',', $active),
]);
return $this->displaySmarty('views/templates/admin/element/orderStatusList.tpl');
}
public function getOrderPaymentsList($active = '')
{
$paymentModules = Db::getInstance()->ExecuteS(
'SELECT DISTINCT m.`name`
FROM '._DB_PREFIX_.'module m
LEFT JOIN '._DB_PREFIX_.'hook_module hm ON
hm.`id_module` = m.`id_module`
LEFT JOIN `'._DB_PREFIX_.'hook` h ON
hm.`id_hook` = h.`id_hook`
WHERE (h.`name` = "paymentOptions" OR h.`name` = "Payment")
ORDER BY m.`name` DESC'
);
$paymentModulesFromOrders = Db::getInstance()->ExecuteS(
'SELECT o.`module` AS `name`, o.`payment` AS displayName
FROM '._DB_PREFIX_.'orders o
GROUP BY o.`module`
ORDER BY o.`payment` DESC'
);
if (empty($paymentModules) && empty($paymentModulesFromOrders)) {
return '';
}
if (!empty($paymentModules)) {
foreach ($paymentModules as $id => $p) {
$paymentModules[$id]['displayName'] = str_replace('ps_', '', $p['name']);
try {
$paymentModules[$id]['displayName'] = Module::getModuleName($p['name']);
} catch (Exception $e) {
}
}
}
if (!empty($paymentModulesFromOrders)) {
foreach ($paymentModulesFromOrders as $p) {
foreach ($paymentModules as $pm) {
if ($p['name'] == $pm['name']) {
continue 2;
}
}
$paymentModules[] = $p;
}
}
$this->smarty->assign([
'paymentModules' => $paymentModules,
'activeList' => explode(',', $active),
]);
return $this->displaySmarty('views/templates/admin/element/orderPaymentsList.tpl');
}
public function getFilterAttributesHtml($s, $isWithout = false)
{
if (empty($s['feed_type'])) {
return '';
}
$container = 'div';
$label = 'label';
$styleC = 'class';
$input = 'input';
$onlyWithAttributesHtml = '';
$groups = AttributeGroupCore::getAttributesGroups($this->langId);
$onlyWithAttributesActive = explode(',', $s['only_with_attributes']);
$onlyWithoutAttributesActive = explode(',', $s['only_without_attributes']);
foreach ($groups as $g) {
$attributes = AttributeGroupCore::getAttributes($this->langId, $g['id_attribute_group']);
$onlyWithAttributesHtml .= '<'.$container.' '.$styleC.'="blmod_mb10"><'.$container.' '.$styleC.'="attribute-group-title">'.$g['name'].'</div>';
if (empty($attributes)) {
continue;
}
foreach ($attributes as $a) {
if (empty($a['id_attribute'])) {
continue;
}
$onlyWithAttributesHtml .= '<'.$label.' '.$styleC.'="attribute-list"><'.$input.' type="checkbox" name="only_with_attributes[]" value="'.$a['id_attribute'].'" ';
$onlyWithAttributesHtml .= (in_array($a['id_attribute'], $onlyWithAttributesActive) ? 'BLMOD_CHECKED_WITH_' : '');
$onlyWithAttributesHtml .= (in_array($a['id_attribute'], $onlyWithoutAttributesActive) ? 'BLMOD_CHECKED_WITHOUT_' : '');
$onlyWithAttributesHtml .= '/> '.$a['name'].'</'.$label.'>';
}
$onlyWithAttributesHtml .= '<'.$container.' '.$styleC.'="blmod_cb"></'.$container.'></'.$container.'>';
}
$onlyWithoutAttributesHtml = str_replace('only_with_attributes[]', 'only_without_attributes[]', $onlyWithAttributesHtml);
if ($isWithout) {
return str_replace('BLMOD_CHECKED_WITHOUT_', 'checked', str_replace('BLMOD_CHECKED_WITH_', '', $onlyWithoutAttributesHtml));
}
return str_replace('BLMOD_CHECKED_WITH_', 'checked', str_replace('BLMOD_CHECKED_WITHOUT_', '', $onlyWithAttributesHtml));
}
}

View File

@@ -0,0 +1,238 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class FeedShippingPrice
{
protected $langId = 0;
protected $multistoreId = 0;
protected $settings = [];
protected $configuration = [];
protected $countryData = [];
public function setData($langId, $settings, $configuration, $multistoreId)
{
$this->langId = $langId;
$this->settings = $settings;
$this->configuration = $configuration;
$this->multistoreId = $multistoreId;
}
public function loadCountries($carrierIdDefault)
{
$countries = $this->settings['shipping_countries'];
if (empty($countries) || empty($this->settings['shipping_countries_status'])) {
return false;
}
foreach ($countries as $countryId) {
$defaultCountry = new Country($countryId, $this->langId);
$idZone = $defaultCountry->id_zone;
if ($carrierIdDefault < 1) {
$carrierIdDefault = $this->getCarrierId($this->langId, $idZone);
}
$carrier = new Carrier($carrierIdDefault);
if (empty($carrier->active)) {
$carrierIdDefault = $this->getCarrierId($this->langId, $idZone);
$carrier = new Carrier($carrierIdDefault);
}
$address = new Address();
$address->id_country = $countryId;
$address->id_state = 0;
$address->postcode = 0;
$carrierTax = 0;
if (_PS_VERSION_ >= '1.5') {
$carrierTax = $carrier->getTaxCalculator($address)->getTotalRate();
} elseif (class_exists('TaxManagerFactory', false)) {
$tax_manager = TaxManagerFactory::getManager($address, $carrier->id_tax_rules_group);
$carrierTax = $tax_manager->getTaxCalculator()->getTotalRate();
}
$this->countryData[] = [
'defaultCountry' => $defaultCountry,
'carrierTax' => $carrierTax,
'carrier' => $carrier,
'address' => $address,
];
}
return true;
}
public function getPrice($product_class, $salePrice)
{
$prices = [];
foreach ($this->countryData as $c) {
$prices[$c['defaultCountry']->iso_code] = 0;
if (empty($this->settings['shipping_price_mode'])) {
$prices[$c['defaultCountry']->iso_code] = $this->getProductShippingCost($c['defaultCountry']->id_zone, $product_class, $this->configuration, $c['carrier'], $c['carrierTax'], $salePrice);
continue;
}
$prices[$c['defaultCountry']->iso_code] = $this->getCarriersBestPrice($this->langId, $c['defaultCountry']->id_zone, $product_class, $this->configuration, $c['address'], $salePrice, $this->multistoreId);
}
return $prices;
}
public function getProductShippingCost($idZone, $Product, $configuration, $carrier, $carrierTax, $salePrice)
{
if ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT) {
$shipping_cost = $carrier->getDeliveryPriceByWeight($Product->weight, $idZone);
} elseif ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_PRICE) {
$shipping_cost = $carrier->getDeliveryPriceByPrice($salePrice, $idZone);
} elseif ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_FREE) {
return '0.00';
}
$taxRation = 1 + ($carrierTax / 100);
$shipping_cost *= $taxRation;
$shipping_cost += $carrier->shipping_handling ? $configuration['PS_SHIPPING_HANDLING'] : 0;
$shipping_cost += $Product->additional_shipping_cost * $taxRation;
return $shipping_cost;
}
public function getCarriersBestPrice($id_lang, $id_zone, $product, $configuration, $address, $salePrice, $multistoreId)
{
$error = [];
$id_currency = Configuration::get('PS_CURRENCY_DEFAULT');
$multistoreId = !empty($multistoreId) ? $multistoreId : 1;
$query = new DbQuery();
$query->select('id_carrier');
$query->from('product_carrier', 'pc');
$query->innerJoin(
'carrier',
'c',
'c.id_reference = pc.id_carrier_reference AND c.deleted = 0 AND c.active = 1'
);
$query->where('pc.id_product = '.(int)$product->id);
$query->where('pc.id_shop = '.(int)$multistoreId);
$carriers_for_product = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
$carriersForProductColumn = array();
if (!empty($carriers_for_product)) {
foreach ($carriers_for_product as $f) {
$carriersForProductColumn[] = $f['id_carrier'];
}
}
$result = Carrier::getCarriers($id_lang, true, false, (int)$id_zone, array(Configuration::get('PS_UNIDENTIFIED_GROUP')), Carrier::PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE);
$results_array = array();
foreach ($result as $k => $row) {
if (!empty($carriersForProductColumn)) {
if (!in_array($row['id_carrier'], $carriersForProductColumn)) {
continue;
}
}
$carrier = new Carrier((int)$row['id_carrier']);
$shipping_method = $carrier->getShippingMethod();
if ($shipping_method != Carrier::SHIPPING_METHOD_FREE) {
// Get only carriers that are compliant with shipping method
if (($shipping_method == Carrier::SHIPPING_METHOD_WEIGHT && $carrier->getMaxDeliveryPriceByWeight($id_zone) === false)) {
$error[$carrier->id] = Carrier::SHIPPING_WEIGHT_EXCEPTION;
unset($result[$k]);
continue;
}
if (($shipping_method == Carrier::SHIPPING_METHOD_PRICE && $carrier->getMaxDeliveryPriceByPrice($id_zone) === false)) {
$error[$carrier->id] = Carrier::SHIPPING_PRICE_EXCEPTION;
unset($result[$k]);
continue;
}
// If out-of-range behavior carrier is set on "Desactivate carrier"
if ($row['range_behavior']) {
// Get only carriers that have a range compatible with cart
if ($shipping_method == Carrier::SHIPPING_METHOD_WEIGHT
&& (!Carrier::checkDeliveryPriceByWeight($row['id_carrier'], $product->weight, $id_zone))) {
$error[$carrier->id] = Carrier::SHIPPING_WEIGHT_EXCEPTION;
unset($result[$k]);
continue;
}
if ($shipping_method == Carrier::SHIPPING_METHOD_PRICE
&& (!Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $product->price, $id_zone, $id_currency))) {
$error[$carrier->id] = Carrier::SHIPPING_PRICE_EXCEPTION;
unset($result[$k]);
continue;
}
}
}
$carrierTax = 0;
if (_PS_VERSION_ >= '1.5') {
$carrierTax = $carrier->getTaxCalculator($address)->getTotalRate();
} elseif (class_exists('TaxManagerFactory', false)) {
$tax_manager = TaxManagerFactory::getManager($address, $carrier->id_tax_rules_group);
$carrierTax = $tax_manager->getTaxCalculator()->getTotalRate();
}
$row['price'] = (($shipping_method == Carrier::SHIPPING_METHOD_FREE) ? 0 : $this->getProductShippingCost($id_zone, $product, $configuration, $carrier, $carrierTax, $salePrice));
// If price is false, then the carrier is unavailable (carrier module)
if ($row['price'] === false || empty($row['price']) || $row['price'] < 0.0001) {
unset($result[$k]);
continue;
}
$results_array[] = $row;
}
// if we have to sort carriers by price
$prices = array();
if (Configuration::get('PS_CARRIER_DEFAULT_SORT') == Carrier::SORT_BY_PRICE) {
foreach ($results_array as $r) {
$prices[] = $r['price'];
}
if (Configuration::get('PS_CARRIER_DEFAULT_ORDER') == Carrier::SORT_BY_ASC) {
array_multisort($prices, SORT_ASC, SORT_NUMERIC, $results_array);
} else {
array_multisort($prices, SORT_DESC, SORT_NUMERIC, $results_array);
}
}
return !empty($results_array[0]) ? $results_array[0]['price'] : '0.00';
}
public function getCarrierId($id_lang, $idZone)
{
$carriers = Carrier::getCarriers($id_lang, true, false, $idZone, array(Configuration::get('PS_UNIDENTIFIED_GROUP')), Carrier::PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE);
if (!empty($carriers[0])) {
return $carriers[0]['id_carrier'];
}
return 0;
}
}

View File

@@ -0,0 +1,773 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class FeedType
{
public function getType($mode)
{
$types = $this->getAllTypes();
return $types[$mode];
}
public function getAllTypes()
{
return array(
'c' => array(
'name' => 'Individual',
'category_name' => '',
'country' => 'global',
),
'f' => array(
'name' => 'Facebook',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'g' => array(
'name' => 'Google',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'y' => array(
'name' => 'Yahoo',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
's' => array(
'name' => 'Skroutz',
'category_name' => '',
'country' => 'greece',
),
'bp' => array(
'name' => 'Bestprice',
'category_name' => 'Greece',
'country' => 'greece',
),
'i' => array(
'name' => 'microspot',
'category_name' => '',
'country' => 'switzerland',
),
'x' => array(
'name' => 'Xikixi',
'category_name' => '',
'country' => 'united kingdom, mexico, chile, colombia, ecuador, portugal, france, germany, italy, brazil, spain, canada',
),
'r' => array(
'name' => 'Fruugo',
'category_name' => 'fruugo',
'category_id' => '2',
'country' => 'global',
),
'h' => array(
'name' => 'Hansabay',
'category_name' => '',
'country' => 'estonia',
),
'm' => array(
'name' => 'Sitemap',
'category_name' => '',
'country' => 'global',
),
'a' => array(
'name' => 'Marktplaats',
'category_name' => 'marktplaats',
'category_id' => '8',
'country' => 'netherlands, belgium',
),
'o' => array(
'name' => 'Shoptet',
'category_name' => '',
'country' => 'czech',
),
'e' => array(
'name' => 'Beslist.nl',
'category_name' => 'beslist',
'category_id' => '1',
'country' => 'netherlands, belgium',
),
'p' => array(
'name' => 'Prisjakt',
'category_name' => 'google',
'category_id' => '4',
'country' => 'sweden, norway',
),
'pdk' => array(
'name' => 'Prisjagt',
'category_name' => 'google',
'category_id' => '4',
'country' => 'denmark',
),
'pp' => array(
'name' => 'PriceSpy',
'category_name' => 'google',
'category_id' => '4',
'country' => 'united kingdom, new zealand, australia',
),
'hi' => array(
'name' => 'Hintaopas',
'category_name' => 'google',
'category_id' => '4',
'country' => 'finland',
),
'ld' => array(
'name' => 'leDenicheur',
'category_name' => 'google',
'category_id' => '4',
'country' => 'france',
),
'ko' => array(
'name' => 'Kompario',
'category_name' => 'google',
'category_id' => '4',
'country' => 'poland',
),
'u' => array(
'name' => 'Heureka',
'category_name' => 'heureka',
'category_id' => '7',
'country' => 'czech',
),
'n' => array(
'name' => 'PriceRunner',
'category_name' => '',
'country' => 'denmark, sweden, united kingdom',
),
'k' => array(
'name' => 'Kelkoo',
'category_name' => '',
'country' => 'united kingdom, portugal, france, germany, italy, spain, romania, greece, hungary, poland, sweden, denmark, norway',
),
't' => array(
'name' => 'Twenga',
'category_name' => 'google',
'category_id' => '4',
'country' => 'united kingdom, portugal, france, germany, italy, spain, poland, netherlands',
),
'd' => array(
'name' => 'idealo',
'category_name' => '',
'country' => 'germany, finland',
),
'pint' => array(
'name' => 'Pinterest',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'sn' => array(
'name' => 'Snapchat',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'gla' => array(
'name' => 'Glami',
'category_name' => 'glami',
'category_id' => '3',
'country' => 'united kingdom, portugal, france, germany, italy, spain, czech, slovakia, romania, hungary, greece, latvia, lithuania, estonia, croatia, slovenia',
),
'sa' => array(
'name' => 'ShopAlike',
'category_name' => '',
'country' => 'united kingdom, portugal, france, italy, spain, poland, netherlands, austria, czech, denmark, finland, sweden, slovakia, hungary',
),
'lz' => array(
'name' => 'LadenZeile',
'category_name' => '',
'country' => 'germany',
),
'st' => array(
'name' => 'Stileo',
'category_name' => '',
'country' => 'italy',
),
'mm' => array(
'name' => 'ManoMano',
'category_name' => '',
'country' => 'france, spain, italy, germany, united kingdom',
),
'vi' => array(
'name' => 'Vivino',
'category_name' => '',
'country' => 'france, canada, united states, italy, spain',
),
'sm' => array(
'name' => 'ShopMania',
'category_name' => '',
'country' => 'global',
),
'rd' => array(
'name' => 'Rue Du Commerce',
'category_name' => '',
'country' => 'france, united states',
),
'ws' => array(
'name' => 'Wine-searcher',
'category_name' => '',
'country' => 'global',
),
'dre' => array(
'name' => 'Drezzy',
'category_name' => '',
'country' => 'italy',
),
'cen' => array(
'name' => 'Ceneje',
'category_name' => '',
'country' => 'slovenia, bosnia and herzegovina, croatia, serbia',
),
'tro' => array(
'name' => 'Trovaprezzi',
'category_name' => '',
'country' => 'italy',
),
'ppy' => array(
'name' => 'Shoppydoo',
'category_name' => '',
'country' => 'italy',
),
'twe' => array(
'name' => 'Tweakers',
'category_name' => '',
'country' => 'netherlands, belgium',
),
'k24' => array(
'name' => 'Kaina24',
'category_name' => '',
'country' => 'lithuania',
),
'kos' => array(
'name' => 'Kainos',
'category_name' => '',
'country' => 'lithuania',
),
'plt' => array(
'name' => 'Pricer',
'category_name' => '',
'country' => 'lithuania',
),
'aru' => array(
'name' => 'Arukereso',
'category_name' => '',
'country' => 'hungary',
),
'com' => array(
'name' => 'Compari',
'category_name' => '',
'country' => 'romania',
),
'paz' => array(
'name' => 'Pazaruvaj',
'category_name' => '',
'country' => 'bulgaria',
),
'epr' => array(
'name' => 'ePRICE',
'category_name' => '',
'country' => 'italy',
),
'sez' => array(
'name' => 'Seznam',
'category_name' => '',
'country' => 'czech',
),
'pri' => array(
'name' => 'Prisguiden',
'category_name' => '',
'country' => 'norway',
),
'mal' => array(
'name' => 'MALL',
'category_name' => '',
'category_id' => 9,
'country' => 'czech',
),
'spa' => array(
'name' => 'Spartoo',
'category_name' => '',
'category_id' => 10,
'country' => 'global',
),
'ins' => array(
'name' => 'Instagram',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'lw' => array(
'name' => 'LinkWise',
'category_name' => '',
'country' => 'greece, turkish',
),
'naj' => array(
'name' => 'najnakup',
'category_name' => '',
'country' => 'slovakia',
),
'tot' => array(
'name' => 'TOTOS',
'category_name' => '',
'country' => 'greece',
),
'onb' => array(
'name' => 'OnBuy',
'category_name' => 'google',
'category_id' => '4',
'country' => 'united kingdom, united states',
),
'ceo' => array(
'name' => 'Ceneo',
'category_name' => '',
'country' => 'poland',
),
'bil' => array(
'name' => 'billiger',
'category_name' => '',
'country' => 'germany',
),
'sho' => array(
'name' => 'SHOPPING',
'category_name' => '',
'country' => 'france, italy, germany, united kingdom, united states',
),
'cj' => array(
'name' => 'CJ Affiliate',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'man' => array(
'name' => 'Pricemania',
'category_name' => '',
'country' => 'slovakia, czech',
),
'fav' => array(
'name' => 'Favi',
'category_name' => 'google',
'category_id' => '4',
'country' => 'france, poland, romania, hungary, italy, sweden, united kingdom',
),
'zbo' => array(
'name' => 'Zbozi',
'category_name' => 'heureka',
'category_id' => '7',
'country' => 'czech',
),
'sal' => array(
'name' => 'Salidzini',
'category_name' => '',
'country' => 'latvia',
),
'pub' => array(
'name' => 'Public.gr',
'category_name' => '',
'country' => 'greece',
),
'hind' => array(
'name' => 'Hind',
'category_name' => '',
'country' => 'estonia',
),
'kurp' => array(
'name' => 'kurpirkt',
'category_name' => '',
'country' => 'latvia',
),
'hinn' => array(
'name' => 'Hinnavaatlus',
'category_name' => '',
'country' => 'estonia',
),
'wum' => array(
'name' => 'wumler',
'category_name' => '',
'country' => 'global',
),
'mala' => array(
'name' => 'Malaseno',
'category_name' => '',
'country' => 'italy',
),
'tc' => array(
'name' => 'the clutcher',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'lyst' => array(
'name' => 'Lyst',
'category_name' => 'google',
'category_id' => '4',
'country' => 'united kingdom, united states',
),
'wb' => array(
'name' => 'webgains',
'category_name' => 'google',
'category_id' => '4',
'country' => 'united kingdom, united states, germany',
),
'ikx' => array(
'name' => 'iKRIX',
'category_name' => 'google',
'category_id' => '4',
'country' => 'united states, italy, france, spain',
),
'cr' => array(
'name' => 'comparer',
'category_name' => '',
'country' => 'belgium',
),
'ver' => array(
'name' => 'vertaa',
'category_name' => '',
'country' => 'finland',
),
'verk' => array(
'name' => 'vergelijk',
'category_name' => '',
'country' => 'netherlands, belgium, france',
),
'tov' => array(
'name' => 'tovar',
'category_name' => '',
'country' => 'slovakia',
),
'wes' => array(
'name' => 'webshopy',
'category_name' => '',
'country' => 'slovakia',
),
'che' => array(
'name' => 'cherchons',
'category_name' => '',
'country' => 'france',
),
'kie' => array(
'name' => 'kieskeurig',
'category_name' => '',
'country' => 'netherlands',
),
'kog' => array(
'name' => 'Kogan',
'category_name' => 'kogan',
'category_key' => 'kogan_ebay_en',
'country' => 'australia',
),
'mir' => array(
'name' => 'mirakl',
'category_name' => '',
'country' => 'global',
),
'cat' => array(
'name' => 'Catch',
'category_name' => '',
'country' => 'australia',
),
'dar' => array(
'name' => 'Darty',
'category_name' => '',
'country' => 'france',
),
'ibs' => array(
'name' => 'IBS',
'category_name' => '',
'country' => 'italy',
),
'ven' => array(
'name' => 'Venca',
'category_name' => '',
'country' => 'spain, portugal',
),
'pb' => array(
'name' => 'Le Panier Bleu',
'category_name' => 'google',
'category_id' => '4',
'country' => 'canada, france',
),
'wor' => array(
'name' => 'worten',
'category_name' => '',
'category_id' => '',
'country' => 'portugal, venezuela',
),
'cri' => array(
'name' => 'Criteo',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'rol' => array(
'name' => 'AdRoll',
'category_name' => '',
'country' => 'global',
),
'tt' => array(
'name' => 'TradeTracker',
'category_name' => '',
'country' => 'global',
),
'dm' => array(
'name' => 'Direct Market',
'category_name' => '',
'country' => 'greece',
),
'pm' => array(
'name' => 'ProfitMetrics',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'ep' => array(
'name' => 'epicentrk',
'category_name' => '',
'country' => 'ukraine, russia',
),
'ro' => array(
'name' => 'rozetka',
'category_name' => '',
'country' => 'ukraine',
),
'ar' => array(
'name' => 'argep',
'category_name' => '',
'country' => 'hungary',
),
'ho' => array(
'name' => 'hotline',
'category_name' => '',
'country' => 'ukraine',
),
'ek' => array(
'name' => 'E-Katalog',
'category_name' => '',
'country' => 'ukraine, russia',
),
'kuk' => array(
'name' => 'KuantoKusta',
'category_name' => '',
'country' => 'portugal',
),
'dot' => array(
'name' => 'dott',
'category_name' => '',
'country' => 'portugal',
),
'pem' => array(
'name' => 'Pemami',
'category_name' => '',
'country' => 'portugal',
),
'gei' => array(
'name' => 'Geizhals',
'category_name' => '',
'country' => 'austria, germany',
),
'ski' => array(
'name' => 'Skinflint',
'category_name' => '',
'country' => 'united kingdom',
),
'cew' => array(
'name' => 'Cenowarka',
'category_name' => '',
'country' => 'poland',
),
'cb' => array(
'name' => 'cool blue',
'category_name' => '',
'country' => 'belgium',
),
'gu' => array(
'name' => 'guenstiger',
'category_name' => '',
'country' => 'germany',
),
'bi' => array(
'name' => 'bike exchange',
'category_name' => 'google',
'category_id' => '4',
'country' => 'australia',
),
'gp' => array(
'name' => 'Get Price',
'category_name' => '',
'country' => 'australia',
),
'hb' => array(
'name' => 'homebook',
'category_name' => 'google',
'category_id' => '4',
'country' => 'poland',
),
'sco' => array(
'name' => 'scoupz',
'category_name' => '',
'country' => 'netherlands',
),
'fc' => array(
'name' => 'fashionchick',
'category_name' => 'google',
'category_id' => '4',
'country' => 'netherlands',
),
'lbb' => array(
'name' => 'Les Bonnes Bouilles',
'category_name' => '',
'country' => 'france',
),
'pl' => array(
'name' => 'Plytix',
'category_name' => 'google',
'category_id' => '4',
'country' => 'united kingdom, united states, turkish',
),
'ec' => array(
'name' => 'eCommerce',
'category_name' => '',
'country' => 'united kingdom, italy, spain',
),
'no' => array(
'name' => 'nokaut',
'category_name' => '',
'country' => 'poland, czech',
),
'gd' => array(
'name' => 'gun.deals',
'category_name' => '',
'country' => 'united states',
),
'sfl' => array(
'name' => 'Shopflix',
'category_name' => '',
'country' => 'greece',
),
'cgr' => array(
'name' => 'Car.gr',
'category_name' => 'Car.gr',
'category_key' => 'car_gr',
'country' => 'greece',
),
'twi' => array(
'name' => 'TWIL',
'category_name' => '',
'country' => 'france, united kingdom',
),
'bee' => array(
'name' => 'BeezUP',
'category_name' => '',
'country' => 'france, united kingdom, germany, spain, italy',
),
'ani' => array(
'name' => 'Ani',
'category_name' => '',
'country' => 'latvia',
),
'boa' => array(
'name' => 'boardfy',
'category_name' => '',
'country' => 'global',
),
'cev' => array(
'name' => 'CercaVino',
'category_name' => '',
'country' => 'global',
),
'sam' => array(
'name' => 'SalesManago',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'ua' => array(
'name' => 'Heureka availability',
'category_name' => '',
'category_id' => '',
'country' => 'czech',
),
'ap' => array(
'name' => 'Appla',
'category_name' => '',
'category_id' => '',
'country' => 'cyprus, greece',
),
'for' => array(
'name' => 'Forretas',
'category_name' => '',
'category_id' => '',
'country' => 'portugal',
),
'ttok' => array(
'name' => 'TikTok',
'category_name' => 'google',
'category_id' => '4',
'country' => 'global',
),
'ma' => [
'name' => 'Microsoft Advertising',
'category_name' => '',
'category_id' => '',
'country' => 'global',
],
);
}
public function getMostPopularTypes()
{
return array(
'c' => array(
'name' => 'Individual',
'category_name' => '',
),
'f' => array(
'name' => 'Facebook',
'category_name' => 'google',
'category_id' => '4',
),
'g' => array(
'name' => 'Google',
'category_name' => 'google',
'category_id' => '4',
),
's' => array(
'name' => 'Skroutz',
'category_name' => '',
),
'd' => array(
'name' => 'idealo',
'category_name' => '',
),
'n' => array(
'name' => 'PriceRunner',
'category_name' => '',
),
'mm' => array(
'name' => 'ManoMano',
'category_name' => '',
),
'tro' => array(
'name' => 'Trovaprezzi',
'category_name' => '',
),
);
}
}

View File

@@ -0,0 +1,47 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class FilterByAttribute
{
public function isRequiredAttributeExists($filterStatus, $usefulAttributes, $combinationIdProductAttribute, $attributesList = array())
{
$requiredAttributeExists = true;
if (!empty($filterStatus) && !empty($usefulAttributes)) {
if (empty($attributesList)) {
return false;
}
$requiredAttributeExists = false;
foreach ($attributesList as $a) {
if (!empty($combinationIdProductAttribute) && $a['id_product_attribute'] != $combinationIdProductAttribute) {
continue;
}
if (in_array($a['id_attribute'], $usefulAttributes)) {
$requiredAttributeExists = true;
break;
}
}
}
return $requiredAttributeExists;
}
}

View File

@@ -0,0 +1,56 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class FilterByFeature
{
public function isExists($feedSettings, $productFeatures)
{
if (empty($feedSettings['only_with_features_status'])) {
return true;
}
if (empty($feedSettings['only_with_features'])) {
return false;
}
$list = $this->getIntersect($feedSettings['only_with_features'], $productFeatures);
return !empty($list);
}
public function isNotExists($feedSettings, $productFeatures)
{
if (empty($feedSettings['only_without_features_status'])) {
return true;
}
if (empty($feedSettings['only_without_features'])) {
return true;
}
$list = $this->getIntersect($feedSettings['only_without_features'], $productFeatures);
return empty($list);
}
protected function getIntersect($validFeatures, $productFeatures)
{
return array_intersect(explode(',', $validFeatures), $productFeatures);
}
}

View File

@@ -0,0 +1,130 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class MergeAttributesByGroup
{
private $parentGroup = 0;
private $childGroup = 0;
private $settings = [];
/**
* @return int
*/
public function getParentGroup()
{
return $this->parentGroup;
}
/**
* @param int $parentGroup
*/
public function setParentGroup($parentGroup)
{
$this->parentGroup = $parentGroup;
}
/**
* @return int
*/
public function getChildGroup()
{
return $this->childGroup;
}
/**
* @param int $childGroup
*/
public function setChildGroup($childGroup)
{
$this->childGroup = $childGroup;
}
/**
* @param array $settings
*/
public function setSettings($settings)
{
$this->settings = $settings;
}
/**
* @return array
*/
public function getSettings()
{
return $this->settings;
}
public function getByParentGroup($productAttributes, $onlyInStock = true, $activeFeatures = [], $attributeMapValues = [], $outOfStockStatus = 1)
{
$parentGroupAttributes = array();
if (empty($activeFeatures)) {
return $parentGroupAttributes;
}
$settings = $this->getSettings();
foreach ($productAttributes as $aParent) {
if ($aParent['id_attribute_group'] == $this->getParentGroup()) {
foreach ($productAttributes as $aChild) {
if ($onlyInStock && $aChild['quantity'] < 1) {
continue;
}
if (!empty($settings['only_available_for_order'])) {
if ($aChild['quantity'] < 1 && $outOfStockStatus == 0) {
continue;
}
if ($aChild['quantity'] < 1 && $outOfStockStatus == 2 && $settings['configuration']['PS_ORDER_OUT_OF_STOCK'] == 0) {
continue;
}
}
if ($aParent['id_attribute_group'] == $aChild['id_attribute_group'] || empty($activeFeatures[$aChild['id_attribute_group']])) {
continue;
}
if ($aParent['id_product_attribute'] == $aChild['id_product_attribute']) {
$parentGroupAttributes[$aParent['attribute_name']][$aChild['id_attribute_group']][] = !empty($attributeMapValues[$aChild['id_attribute_group'].'-'.$aChild['id_attribute']]) ? $attributeMapValues[$aChild['id_attribute_group'].'-'.$aChild['id_attribute']] : $aChild['attribute_name'];
}
}
}
}
return $parentGroupAttributes;
}
public function getCombinationParentGroupName($productAttributes, $combinationId)
{
foreach ($productAttributes as $a) {
if ($a['id_attribute_group'] == $this->getParentGroup() && $a['id_product_attribute'] == $combinationId) {
return $a['attribute_name'];
}
}
return '';
}
public function getCombinationNameByMainGroup($name)
{
return ', '.$name;
}
}

View File

@@ -0,0 +1,71 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class NotificationXml
{
const TYPE_CONFIRM = 1;
const TYPE_WARNING = 2;
protected $messages = array();
public function addWarn($message)
{
$this->add(self::TYPE_WARNING, $message);
}
public function addConf($message)
{
$this->add(self::TYPE_CONFIRM, $message);
}
public function getMessages()
{
return $this->messages;
}
private function add($typeId, $message)
{
$this->messages[] = array(
'type' => '',
'typeId' => $typeId,
'message' => $message,
'cssClass' => $this->getMessageStyle($typeId),
);
}
private function getMessageStyle($type)
{
switch ($type) {
case self::TYPE_WARNING:
if (_PS_VERSION_ >= '1.6') {
return 'alert alert-warning';
}
return 'warning warn';
case self::TYPE_CONFIRM:
if (_PS_VERSION_ >= '1.6') {
return 'alert alert-success';
}
return 'conf confirm';
}
return 'warning warn';
}
}

View File

@@ -0,0 +1,152 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class OrderFieldsAdmin extends Xmlfeeds
{
public function getFieldSettings($page, $moduleImgPath)
{
$r = Db::getInstance()->ExecuteS('
SELECT `name`, `status`, `title_xml`, `table`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$page.'"
');
$tags = array();
$branchNamesKey = array();
foreach ($r as $k) {
$tags[$k['name'].'+'.$k['table']] = isset($k['title_xml']) ? $k['title_xml'] : false;
$tags[$k['name'].'+'.$k['table'].'+status'] = isset($k['status']) ? $k['status'] : false;
}
if (!empty($tags)) {
$this->tags_info = $tags;
}
$branchNames = Db::getInstance()->ExecuteS('
SELECT `name`, `value`, `category`
FROM '._DB_PREFIX_.'blmod_xml_block
WHERE category = "'.(int)$page.'"
');
foreach ($branchNames as $bl) {
$branchNamesKey[$bl['name']] = isset($bl['value']) ? $bl['value'] : false;
}
$this->smarty->assign([
'branchNamesKey' => $branchNamesKey,
'moduleImgPath' => $moduleImgPath,
]);
$html = $this->displaySmarty('views/templates/admin/element/orderBlockSettings.tpl');
$html .= $this->printBlock(
'Order basic information',
array(
array('name' => 'id_order', 'title' => 'id_order', 'table' => 'orders'),
array('name' => 'reference', 'title' => 'reference', 'table' => 'orders'),
array('name' => 'invoice_number', 'title' => 'invoice_number', 'table' => 'orders'),
array('name' => 'invoice_date', 'title' => 'invoice_date', 'table' => 'orders'),
array('name' => 'gift', 'title' => 'is_gift', 'table' => 'orders'),
array('name' => 'gift_message', 'title' => 'gift_message', 'table' => 'orders'),
array('name' => 'current_state', 'title' => 'id_status', 'table' => 'orders'),
array('name' => 'name', 'title' => 'status_name', 'table' => 'order_state_lang'),
array('name' => 'payment', 'title' => 'payment', 'table' => 'orders'),
array('name' => 'date_add', 'title' => 'date_add', 'table' => 'orders'),
array('name' => 'date_upd', 'title' => 'date_upd', 'table' => 'orders'),
array('name' => 'currency', 'title' => 'currency', 'table' => 'bl_extra'),
array('name' => 'customer_message', 'title' => 'customer_messages', 'table' => 'bl_extra'),
array('name' => 'employee_message', 'title' => 'employee_messages', 'table' => 'bl_extra'),
array('name' => 'total_products', 'title' => 'total_products', 'table' => 'bl_extra'),
)
);
$html .= $this->printBlock(
'Prices, Tax',
array(
array('name' => 'total_paid', 'title' => 'total_paid', 'table' => 'orders'),
array('name' => 'total_paid_tax_incl', 'title' => 'total_paid_tax_incl', 'table' => 'orders'),
array('name' => 'total_paid_tax_excl', 'title' => 'total_paid_tax_excl', 'table' => 'orders'),
array('name' => 'total_wrapping', 'title' => 'total_wrapping', 'table' => 'orders'),
array('name' => 'total_discounts', 'title' => 'total_discounts', 'table' => 'orders'),
array('name' => 'total_products', 'title' => 'total_products', 'table' => 'orders'),
array('name' => 'tax_total_amount', 'title' => 'tax_total_amount', 'table' => 'bl_extra'),
)
);
$html .= $this->printBlock(
'Shipping, delivery',
array(
array('name' => 'shipping_number', 'title' => 'shipping_number', 'table' => 'orders'),
array('name' => 'delivery_number', 'title' => 'delivery_number', 'table' => 'orders'),
array('name' => 'delivery_date', 'title' => 'delivery_date', 'table' => 'orders'),
array('name' => 'id_carrier', 'title' => 'id_carrier', 'table' => 'orders'),
array('name' => 'name', 'title' => 'carrier_name', 'table' => 'carrier'),
array('name' => 'total_shipping', 'title' => 'total_shipping', 'table' => 'orders'),
array('name' => 'total_shipping_tax_incl', 'title' => 'total_shipping_tax_incl', 'table' => 'orders'),
array('name' => 'total_shipping_tax_excl', 'title' => 'total_shipping_tax_excl', 'table' => 'orders'),
array('name' => 'carrier_tax_rate', 'title' => 'carrier_tax_rate', 'table' => 'orders'),
array('name' => 'invoice_address', 'title' => 'invoice_address', 'table' => 'bl_extra'),
array('name' => 'delivery_address', 'title' => 'delivery_address', 'table' => 'bl_extra'),
)
);
$html .= $this->printBlock(
'Customer',
array(
array('name' => 'id_customer', 'title' => 'id_customer', 'table' => 'orders'),
array('name' => 'id_default_group', 'title' => 'id_group', 'table' => 'customer'),
array('name' => 'firstname', 'title' => 'firstname', 'table' => 'customer'),
array('name' => 'lastname', 'title' => 'lastname', 'table' => 'customer'),
array('name' => 'email', 'title' => 'email', 'table' => 'customer'),
array('name' => 'phone', 'title' => 'phone', 'table' => 'address'),
array('name' => 'birthday', 'title' => 'birthday', 'table' => 'customer'),
array('name' => 'address', 'title' => 'full_address', 'table' => 'bl_extra'),
array('name' => 'country', 'title' => 'country', 'table' => 'bl_extra'),
array('name' => 'city', 'title' => 'city', 'table' => 'bl_extra'),
array('name' => 'postcode', 'title' => 'postal_code', 'table' => 'bl_extra'),
array('name' => 'vat_number_invoice', 'title' => 'vat_number', 'table' => 'bl_extra'),
)
);
$html .= $this->printBlock(
'Products',
array(
array('name' => 'product_id', 'title' => 'product_id', 'table' => 'order_detail'),
array('name' => 'product_attribute_id', 'title' => 'product_attribute_id', 'table' => 'order_detail'),
array('name' => 'product_quantity', 'title' => 'product_quantity', 'table' => 'order_detail'),
array('name' => 'product_name', 'title' => 'product_name', 'table' => 'order_detail'),
array('name' => 'total_price_tax_incl', 'title' => 'products_price_tax_incl', 'table' => 'order_detail'),
array('name' => 'total_price_tax_excl', 'title' => 'products_price_tax_excl', 'table' => 'order_detail'),
array('name' => 'unit_price_tax_incl', 'title' => 'unit_price_tax_incl', 'table' => 'order_detail'),
array('name' => 'unit_price_tax_excl', 'title' => 'unit_price_tax_excl', 'table' => 'order_detail'),
array('name' => 'rate', 'title' => 'tax_rate', 'table' => 'tax'),
array('name' => 'product_ean13', 'title' => 'product_ean13', 'table' => 'order_detail'),
array('name' => 'product_reference', 'title' => 'product_reference', 'table' => 'order_detail'),
array('name' => 'product_upc', 'title' => 'product_upc', 'table' => 'order_detail'),
array('name' => 'product_isbn', 'title' => 'product_isbn', 'table' => 'order_detail'),
array('name' => 'product_supplier_reference', 'title' => 'supplier_reference', 'table' => 'order_detail'),
array('name' => 'id_supplier', 'title' => 'id_supplier', 'table' => 'product'),
array('name' => 'id_warehouse', 'title' => 'warehouse_id', 'table' => 'order_detail'),
)
);
return $html;
}
}

View File

@@ -0,0 +1,30 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class OrderSettings
{
const FILTER_DATE_NONE = 0;
const FILTER_DATE_TODAY = 1;
const FILTER_DATE_YESTERDAY = 2;
const FILTER_DATE_THIS_WEEK = 3;
const FILTER_DATE_THIS_MONTH = 4;
const FILTER_DATE_THIS_YEAR = 5;
const FILTER_DATE_CUSTOM_DAYS = 6;
const FILTER_DATE_DATE_RANGE = 7;
}

View File

@@ -0,0 +1,73 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class PriceFormat
{
const TYPE_1 = 1;
const TYPE_2 = 2;
const TYPE_3 = 3;
const TYPE_4 = 4;
const TYPE_5 = 5;
const TYPE_6 = 6;
const DEFAULT_PRECISION = 2;
public function getList()
{
return [
self::TYPE_1 => '1234.56 (with a dot)',
self::TYPE_2 => '12345,56 (with a comma)',
self::TYPE_3 => '1234 (only integer)',
self::TYPE_4 => '123400 (price in cents)',
self::TYPE_5 => '1235 (only integer, round up)',
self::TYPE_6 => '1234 (only integer, round down)',
];
}
public static function convertByType($price = 0, $type = 0)
{
if (empty($type)) {
return Tools::ps_round($price, self::DEFAULT_PRECISION);
}
$roundMode = null;
$precision = (in_array($type, [self::TYPE_3, self::TYPE_5, self::TYPE_6,])) ? 0 : self::DEFAULT_PRECISION;
if ($type == self::TYPE_5) {
$roundMode = PS_ROUND_UP;
}
if ($type == self::TYPE_6) {
$roundMode = PS_ROUND_DOWN;
}
$price = str_replace(' ', '', $price);
$price = Tools::ps_round($price, $precision, $roundMode);
if ($type == self::TYPE_1) {
$price = number_format(str_replace(',', '.', $price), self::DEFAULT_PRECISION, '.', '');
} elseif ($type == self::TYPE_2) {
$price = str_replace('.', ',', $price);
} elseif ($type == self::TYPE_4) {
$price = $price * 100;
}
return $price;
}
}

View File

@@ -0,0 +1,170 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class ProductCombinations
{
const COMBINATION_LIMIT = 100;
protected $langId = 0;
protected $product = null;
protected $isTooMany = false;
public function getCombinations($product, $langId)
{
$this->langId = $langId;
return $product->getAttributesResume($this->langId, ' ', ', ');
}
protected function getCombinationsFromFeatures()
{
$attributes = $this->product->getAttributesGroups($this->langId);
if (empty($attributes)) {
return [];
}
$attributesByGroups = [];
$attributesByKey = [];
foreach ($attributes as $a) {
$id = $a['id_attribute_group'].'-'.$a['id_attribute'];
if (empty($attributesByGroups[$a['id_attribute_group']])) {
$attributesByGroups[$a['id_attribute_group']][] = $id;
$attributesByKey[$a['id_attribute']] = $a;
continue;
}
if (in_array($id, $attributesByGroups[$a['id_attribute_group']])) {
continue;
}
$attributesByGroups[$a['id_attribute_group']][] = $id;
$attributesByKey[$a['id_attribute']] = $a;
}
$attributesByGroups = array_values($attributesByGroups);
if (empty($attributesByGroups)) {
return [];
}
$combinationsAttributes = $this->getCombinationsFromAttributes($attributesByGroups);
//echo '<pre>';
//print_r($combinationsAttributes);
//die;
if (empty($combinationsAttributes)) {
return [];
}
return $this->finalCombinationBuilder($combinationsAttributes, $attributesByKey);
}
protected function getCombinationsFromAttributes($arrays, $i = 0)
{
if (!isset($arrays[$i])) {
return [];
}
if ($i == count($arrays) - 1) {
return $arrays[$i];
}
$tmp = $this->getCombinationsFromAttributes($arrays, $i + 1);
$result = [];
foreach ($arrays[$i] as $v) {
foreach ($tmp as $t) {
$result[] = is_array($t) ? array_merge([$v,], $t) : [$v, $t,];
if (count($result) > self::COMBINATION_LIMIT) {
$this->isTooMany = true;
return [];
}
}
}
return $result;
}
protected function finalCombinationBuilder($combinationsAttributes, $attributesByKey)
{
$combinations = [];
$id = 1;
foreach ($combinationsAttributes as $attributes) {
$name = [];
$url = [];
$quantity = 9999999999;
$weight = 0;
$price = 0;
if (!is_array($attributes)) {
list($idAttributeGroup, $idAttribute) = explode('-', $attributes);
$attribute = $attributesByKey[$idAttribute];
$name[] = $attribute['public_group_name'].'-'.$attribute['attribute_name'];
$url[] = $attribute['id_attribute'].'-'.trim($attribute['group_name']).'-'.trim($attribute['attribute_name']);
$weight = $attribute['weight'];
$quantity = $attribute['quantity'];
$price = $attribute['price'];
} else {
foreach ($attributes as $a) {
list($idAttributeGroup, $idAttribute) = explode('-', $a);
$attribute = $attributesByKey[$idAttribute];
$name[] = $attribute['public_group_name'] . '-' . $attribute['attribute_name'];
$url[] = $attribute['id_attribute'].'-'.trim($attribute['group_name']).'-'.trim($attribute['attribute_name']);
$weight += $attribute['weight'];
$price += $attribute['price'];
if ($quantity > $attribute['quantity']) {
$quantity = $attribute['quantity'];
}
}
}
$urlFinal = Tools::strtolower(implode('/', $url));
$urlFinal = str_replace([' |', ')', '('], '', $urlFinal);
$urlFinal = str_replace(' ', '_', $urlFinal);
$combinations[$id] = [
'is_created_manually' => true,
'id_product_attribute' => $id,
'name' => $this->product->name.' '.implode(', ', $name),
'quantity' => $quantity,
'weight' => $weight,
'url' => '#/'.$urlFinal,
'sale_price' => 0,
'base_price' => $this->product->price,
'ean13' => $this->product->ean13,
'reference' => $this->product->reference,
'supplier_reference' => $this->product->supplier_reference,
'wholesale_price' => $this->product->wholesale_price,
];
$id++;
}
return $combinations;
}
}

View File

@@ -0,0 +1,102 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class ProductList
{
protected $productListExclude = array();
public function __construct($productListExclude = array())
{
$this->productListExclude = $productListExclude;
}
public function getProductsByProductList($productList, $productListExcludeActive)
{
$products = $this->getProducts(array_diff($productList, $this->productListExclude));
$products = array_merge($products, $this->getProductIdList($productList));
return array_filter(array_diff($products, $productListExcludeActive));
}
public function getExcludeProductsByProductList()
{
return $this->getProducts($this->productListExclude);
}
public function getProductIdList($productListId)
{
if (empty($productListId)) {
return [];
}
$lists = Db::getInstance()->executeS('SELECT l.product_id_list
FROM '._DB_PREFIX_.'blmod_xml_product_list l
WHERE l.id IN ('.pSQL(implode(',', $productListId)).')');
$listsUnique = [];
if (empty($lists)) {
return $listsUnique;
}
foreach ($lists as $l) {
$listsUnique = array_merge($listsUnique, explode(',', $l['product_id_list']));
}
return array_unique($listsUnique);
}
public function getProductListWithXmlTags($productListId)
{
$list = Db::getInstance()->executeS('SELECT l.id, l.custom_xml_tags
FROM '._DB_PREFIX_.'blmod_xml_product_list l
WHERE l.id IN ('.pSQL(implode(',', $productListId)).')');
if (empty($list)) {
return [];
}
$tags = [];
foreach ($list as $l) {
$tags[$l['id']] = $l['custom_xml_tags'];
}
return $tags;
}
protected function getProducts($productList)
{
$products = [];
if (empty($productList)) {
return $products;
}
$result = Db::getInstance()->executeS('SELECT DISTINCT(lp.product_id)
FROM `'._DB_PREFIX_.'blmod_xml_product_list_product` lp
WHERE lp.product_list_id IN ('.pSQL(implode(',', $productList)).')');
foreach ($result as $p) {
$products[] = $p['product_id'];
}
return $products;
}
}

View File

@@ -0,0 +1,316 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class ProductListAdmin extends Xmlfeeds
{
const TYPE_SEARCH = 0;
protected $imageClassName = 'ImageCore';
protected function getImages($imageId)
{
$type = '-'.XmlFeedsTools::getImageType().'.jpg';
$imageClassName = $this->imageClassName;
/**
* @var $imageClass ImageCore
*/
$imageClass = new $imageClassName($imageId);
$name = $imageClass->getExistingImgPath();
$url = _PS_BASE_URL_._THEME_PROD_DIR_.$name.$type;
if (!file_exists(_PS_PROD_IMG_DIR_.$name.$type)) {
$url = _PS_BASE_URL_._THEME_PROD_DIR_.$name.'.jpg';
}
return $url;
}
public function getProductListSettingsPage($active = [], $activeExclude = [])
{
$this->smarty->assign([
'productList' => $this->getProductList(),
'active' => !empty($active) ? $active : [],
'activeExclude' => !empty($activeExclude) ? $activeExclude : [],
]);
return $this->displaySmarty('views/templates/admin/element/filterByProductList.tpl');
}
public function insertNewProductList()
{
$addNewList = Tools::getValue('add_product_list');
$listName = Tools::getValue('product_list_name');
if (empty($addNewList) || empty($listName)) {
return false;
}
Db::getInstance()->Execute('
INSERT INTO '._DB_PREFIX_.'blmod_xml_product_list
(`name`)
VALUE
("'.pSQL($listName).'")
');
$_POST['product_list_id'] = Db::getInstance()->Insert_ID();
return true;
}
public function deleteProductList()
{
$id = Tools::getValue('delete_product_list');
if (empty($id)) {
return false;
}
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_product_list WHERE id = "'.(int)$id.'"');
$this->remoteProductFromList($id, self::TYPE_SEARCH);
return true;
}
public function getProductList()
{
return Db::getInstance()->executeS('SELECT l.id, l.name, (
SELECT COUNT(DISTINCT(pl.product_id)) + l.product_id_list_total
FROM '._DB_PREFIX_.'blmod_xml_product_list_product pl
WHERE pl.product_list_id = l.id
) AS total_products
FROM '._DB_PREFIX_.'blmod_xml_product_list l
ORDER BY l.name ASC');
}
public function updateProductList()
{
$updateProductList = Tools::getValue('update_product_list');
$productListId = Tools::getValue('product_list_id');
if (empty($productListId) || empty($updateProductList)) {
return false;
}
$this->updateProductIdList($productListId);
$this->remoteProductFromList($productListId, self::TYPE_SEARCH);
$products = explode(',', trim(Tools::getValue('product_hidden'), ','));
if (empty($products)) {
return true;
}
foreach ($products as $p) {
$p = (int)$p;
if (empty($p)) {
continue;
}
Db::getInstance()->Execute('
INSERT INTO '._DB_PREFIX_.'blmod_xml_product_list_product
(`product_list_id`, `product_id`, `category_id`)
VALUES
("'.(int)$productListId.'", "'.(int)$p.'", "'.(int)self::TYPE_SEARCH.'")
');
}
return true;
}
public function remoteProductFromList($productListId, $categoryId = 0)
{
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_product_list_product WHERE product_list_id = "'.(int)$productListId.'" AND category_id = '.(int)$categoryId);
}
public function getProductListProducts($productListId)
{
$id_lang = (int)(Configuration::get('PS_LANG_DEFAULT'));
$this->imageClassName = (!class_exists('ImageCore', false) || _PS_VERSION_ > '1.5.3') ? 'Image' : 'ImageCore';
$products = Db::getInstance()->executeS('SELECT DISTINCT(l.id_product), l.name, cl.name AS cat_name, i.id_image
FROM `'._DB_PREFIX_.'blmod_xml_product_list_product` lp
LEFT JOIN '._DB_PREFIX_.'product_lang l ON
l.id_product = lp.product_id
LEFT JOIN '._DB_PREFIX_.'product p ON
l.id_product = p.id_product
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON
(p.id_category_default = cl.id_category AND cl.id_lang = "'.(int)$id_lang.'")
LEFT JOIN `'._DB_PREFIX_.'image` i ON
(p.id_product = i.id_product AND i.`cover`= 1)
WHERE lp.product_list_id = "'.pSQL($productListId).'" AND lp.category_id = '.(int)self::TYPE_SEARCH.'
GROUP BY l.id_product
ORDER BY l.name ASC');
$productsIdList = array();
if (empty($products)) {
return array(
'productIdList' => '',
'products' => array(),
);
}
foreach ($products as $k => $p) {
$productsIdList[] = $p['id_product'];
$products[$k]['image'] = $this->getImages(!empty($p['id_image']) ? $p['id_image'] : false);
if (!empty($products[$k]['cat_name'])) {
$products[$k]['cat_name'] = ', '.$products[$k]['cat_name'];
}
}
return array(
'productIdList' => implode(',', $productsIdList),
'products' => $products,
);
}
public function getProductsByCategoryId($categoryId, $productListId, $langId)
{
$products = Db::getInstance()->executeS('SELECT p.id_product, pl.name, i.id_image, lp.id AS list_id
FROM '._DB_PREFIX_.'product p
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON
(pl.id_product = p.id_product AND pl.id_lang = '.(int)$langId.')
LEFT JOIN '._DB_PREFIX_.'image i ON
(p.id_product = i.id_product AND i.cover = 1)
LEFT JOIN '._DB_PREFIX_.'blmod_xml_product_list_product lp ON
(lp.product_id = p.id_product AND lp.product_list_id = '.(int)$productListId.' AND lp.category_id = '.(int)$categoryId.')
WHERE p.id_category_default = '.(int)$categoryId.'
ORDER BY pl.name ASC
LIMIT 2000');
if (empty($products)) {
return $products;
}
foreach ($products as $k => $p) {
$products[$k]['image'] = $this->getImages(!empty($p['id_image']) ? $p['id_image'] : false);
}
return $products;
}
public function updateProductListByCategory()
{
$products = Tools::getValue('products_by_category');
$categoryId = Tools::getValue('product_list_category_id');
$productListId = Tools::getValue('product_list_id');
$updateProductList = Tools::getValue('update_product_list');
if (empty($productListId) || empty($categoryId) || empty($updateProductList)) {
return false;
}
$this->remoteProductFromList($productListId, $categoryId);
if (empty($products)) {
return true;
}
foreach ($products as $p) {
$p = (int)$p;
if (empty($p)) {
continue;
}
Db::getInstance()->Execute('
INSERT INTO '._DB_PREFIX_.'blmod_xml_product_list_product
(`product_list_id`, `product_id`, `category_id`)
VALUES
("'.(int)$productListId.'", "'.(int)$p.'", "'.(int)$categoryId.'")
');
}
return true;
}
public function getTotalProductsInCategory($categoryId = 0)
{
$total = array();
if (empty($categoryId)) {
return $total;
}
$list = Db::getInstance()->executeS('SELECT l.category_id, COUNT(l.id) AS total_products
FROM '._DB_PREFIX_.'blmod_xml_product_list_product l
WHERE l.product_list_id = '.(int)$categoryId.'
GROUP BY l.category_id');
if (empty($list)) {
return $total;
}
foreach ($list as $l) {
$total[$l['category_id']] = $l['total_products'];
}
return $total;
}
public function getProductIdList($productListId)
{
return Db::getInstance()->getValue('SELECT l.product_id_list
FROM '._DB_PREFIX_.'blmod_xml_product_list l
WHERE l.id = '.(int)$productListId);
}
public function getProductIdListXmlTags($productListId)
{
return Db::getInstance()->getValue('SELECT l.custom_xml_tags
FROM '._DB_PREFIX_.'blmod_xml_product_list l
WHERE l.id = '.(int)$productListId);
}
protected function updateProductIdList($productListId)
{
$xmlTags = trim(Tools::getValue('custom_xml_tags'));
$productIdList = trim(str_replace(' ', '', trim(Tools::getValue('product_id_list'))), ',');
$listCleaned = [];
if (!empty($productIdList)) {
$list = explode(',', $productIdList);
foreach ($list as $l) {
$l = (int)$l;
if (!empty($l)) {
$listCleaned[] = $l;
}
}
}
Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'blmod_xml_product_list SET
product_id_list = "'.pSQL(implode(',', $listCleaned)).'", product_id_list_total = "'.pSQL(count($listCleaned)).'",
custom_xml_tags = "'.htmlspecialchars_decode($xmlTags, ENT_QUOTES).'"
WHERE id = "'.(int)$productListId.'"');
}
public function getProductListWithXmlTags()
{
return Db::getInstance()->executeS('SELECT lp.id, lp.name
FROM '._DB_PREFIX_.'blmod_xml_product_list lp
WHERE lp.custom_xml_tags != "" AND lp.custom_xml_tags IS NOT NULL
ORDER BY lp.name ASC');
}
}

View File

@@ -0,0 +1,109 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class ProductPropertyMap
{
const TYPE_ATTRIBUTE = 1;
const TYPE_FEATURE = 2;
public function createMap()
{
Db::getInstance()->insert(
'blmod_xml_product_property_map',
array(
'name' => pSQL(Tools::getValue('product_property_map_name')),
'type_id' => (int)Tools::getValue('product_property_map_type'),
'created_at' => pSQL(date('Y-m-d H:i:s')),
)
);
return true;
}
public function getMaps($typeId)
{
return Db::getInstance()->executeS('
SELECT m.*
FROM '._DB_PREFIX_.'blmod_xml_product_property_map m
WHERE m.type_id = "'.(int)$typeId.'"
ORDER BY m.name ASC');
}
public function updateMapValues()
{
$mapId = (int)Tools::getValue('map_id');
$properties = Tools::getValue('property');
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_product_property_map_value WHERE map_id = "'.(int)$mapId.'"');
foreach ($properties as $groupId => $groups) {
foreach ($groups as $propertyId => $value) {
if (empty($value) && $value != '0') {
continue;
}
Db::getInstance()->Execute('
INSERT INTO '._DB_PREFIX_.'blmod_xml_product_property_map_value
(`map_id`, `group_id`, `property_id`, `value`, `created_at`)
VALUE
("'.(int)$mapId.'", "'.(int)$groupId.'", "'.(int)$propertyId.'", "'.pSQL($value).'", "'.pSQL(date('Y-m-d H:i:s')).'")
');
}
}
return true;
}
public function getMapValues($mapId)
{
return Db::getInstance()->executeS('
SELECT m.group_id, m.property_id, m.`value`
FROM '._DB_PREFIX_.'blmod_xml_product_property_map_value m
WHERE m.map_id = "'.(int)$mapId.'"');
}
public function getMapValuesWithKey($mapId)
{
$valuesWithKey = array();
if (empty($mapId)) {
return $valuesWithKey;
}
$values = $this->getMapValues($mapId);
if (empty($values)) {
return $valuesWithKey;
}
foreach ($values as $v) {
$valuesWithKey[$v['group_id'].'-'.$v['property_id']] = $v['value'];
}
return $valuesWithKey;
}
public function deleteMap($mapId)
{
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_product_property_map WHERE id = "'.(int)$mapId.'"');
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_product_property_map_value WHERE map_id = "'.(int)$mapId.'"');
return true;
}
}

View File

@@ -0,0 +1,121 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class ProductSettingsFront
{
const DEFAULT_SETTINGS_ID = 0;
const FIELD_WITHOUT_NAME = '-';
public function getByProductAndPackageId($productId, $packageId = 0)
{
return Db::getInstance()->getRow('
SELECT s.*, s.product_id AS id_product
FROM '._DB_PREFIX_.'blmod_xml_product_settings s
WHERE s.product_id = "'.(int)$productId.'" AND s.package_id = "'.(int)$packageId.'"
');
}
public function getXmlByPackageId($packageId)
{
$settings = $this->getByPackageId($packageId);
if (empty($settings)) {
return array();
}
$settingsDefault = $this->getByPackageId($packageId, self::DEFAULT_SETTINGS_ID);
$settingsByProduct = array();
$fields = $this->getXmlFields();
$products = array();
foreach ($settings as $s) {
$settingsByProduct[$s['product_id']] = $s;
$settingsByProduct[$s['product_id']]['xml_custom'] = htmlspecialchars_decode($settingsByProduct[$s['product_id']]['xml_custom'], ENT_QUOTES);
$xml = '';
$fieldDeep = array();
foreach ($settingsByProduct[$s['product_id']] as $key => $v) {
if ($key == 'product_id') {
continue;
}
if (empty($v) && $v !== '0') {
$v = $settingsDefault[$key];
}
$fieldList = explode('/', $fields[$key]);
if (empty($fieldList[1])) {
if ($fields[$key] == self::FIELD_WITHOUT_NAME) {
$xml .= $v;
continue;
}
$xml .= '<'.$fields[$key].'>'.$v.'</'.$fields[$key].'>';
} else {
$fieldDeep[$fieldList[0]][$fieldList[1]] = (empty($v) && $v != 0) ? $settingsByProduct[0][$key] : $v;
}
}
foreach ($fieldDeep as $field => $secondLevel) {
$xml .= '<'.$field.'>';
foreach ($secondLevel as $fieldSecond => $v) {
$xml .= '<'.$fieldSecond.'>'.$v.'</'.$fieldSecond.'>';
}
$xml .= '</'.$field.'>';
}
$products[$s['product_id']] = $xml;
}
return $products;
}
public function getByPackageId($packageId, $productId = false)
{
$where = ($productId !== false) ? ' AND s.product_id = "'.(int)$productId.'"' : '';
$settings = Db::getInstance()->executeS('
SELECT s.product_id, s.total_budget, s.daily_budget, s.cpc, s.price_type, s.xml_custom
FROM '._DB_PREFIX_.'blmod_xml_product_settings s
WHERE s.package_id = "'.(int)$packageId.'"'.$where.'
ORDER BY s.product_id ASC
');
if (!empty($settings[0]) && $productId !== false) {
return $settings[0];
}
return $settings;
}
public function getXmlFields()
{
return array(
'total_budget' => 'admarkt:budget/admarkt:totalBudget',
'daily_budget' => 'admarkt:budget/admarkt:dailyBudget',
'cpc' => 'admarkt:budget/admarkt:cpc',
'price_type' => 'admarkt:priceType',
'xml_custom' => self::FIELD_WITHOUT_NAME,
);
}
}

View File

@@ -0,0 +1,135 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class ProductSettingsAdmin extends Xmlfeeds
{
protected $full_address_no_t = '';
protected $token = '';
protected $imageClassName = 'ImageCore';
protected $langId = 1;
protected $currentPageUrl = '';
public function getContent($full_address_no_t = '', $token = '')
{
$this->full_address_no_t = $full_address_no_t;
$this->token = $token;
$this->imageClassName = (!class_exists('ImageCore', false) || _PS_VERSION_ > '1.5.3') ? 'Image' : 'ImageCore';
$this->langId = (int)Configuration::get('PS_LANG_DEFAULT');
$this->currentPageUrl = str_replace('&page=', '&page_old=', $_SERVER['REQUEST_URI']);
$this->currentPageUrl = str_replace('&delete_product_setting_package=', '&delete_product_setting_package_old=', $this->currentPageUrl);
return '';
}
public function insertNewProductSettingsPackage()
{
$addNewList = Tools::getValue('add_product_settings_package');
$listName = Tools::getValue('product_setting_package_name');
if (empty($addNewList) || empty($listName)) {
return false;
}
Db::getInstance()->Execute('
INSERT INTO '._DB_PREFIX_.'blmod_xml_product_settings_package
(`name`)
VALUE
("'.pSQL($listName).'")
');
$packageId = Db::getInstance()->Insert_ID();
if (empty($packageId)) {
return false;
}
Db::getInstance()->Execute('
INSERT INTO '._DB_PREFIX_.'blmod_xml_product_settings
(`product_id`, `package_id`)
VALUE
("0", "'.pSQL($packageId).'")
');
return $packageId;
}
public function deleteProductSettingsPackage()
{
$packageId = Tools::getValue('delete_product_setting_package');
if (empty($packageId)) {
return false;
}
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_product_settings WHERE package_id = "'.(int)$packageId.'"');
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_product_settings_package WHERE id = "'.(int)$packageId.'"');
return true;
}
public function getProductSettingsPackagesList()
{
return Db::getInstance()->executeS('SELECT l.id, l.name
FROM `'._DB_PREFIX_.'blmod_xml_product_settings_package` l
ORDER BY l.name ASC');
}
public function getProducts($whereParam, $page, $packageId)
{
$where = !empty($whereParam) ? 'WHERE '.pSQL(implode(' AND ', $whereParam)) : '';
$limitFrom = ($page > 1) ? (($page - 1) * XmlFeedsTools::ITEM_IN_PAGE) : 0;
return Db::getInstance()->ExecuteS('SELECT DISTINCT(p.id_product), pl.name, im.id_image,
s.total_budget, s.daily_budget, s.cpc, s.price_type, s.xml_custom
FROM '._DB_PREFIX_.'product p
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON
(pl.id_product = p.id_product and pl.id_lang = "'.(int)$this->langId.'")
LEFT JOIN '._DB_PREFIX_.'image im ON
(im.id_product = p.id_product and im.cover = 1)
LEFT JOIN '._DB_PREFIX_.'blmod_xml_product_settings s ON
(s.product_id = p.id_product AND s.package_id = "'.(int)$packageId.'")
'.$where.'
GROUP BY p.id_product
ORDER BY p.id_product DESC
LIMIT '.(int)$limitFrom.', '.(int)XmlFeedsTools::ITEM_IN_PAGE);
}
public function save()
{
$totalBudget = Tools::getValue('total_budget');
$dailyBudget = Tools::getValue('daily_budget');
$cpc = Tools::getValue('cpc');
$priceType = Tools::getValue('price_type');
$xmlCustom = Tools::getValue('xml_custom');
$packageId = htmlspecialchars(Tools::getValue('product_setting_package_id'), ENT_QUOTES);
foreach ($totalBudget as $id => $total) {
$id = htmlspecialchars($id, ENT_QUOTES);
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'blmod_xml_product_settings WHERE product_id = "'.(int)$id.'" AND package_id = "'.(int)$packageId.'"');
Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'blmod_xml_product_settings
(`product_id`, `package_id`, `total_budget`, `daily_budget`, `cpc`, `price_type`, `xml_custom`, `updated_at`)
VALUES
("'.(int)$id.'", "'.(int)$packageId.'", "'.pSQL($total).'", "'.pSQL($dailyBudget[$id]).'",
"'.pSQL($cpc[$id]).'", "'.pSQL($priceType[$id]).'", "'.pSQL($xmlCustom[$id]).'", "'.pSQL(date('Y-m-d H:i:s')).'")');
}
return true;
}
}

View File

@@ -0,0 +1,206 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class ProductTitleEditor
{
const ADD_ALL_ATTRIBUTES = 1;
public function save($feedId)
{
$titleKey = Tools::getValue('title_replace_key');
$titleValue = Tools::getValue('title_replace_value');
$addElements = Tools::getValue('title_editor_add_elements');
$addAttributes = Tools::getValue('title_editor_add_attributes');
$options = Tools::getValue('title_editor_options');
$serializeList = '';
$newElementsSerialize = '';
if (empty($titleKey)) {
return false;
}
foreach ($titleKey as $k => $t) {
if (empty($t)) {
unset($titleKey[$k]);
unset($titleValue[$k]);
}
}
if (!empty($titleKey)) {
$serializeList = serialize(array(
'key' => $titleKey,
'value' => $titleValue,
));
}
if (!empty($addElements) || !empty($addAttributes) || !empty($options)) {
$newElementsSerialize = serialize(array(
'elements' => $addElements,
'attributes' => $addAttributes,
'options' => $options,
));
}
return Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'blmod_xml_feeds SET
title_replace = "'.pSQL($serializeList).'", title_new_elements = "'.pSQL($newElementsSerialize).'"
WHERE id = "'.(int)$feedId.'"');
}
public function getByFeedId($feedId, $withEmptyRow = false)
{
$list = Db::getInstance()->getValue('SELECT s.title_replace
FROM '._DB_PREFIX_.'blmod_xml_feeds s
WHERE s.id = "'.(int)$feedId.'"');
if (!empty($list)) {
return unserialize($list);
}
if ($withEmptyRow) {
return array(
'key' => array(0 => ''),
'value' => array(0 => ''),
);
}
return array();
}
public function replaceTitleByKey($title, $settings)
{
if (empty($settings)) {
return $title;
}
if (empty($settings['key'])) {
return $title;
}
foreach ($settings['key'] as $k => $f) {
$title = str_ireplace($f, $settings['value'][$k], $title);
}
return trim(trim($title), ',');
}
public function getNewElementsByFeedId($feedId, $withEmptyRow = false)
{
$list = Db::getInstance()->getValue('SELECT s.title_new_elements
FROM '._DB_PREFIX_.'blmod_xml_feeds s
WHERE s.id = "'.(int)$feedId.'"');
if (!empty($list)) {
$array = unserialize($list);
$array['elements'] = !empty($array['elements']) ? $array['elements'] : array();
$array['attributes'] = !empty($array['attributes']) ? $array['attributes'] : array();
$array['options'] = !empty($array['options']) ? $array['options'] : array();
return $array;
}
if ($withEmptyRow) {
return array(
'elements' => array(),
'attributes' => array(),
'options' => array(),
);
}
return array();
}
public function getAvailableNewTitleElementsList()
{
return array(
3 => 'Product ID',
4 => 'Reference',
5 => 'EAN-13',
6 => 'ISBN',
7 => 'Category',
8 => 'Manufacturer',
);
}
public function addElementsToTitle($title, $settings, $elementsByKey)
{
if (empty($settings['elements'])) {
return $title;
}
$newElements = array();
foreach ($settings['elements'] as $k) {
if (empty($elementsByKey[$k])) {
continue;
}
$newElements[] = $elementsByKey[$k];
}
return $title.' '.implode(' ', $newElements);
}
public function addAttributesToTile($title, $settings, $productAttributes)
{
$settings['elements'] = !empty($settings['elements']) ? $settings['elements'] : array();
$settings['attributes'] = !empty($settings['attributes']) ? $settings['attributes'] : array();
$settings['options'] = !empty($settings['options']) ? $settings['options'] : array();
$isAllAttributes = in_array(self::ADD_ALL_ATTRIBUTES, $settings['elements']);
$isAttributeWithName = in_array('attribute_name', $settings['options']);
if (empty($settings['attributes']) && !$isAllAttributes) {
return $title;
}
$attributes = array();
$title = trim($title);
foreach ($productAttributes as $a) {
if (in_array($a['id_attribute_group'], $settings['attributes']) || $isAllAttributes) {
$attributes[$a['public_group_name']][] = $a['attribute_name'];
}
}
foreach ($attributes as $k => $n) {
$title .= ', '.($isAttributeWithName ? $k.' ' : '').implode(' ', array_unique($n));
}
return $title;
}
public function titleTransformer($title, $settings)
{
if (!empty($settings['title_length'])) {
$title = Tools::substr($title, 0, $settings['title_length']);
}
if (!empty($settings['title_transform'])) {
switch ($settings['title_transform']) {
case 1:
return Tools::ucfirst(Tools::strtolower($title));
case 2:
return Tools::strtoupper($title);
case 3:
return Tools::strtolower($title);
}
}
return $title;
}
}

View File

@@ -0,0 +1,13 @@
## XML Feed Pro ##
The "XML Feeds Pro" module generates XML feeds of Prestashop products and categories. With this module you can share your database with other persons as exported to an XML files. If your database is big, you can enable cache and split to smaller XML files. You can also show only the fields, which you wish. You just need to select fields and enter a name (or leave default). If the data is confidential, you can add a password on your XML feed.
If you are using affiliate systems, you can track connections in statistics page (IP address, affiliate name, date, etc.). Moreover, usage of affiliate systems can provide different prices for different users. You only need to enter the formula, which calculates the price (e.g. price 9 or price + (price* 17 / 100)). In addition there is an option to display products only from selected categories (select from categories tree).
## Install instruction ##
The installation of module is very simple. Login to Prestashop admin panel, click on "Modules" tab. Then click "Add a new module" link and upload "XML Feeds Pro" module. After this just click “Install” button and it is done.
## Uninstall instruction ##
Just click "uninstall" button in Prestashop admin panel / modules.

View File

@@ -0,0 +1,86 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class SkroutzAnalyticsXml
{
protected $feedSettings;
public function __construct($feedSettings = [])
{
$this->feedSettings = $feedSettings;
}
public function getCombinationId($productId, $combinationId)
{
$langId = (int)Configuration::get('PS_LANG_DEFAULT');
$langId = !empty($langId) ? $langId : 1;
$combinationIdNew = $combinationId;
$mergeGroupId = $this->getAttributeMergeGroupId();
$productColorAttributeId = 0;
$allCombinationsWithTheSameColor = [];
if (empty($mergeGroupId)) {
return $combinationId;
}
$product_class = new Product($productId, false, $langId);
$combinations = $product_class->getAttributesResume($langId, ' ', ', ');
$productAttributes = $product_class->getAttributesGroups($langId);
if (empty($combinations)) {
return $combinationId;
}
foreach ($productAttributes as $p) {
if ($p['id_product_attribute'] == $combinationId && $p['id_attribute_group'] == $mergeGroupId) {
$productColorAttributeId = $p['id_attribute'];
break;
}
}
foreach ($productAttributes as $p) {
if ($productColorAttributeId == $p['id_attribute']) {
$allCombinationsWithTheSameColor[] = $p['id_product_attribute'];
}
}
if (!empty($allCombinationsWithTheSameColor)) {
foreach ($combinations as $c) {
if ($c['quantity'] < 1 && $this->feedSettings['only_in_stock']) {
continue;
}
if (in_array($c['id_product_attribute'], $allCombinationsWithTheSameColor)) {
return $c['id_product_attribute'];
}
}
}
return $combinationIdNew;
}
protected function getAttributeMergeGroupId()
{
if (empty($this->feedSettings['merge_attributes_parent'])) {
return 0;
}
return $this->feedSettings['merge_attributes_parent'];
}
}

View File

@@ -0,0 +1,67 @@
<?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
*/
$_POST = [];
$_FILES = [];
$_GET['module'] = 'xmlfeeds';
require(dirname(__FILE__).'/../../config/config.inc.php');
require(dirname(__FILE__).'/../../modules/xmlfeeds/FeedType.php');
class TypeSearch extends ModuleFrontController
{
public function __construct()
{
$this->module = 'xmlfeeds';
parent::__construct();
}
public function init()
{
$this->context->smarty->assign([
'tpl_dir' => _PS_MODULE_DIR_.'xmlfeeds/',
'feedTypeList' => $this->filterTypes(),
'contactUsUrl' => 'https://addons.prestashop.com/en/contact-us?id_product=5732',
]);
echo $this->context->smarty->fetch(_PS_MODULE_DIR_.'xmlfeeds/views/templates/admin/page/searchFeedTypeApi.tpl');
}
protected function filterTypes()
{
$FeedType = new FeedType();
$types = $FeedType->getAllTypes();
$search = Tools::strtolower(htmlspecialchars(Tools::getValue('s'), ENT_QUOTES));
if (empty($search)) {
return $types;
}
foreach ($types as $k => $v) {
$name = Tools::strtolower($v['name']);
if (strpos($name, $search) === false) {
unset($types[$k]);
}
}
return $types;
}
}
$typeSearch = new TypeSearch();
$typeSearch->init();

View File

@@ -0,0 +1,83 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class XmlExportSettings
{
private $version = '';
private $name = '';
public function isExportAction($version = '', $name = '')
{
$isExportSettings = Tools::getValue('export_settings');
if (empty($isExportSettings)) {
return false;
}
$this->version = $version;
$this->name = $name;
$this->downloadSettings();
return true;
}
private function downloadSettings()
{
$mysqlInfo = Db::getInstance()->ExecuteS('SHOW VARIABLES LIKE "version"');
$file = $this->name.' '.$this->version."\n";
$file .= 'PrestaShop '._PS_VERSION_."\n";
$file .= 'PHP '.PHP_VERSION."\n";
$file .= 'MySQL '.(!empty($mysqlInfo[0]['Value']) ? $mysqlInfo[0]['Value'] : 'none')."\n";
$file .= date('Y-m-d H:i:s');
$tables = Db::getInstance()->ExecuteS('SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE "'. _DB_PREFIX_.'blmod_xml%" AND TABLE_SCHEMA = "'.pSQL(_DB_NAME_).'"
ORDER BY TABLE_NAME ASC');
if (!empty($tables)) {
foreach ($tables as $t) {
$file .= "\n\n".'------------------------------------------------------'."\n\n".$t['TABLE_NAME']."\n\n";
$fields = Db::getInstance()->ExecuteS('SHOW FULL COLUMNS FROM '.pSQL($t['TABLE_NAME']));
$file .= serialize($fields) . "\n\n";
if ($t['TABLE_NAME'] == _DB_PREFIX_.'blmod_xml_access_log' || $t['TABLE_NAME'] == _DB_PREFIX_.'blmod_xml_statistics') {
$values = Db::getInstance()->ExecuteS('SELECT *
FROM '.pSQL($t['TABLE_NAME']).'
ORDER BY id DESC
LIMIT 200');
} else {
$values = Db::getInstance()->ExecuteS('SELECT *
FROM '.pSQL($t['TABLE_NAME']));
}
$file .= serialize($values);
}
}
header('Content-Disposition: attachment; filename="xmlfeedspro_settings_'.date('Ymd_His').'.txt"');
header('Content-Type: text/plain; charset:UTF-8');
header('Connection: close');
echo $file;
die();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,32 @@
<?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 XmlFeedUrl
{
public function get($param = '')
{
if (_PS_VERSION_ < '1.5') {
$xmlfeeds = new Xmlfeeds();
return $xmlfeeds->getShopProtocol().$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/'.$xmlfeeds->name.'/api/xml.php?'.$param;
}
$link = new Link();
$url = $link->getModuleLink('xmlfeeds', 'api');
$separator = strpos($url, '?') === false ? '?' : '&';
return $url.$separator.$param;
}
}

View File

@@ -0,0 +1,137 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class XmlFeedsTools
{
const ITEM_IN_PAGE = 50;
const DEFAULT_IMG = 'small';
public static $pageName = '1';
public static function isIsbnExists()
{
return property_exists('Product', 'isbn');
}
public static function dateAddDays($days = 0)
{
return date('Y-m-d', strtotime(date('Y-m-d').'+'.$days.'days'));
}
public static function dateMinusDays($days = 0)
{
return date('Y-m-d', strtotime(date('Y-m-d').'-'.$days.'days'));
}
public static function getImageType()
{
return (_PS_VERSION_ >= '1.5.1') ? self::DEFAULT_IMG.'_default' : self::DEFAULT_IMG;
}
public static function pagination($page = 1, $maxInPage = 10, $totalInvoice = 0, $pageAddress = false, $selectorName = 'page')
{
$container = 'div';
$style = 'class';
$link = 'a';
$currentPage = $page;
$html = '<'.$container.' '.$style.'="pagination">';
if (empty($page)) {
$page = 1;
$currentPage = 1;
}
if ($maxInPage >= $totalInvoice) {
$html .= '</'.$container.'>';
return array (0, $maxInPage, $html);
}
$start = ($maxInPage * $page) - $maxInPage;
if ($totalInvoice <= $maxInPage) {
$num_of_pages = 1;
} elseif (($totalInvoice % $maxInPage) == 0) {
$num_of_pages = $totalInvoice / $maxInPage;
} else {
$num_of_pages = $totalInvoice / $maxInPage + 1;
}
if ($currentPage > 1) {
$back = $currentPage - 1;
$html .= '<'.$link.' href = "'.$pageAddress.$selectorName.'='.$back.'">«</'.$link.'>' . ' ';
}
$html .= '|';
$num_of_pages_f = (int)$num_of_pages;
if ($currentPage - 4 > 1) {
$html .= '<'.$link.' href = "'.$pageAddress.$selectorName.'=1">1</'.$link.'>|';
}
if ($currentPage - 5 > 1) {
$html .= ' ... |';
}
$firs_element = $currentPage - 4;
if ($firs_element < 1) {
$firs_element = 1;
}
for ($i = $firs_element; $i < $currentPage; $i++) {
$html .= '<'.$link.' href = "'.$pageAddress.$selectorName.'='.$i.'">'.$i.'</'.$link.'>|';
}
$html .= ' '.$currentPage . ' |';
for ($i = $currentPage + 1; $i < $currentPage + 5; $i++) {
if ($i > $num_of_pages_f) {
break;
}
$html .= '<'.$link.' href = "'.$pageAddress.$selectorName.'='.$i.'">'.$i.'</'.$link.'>|';
}
if ($currentPage + 5 < $num_of_pages_f) {
$html .= ' ... |';
}
if ($currentPage + 4 < $num_of_pages_f) {
$html .= '<'.$link.' href = "'.$pageAddress.$selectorName.'='.$num_of_pages_f.'">'.$num_of_pages_f.'</'.$link.'>|';
}
if ($currentPage + 1 < $num_of_pages) {
$next = $currentPage + 1;
$html .= '<'.$link.' href = "'.$pageAddress.$selectorName.'='.$next.'">»</'.$link.'>';
}
$html .= '</'.$container.'>';
return array($start, $maxInPage, $html);
}
public static function getUrlProtocolWithoutSlash()
{
if (method_exists('Tools', 'getShopProtocol')) {
return str_replace('/', '', Tools::getShopProtocol());
}
return (Configuration::get('PS_SSL_ENABLED') || (!empty($_SERVER['HTTPS'])
&& Tools::strtolower($_SERVER['HTTPS']) != 'off')) ? 'https:' : 'http:';
}
}

View File

@@ -0,0 +1,81 @@
<?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 BrandXmlApi
{
protected $settings = array();
protected $feedLangId = 1;
protected $protocol = '';
public function getFeed($settings, $protocol)
{
$this->settings = $settings;
$this->feedLangId = (int)Configuration::get('PS_LANG_DEFAULT');
$this->protocol = $protocol;
return $this->generateXml($this->getBrands());
}
protected function generateXml($brands)
{
$xml = '<items>';
if (empty($brands)) {
return '</items>';
}
$link = new Link();
$addImage = method_exists($link, 'getManufacturerImageLink');
foreach ($brands as $b) {
if ($addImage) {
$logoUrl = $link->getManufacturerImageLink($b['id_manufacturer']);
if (!empty($logoUrl) && Tools::substr($logoUrl, 0, 4) != 'http') {
$logoUrl = $this->protocol . $logoUrl;
}
}
$xml .= '<item>';
$xml .= '<id><![CDATA['.$b['id_manufacturer'].']]></id>';
$xml .= '<name><![CDATA['.$b['name'].']]></name>';
$xml .= '<url><![CDATA[' . $link->getManufacturerLink($b['id_manufacturer'], null, (int)$this->feedLangId) . ']]></url>';
$xml .= '<date_add><![CDATA['.$b['date_add'].']]></date_add>';
$xml .= '<date_upd><![CDATA['.$b['date_upd'].']]></date_upd>';
$xml .= '<description><![CDATA['.strip_tags($b['description']).']]></description>';
$xml .= '<short_description><![CDATA['.strip_tags($b['short_description']).']]></short_description>';
$xml .= !empty($logoUrl) ? '<logo><![CDATA['.$logoUrl.']]></logo>' : '';
$xml .= '<active><![CDATA['.$b['active'].']]></active>';
$xml .= '</item>';
}
$xml .= '</items>';
return $xml;
}
protected function getBrands()
{
return Db::getInstance()->ExecuteS('
SELECT m.*, l.description, l.short_description
FROM '._DB_PREFIX_.'manufacturer m
LEFT JOIN '._DB_PREFIX_.'manufacturer_lang l ON
(l.id_manufacturer = m.id_manufacturer AND l.id_lang = "'.(int)$this->feedLangId.'")
WHERE m.`active` = 1
ORDER BY m.name ASC
');
}
}

View File

@@ -0,0 +1,237 @@
<?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 CategoryXmlApi
{
public function getFeed($id = 0,
$pref_s = '',
$pref_e = '',
$html_tags_status = false,
$extra_feed_row = false,
$one_branch = false,
$only_enabled = false,
$multistoreString = false,
$settings = []
) {
$block_name = array();
$xml_name = array();
$xml_name_l = array();
$all_l_iso = array();
$id_lang = Configuration::get('PS_LANG_DEFAULT');
$categoryTreeSeparator = !empty($settings['category_tree_separator']) ? $settings['category_tree_separator'] : ' > ';
$toolsR = new ReflectionMethod('Tools', 'getPath');
$totalGetPathMethods = $toolsR->getNumberOfRequiredParameters();
$block_n = Db::getInstance()->ExecuteS('SELECT `name`, `value`
FROM '._DB_PREFIX_.'blmod_xml_block
WHERE category = "'.(int)$id.'"');
foreach ($block_n as $bn) {
$block_name[$bn['name']] = $bn['value'];
}
$r = Db::getInstance()->ExecuteS('SELECT `name`, `status`, `title_xml`, `table`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `table` != "lang" AND `table` != "category_lang" AND status = 1
AND `table` != "bl_extra"
ORDER BY `table` ASC');
$extra_field = Db::getInstance()->ExecuteS('SELECT `name`, `title_xml`, CONCAT(`table`, "_", `name`) AS field_key
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `table` = "bl_extra" AND status = 1');
$field = '';
if (!empty($r)) {
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'];
}
if (empty($field)) {
exit;
}
$field = ','.trim($field, ',');
}
$where_only_actyve = '';
if (!empty($only_enabled)) {
$where_only_actyve = 'WHERE '._DB_PREFIX_.'category.active = "1"';
}
if (!empty($multistoreString)) {
if (empty($where_only_actyve)) {
$where_only_actyve = 'WHERE '._DB_PREFIX_.'category.id_shop_default IN ('.(int)$multistoreString.')';
} else {
$where_only_actyve .= ' AND '._DB_PREFIX_.'category.id_shop_default IN ('.(int)$multistoreString.')';
}
}
$sql = 'SELECT DISTINCT('._DB_PREFIX_.'category.id_category) AS cat_id '.pSQL($field).'
FROM '._DB_PREFIX_.'category
LEFT JOIN '._DB_PREFIX_.'category_group ON
'._DB_PREFIX_.'category_group.id_category = '._DB_PREFIX_.'category.id_category '.
$where_only_actyve;
$xml_d = Db::getInstance()->ExecuteS($sql);
//Language
$l = Db::getInstance()->ExecuteS('SELECT `name`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `table` = "lang"');
$xml_lf = array();
$link_class = new Link();
if (!empty($l)) {
$l_where = '';
$count_lang = count($l);
foreach ($l as $ll) {
$l_where .= 'OR '._DB_PREFIX_.'category_lang.id_lang='.(int)$ll['name'].' ';
}
$l_where = trim($l_where, 'OR');
$rl = Db::getInstance()->ExecuteS('SELECT `name`, `status`, `title_xml`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$id.'" AND `table` = "category_lang" AND `status` = 1');
$field = '';
if (!empty($rl)) {
foreach ($rl as $fl) {
$field .= ' `'._DB_PREFIX_.'category_lang`.`'.$fl['name'].'`,';
$xml_name_l[$fl['name']] = $fl['title_xml'];
}
$field = ','.trim($field, ',');
}
$xml_l = Db::getInstance()->ExecuteS('SELECT '._DB_PREFIX_.'category_lang.id_category, '._DB_PREFIX_.'lang.iso_code as blmodxml_l '.pSQL($field).'
FROM '._DB_PREFIX_.'category_lang
LEFT JOIN '._DB_PREFIX_.'lang ON
'._DB_PREFIX_.'lang.id_lang = '._DB_PREFIX_.'category_lang.id_lang
WHERE '.$l_where.'
ORDER BY '._DB_PREFIX_.'category_lang.id_category ASC');
foreach ($xml_l as $xll) {
$id_cat = $xll['id_category'];
$l_iso = $xll['blmodxml_l'];
$all_l_iso[] = $l_iso;
$lang_prefix = '-'.$l_iso;
if ($count_lang < 2) {
$id_lang = $l[0]['name'];
$lang_prefix = '';
}
if (empty($one_branch)) {
$xml_lf[$id_cat.$l_iso] = '<'.$block_name['desc-block-name'].$lang_prefix.'>';
} else {
$xml_lf[$id_cat.$l_iso] = '';
}
foreach ($xll as $idl => $vall) {
if ($idl == 'id_category' || $idl == 'blmodxml_l') {
continue;
}
$vall = isset($vall) ? $vall : false;
if ($html_tags_status) {
$vall = strip_tags($vall);
}
$xml_lf[$id_cat.$l_iso] .= '<'.$xml_name_l[$idl].$lang_prefix.'>'.$pref_s.htmlspecialchars($vall).$pref_e.'</'.$xml_name_l[$idl].$lang_prefix.'>';
}
if (empty($one_branch)) {
$xml_lf[$id_cat.$l_iso] .= '</'.$block_name['desc-block-name'].$lang_prefix.'>';
}
}
$all_l_iso = array_unique($all_l_iso);
}
$xml = '<'.$block_name['file-name'].'>';
$xml .= $extra_feed_row;
foreach ($xml_d as $xdd) {
$xml .= '<'.$block_name['cat-block-name'].'>';
foreach ($xdd as $id => $val) {
if ($id == 'cat_id') {
continue;
}
$val = isset($val) ? $val : false;
$xml .= '<'.$xml_name[$id].'>'.$pref_s.$val.$pref_e.'</'.$xml_name[$id].'>';
}
$id_cat = $xdd['cat_id'];
if (!empty($all_l_iso)) {
foreach ($all_l_iso as $iso) {
$xml_lf[$id_cat.$iso] = isset($xml_lf[$id_cat.$iso]) ? $xml_lf[$id_cat.$iso] : false;
$xml .= $xml_lf[$id_cat.$iso];
}
}
if (!empty($extra_field)) {
foreach ($extra_field as $b_e) {
if ($b_e['name'] == 'category_url_blmod') {
$xml .= '<'.$b_e['title_xml'].'>'.$pref_s.$link_class->getCategoryLink($id_cat, null, $id_lang).$pref_e.'</'.$b_e['title_xml'].'>';
}
if ($b_e['name'] == 'product_categories_tree') {
$xml .= '<'.$b_e['title_xml'].'>'.$pref_s.$this->getTree($totalGetPathMethods, $id_cat, $categoryTreeSeparator, $id_lang).$pref_e.'</'.$b_e['title_xml'].'>';
}
}
}
$xml .= '</'.$block_name['cat-block-name'].'>';
}
$xml .= '</'.$block_name['file-name'].'>';
return $xml;
}
public function getTree($totalGetPathMethods, $categoryId, $separator, $langId)
{
$path = '';
if ($totalGetPathMethods == 2) {
$path = Tools::getPath('', $categoryId);
} elseif ($totalGetPathMethods == 1) {
$path = Tools::getPath($categoryId);
}
$path = htmlspecialchars_decode(strip_tags($path), ENT_QUOTES);
$fullPath = str_replace('>', $separator, $path);
if (!empty($fullPath)) {
return $fullPath;
}
$category = new Category($categoryId, $langId);
return $category->name;
}
}

View File

@@ -0,0 +1,72 @@
<?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 CustomerXmlApi
{
protected $settings = array();
protected $feedLangId = 1;
public function getFeed($settings)
{
$this->settings = $settings;
$this->feedLangId = (int)Configuration::get('PS_LANG_DEFAULT');
return $this->generateXml($this->getCustomers());
}
protected function generateXml($customers)
{
$xml = '<items>';
if (empty($customers)) {
return '</items>';
}
foreach ($customers as $b) {
$xml .= '<item>';
$xml .= '<id><![CDATA['.$b['id_customer'].']]></id>';
$xml .= '<id_gender><![CDATA['.$b['id_gender'].']]></id_gender>';
$xml .= '<social_title><![CDATA['.$b['social_title'].']]></social_title>';
$xml .= '<firstname><![CDATA['.$b['firstname'].']]></firstname>';
$xml .= '<lastname><![CDATA['.$b['lastname'].']]></lastname>';
$xml .= '<email><![CDATA['.$b['email'].']]></email>';
$xml .= '<birthday><![CDATA['.$b['birthday'].']]></birthday>';
$xml .= '<newsletter><![CDATA['.$b['newsletter'].']]></newsletter>';
$xml .= '<newsletter_date_add><![CDATA['.$b['newsletter_date_add'].']]></newsletter_date_add>';
$xml .= '<website><![CDATA['.$b['website'].']]></website>';
$xml .= '<is_guest><![CDATA['.$b['is_guest'].']]></is_guest>';
$xml .= '<date_add><![CDATA['.$b['date_add'].']]></date_add>';
$xml .= '<date_upd><![CDATA['.$b['date_upd'].']]></date_upd>';
$xml .= '<active><![CDATA['.$b['active'].']]></active>';
$xml .= '</item>';
}
$xml .= '</items>';
return $xml;
}
protected function getCustomers()
{
return Db::getInstance()->ExecuteS('
SELECT c.*, gl.name AS social_title
FROM '._DB_PREFIX_.'customer c
LEFT JOIN '._DB_PREFIX_.'gender_lang gl ON
(c.id_gender = gl.id_gender AND gl.id_lang = "'.(int)$this->feedLangId.'")
WHERE c.`deleted` = 0
ORDER BY c.date_add DESC
');
}
}

View File

@@ -0,0 +1,524 @@
<?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 OrderXmlApi
{
protected $feedId = 0;
protected $settings = array();
protected $fieldsName = array();
protected $fieldsNameAdditionTable = array();
protected $feedLangId = 1;
protected $countryList = array();
protected $stateList = array();
protected $branchNames = array();
protected $prefixStart = '';
protected $prefixEnd = '';
protected $currency = false;
protected $totalProducts = 0;
public function getFeed($settings)
{
$this->settings = $settings;
$this->feedLangId = (int)Configuration::get('PS_LANG_DEFAULT');
$this->feedId = (int)$settings['id'];
$this->currency = Currency::getCurrency(!empty($settings['currency_id']) ? $settings['currency_id'] : Configuration::get('PS_CURRENCY_DEFAULT'));
$this->branchNames = $this->getBranchNames();
$this->loadAddressData();
$orders = $this->getOrders();
return $this->generateXml($orders);
}
protected function generateXml($orders)
{
$xml = $this->getDeepTagName($this->branchNames['orders-branch-name']);
if (!empty($this->settings['extra_feed_row'])) {
$xml .= $this->settings['extra_feed_row'];
}
if (!empty($this->settings['cdata_status'])) {
$this->prefixStart = '<![CDATA[';
$this->prefixEnd = ']]>';
}
foreach ($orders as $order) {
$xmlOrder = $this->getDeepTagName($this->branchNames['order-branch-name']);
$productsBranch = $this->generateXmlAddProducts($order['order_id']);
foreach ($order as $id => $val) {
if (empty($this->fieldsName[$id])) {
continue;
}
if ($this->isPriceField($id)) {
$val = $this->getPriceFormat($val);
}
$xmlOrder .= $this->getDeepTagName($this->fieldsName[$id]).$this->prefixStart.$val.$this->prefixEnd.$this->getDeepTagName($this->fieldsName[$id], true);
}
foreach ($this->fieldsName as $fieldId => $fieldName) {
if (strpos($fieldId, 'bl_extra_') !== 0) {
continue;
}
$method = 'extraField'.str_replace(' ', '', ucwords(str_replace(array('bl_extra_', '_'), array('', ' '), $fieldId)));
$xmlOrder .= $this->getDeepTagName($fieldName).$this->$method($order).$this->getDeepTagName($fieldName, true);
}
$xml .= $this->replaceXmlTree($xmlOrder);
$xml .= $productsBranch;
$xml .= $this->getDeepTagName($this->branchNames['order-branch-name'], true);
}
$xml .= $this->getDeepTagName($this->branchNames['orders-branch-name'], true);
return $xml;
}
protected function generateXmlAddProducts($orderId)
{
$xml = '';
$this->totalProducts = 0;
if (empty($this->fieldsNameAdditionTable['od'])) {
return $xml;
}
$products = $this->getProducts($orderId);
if (!empty($products)) {
$this->totalProducts = count($products);
$xml = $this->getDeepTagName($this->branchNames['products-branch-name']);
foreach ($products as $product) {
$xml .= $this->getDeepTagName($this->branchNames['product-branch-name']);
$xmlOrder = '';
foreach ($product as $id => $val) {
if ($this->isPriceField($id)) {
$val = $this->getPriceFormat($val);
}
if ($this->isNumberField($id)) {
$val = $this->getNumberFormat($val);
}
$xmlOrder .= $this->getDeepTagName($this->fieldsName[$id]).$this->prefixStart.$val.$this->prefixEnd.$this->getDeepTagName($this->fieldsName[$id], true);
}
$xml .= $this->replaceXmlTree($xmlOrder);
$xml .= $this->getDeepTagName($this->branchNames['product-branch-name'], true);
}
$xml .= $this->getDeepTagName($this->branchNames['products-branch-name'], true);
}
return $xml;
}
protected function getOrders()
{
$field = $this->getFields();
return Db::getInstance()->ExecuteS('SELECT DISTINCT(o.id_order) AS order_id, ad.address1, ad.address2, ad.postcode, ad.city, ad.id_country, ad.id_state,
ad.company, ad.phone, ad.phone_mobile, ad.vat_number, ad.firstname AS firstname_d, ad.lastname AS lastname_d,
ai.address1 AS address1_i, ai.address2 AS address2_i, ai.postcode AS postcode_i, ai.city AS city_i,
ai.id_country AS id_country_i, ai.id_state AS id_state_i,
ai.company AS company_i, ai.phone AS phone_i, ai.phone_mobile AS phone_mobile_i, ai.vat_number AS vat_number_i,
ai.firstname AS firstname_i, ai.lastname AS lastname_i, o.total_paid_tax_excl AS total_paid_t_e,
o.total_paid_tax_incl AS total_paid_t_i'.pSQL($field).'
FROM '._DB_PREFIX_.'orders o
LEFT JOIN '._DB_PREFIX_.'order_state_lang sl ON
(sl.id_order_state = o.current_state AND sl.id_lang = "'.(int)$this->feedLangId.'")
LEFT JOIN '._DB_PREFIX_.'customer c ON
c.`id_customer` = o.`id_customer`
LEFT JOIN '._DB_PREFIX_.'address ad ON
ad.id_address = o.id_address_delivery
LEFT JOIN '._DB_PREFIX_.'address ai ON
ai.id_address = o.id_address_invoice
LEFT JOIN '._DB_PREFIX_.'carrier cr ON
cr.id_carrier = o.id_carrier'.$this->getOrdersFilter());
}
protected function getOrdersFilter()
{
$where = array();
if (!empty($this->settings['order_state_status']) && !empty($this->settings['order_state'])) {
$where[] = 'sl.id_order_state IN ('.pSQL($this->settings['order_state']).')';
}
if (!empty($this->settings['order_payments_status']) && !empty($this->settings['order_payment'])) {
$where[] = 'o.module IN ("'.str_replace(',', '","', pSQL($this->settings['order_payment'])).'")';
}
if (!empty($this->settings['filter_date_type'])) {
$dateToday = pSQL(date('Y-m-d').' 00:00:00');
$filterByDate = array(
OrderSettings::FILTER_DATE_NONE => '',
OrderSettings::FILTER_DATE_TODAY => 'o.date_add >= "'.pSQL($dateToday).'"',
OrderSettings::FILTER_DATE_YESTERDAY => 'o.date_add >= "'.pSQL(date('Y-m-d', strtotime('-1 day', strtotime($dateToday)))).' 00:00:00" AND o.date_add < "'.pSQL($dateToday).'"',
OrderSettings::FILTER_DATE_THIS_WEEK => 'o.date_add >= "'.pSQL(date('Y-m-d', strtotime('this week', time()))).' 00:00:00"',
OrderSettings::FILTER_DATE_THIS_MONTH => 'o.date_add >= "'.pSQL(date('Y-m-01')).' 00:00:00"',
OrderSettings::FILTER_DATE_THIS_YEAR => 'o.date_add >= "'.pSQL(date('Y-01-01')).' 00:00:00"',
OrderSettings::FILTER_DATE_CUSTOM_DAYS => 'o.date_add >= "'.pSQL(date('Y-m-d', strtotime('-'.(int)$this->settings['filter_custom_days'].' day', strtotime($dateToday)))).' 00:00:00"',
OrderSettings::FILTER_DATE_DATE_RANGE => 'o.date_add >= "'.pSQL($this->settings['filter_date_from']).' 00:00:00" AND o.date_add <= "'.pSQL($this->settings['filter_date_to']).' 23:59:59" ',
);
$where[] = $filterByDate[$this->settings['filter_date_type']];
}
return !empty($where) ? ' WHERE '.implode(' AND ', $where) : '';
}
protected function getProducts($orderId)
{
return Db::getInstance()->ExecuteS('
SELECT '.pSQL(trim($this->fieldsNameAdditionTable['od'], ',')).'
FROM '._DB_PREFIX_.'order_detail od
LEFT JOIN '._DB_PREFIX_.'product p ON
p.`id_product` = od.`product_id`
LEFT JOIN '._DB_PREFIX_.'order_detail_tax dt ON
dt.id_order_detail = od.id_order_detail
LEFT JOIN '._DB_PREFIX_.'tax t ON
t.id_tax = dt.id_tax
WHERE od.id_order = "'.(int)$orderId.'"
ORDER BY od.id_order_detail ASC');
}
protected function getFields()
{
$fields = Db::getInstance()->ExecuteS('SELECT `name`, `status`, `title_xml`, `table`
FROM '._DB_PREFIX_.'blmod_xml_fields
WHERE category = "'.(int)$this->feedId.'" AND status = "1"
ORDER BY `table` ASC');
$field = '';
$tableMap = array(
'orders' => 'o',
'order_state_lang' => 'sl',
'customer' => 'c',
'order_detail' => 'od',
'address' => 'ad',
'product' => 'p',
'tax' => 't',
'carrier' => 'cr',
);
if (!empty($fields)) {
foreach ($fields as $f) {
$this->fieldsName[$f['table'].'_'.$f['name']] = $f['title_xml'];
if ($f['table'] == 'bl_extra') {
continue;
}
$table = $tableMap[$f['table']];
if ($f['table'] == 'order_detail' || $f['table'] == 'product' || $f['table'] == 'tax') {
if (empty($this->fieldsNameAdditionTable['od'])) {
$this->fieldsNameAdditionTable['od'] = '';
}
$this->fieldsNameAdditionTable['od'] .= $table.'.`'.$f['name'].'` AS '.$f['table'].'_'.$f['name'].',';
continue;
}
$field .= $table.'.`'.$f['name'].'` AS '.$f['table'].'_'.$f['name'].',';
}
if (empty($field)) {
return '';
}
$field = ','.trim($field, ',');
}
return $field;
}
protected function extraFieldAddress($order, $prefix = '')
{
$final = array();
$final[] = $order['address1'.$prefix];
$final[] = $order['address2'.$prefix];
$final[] = $order['postcode'.$prefix];
$final[] = $order['city'.$prefix];
$final[] = !empty($this->stateList[$order['id_country'.$prefix]][$order['id_state'.$prefix]]) ? $this->stateList[$order['id_country'.$prefix]][$order['id_state'.$prefix]] : '';
$final[] = $order['postcode'.$prefix];
return implode(' ', array_filter($final)).(!empty($this->countryList[$order['id_country'.$prefix]]) ? ', '.$this->countryList[$order['id_country'.$prefix]] : '');
}
protected function extraFieldDeliveryAddress($order)
{
$country = !empty($this->countryList[$order['id_country']]) ? $this->countryList[$order['id_country']] : '';
return '<firstname>'.$this->prefixStart.$order['firstname_d'].$this->prefixEnd.'</firstname>
<lastname>'.$this->prefixStart.$order['lastname_d'].$this->prefixEnd.'</lastname>
<company>'.$this->prefixStart.$order['company'].$this->prefixEnd.'</company>
<vat_number>'.$this->prefixStart.$order['vat_number'].$this->prefixEnd.'</vat_number>
<address_line1>'.$this->prefixStart.$order['address1'].$this->prefixEnd.'</address_line1>
<address_line2>'.$this->prefixStart.$order['address2'].$this->prefixEnd.'</address_line2>
<post_code>'.$this->prefixStart.$order['postcode'].$this->prefixEnd.'</post_code>
<city>'.$this->prefixStart.$order['city'].$this->prefixEnd.'</city>
<country>'.$this->prefixStart.$country.$this->prefixEnd.'</country>
<phone>'.$this->prefixStart.$order['phone'].$this->prefixEnd.'</phone>
<phone_mobile>'.$this->prefixStart.$order['phone_mobile'].$this->prefixEnd.'</phone_mobile>';
}
protected function extraFieldInvoiceAddress($order)
{
$country = !empty($this->countryList[$order['id_country_i']]) ? $this->countryList[$order['id_country_i']] : '';
return '<firstname>'.$this->prefixStart.$order['firstname_i'].$this->prefixEnd.'</firstname>
<lastname>'.$this->prefixStart.$order['lastname_i'].$this->prefixEnd.'</lastname>
<company>'.$this->prefixStart.$order['company_i'].$this->prefixEnd.'</company>
<vat_number>'.$this->prefixStart.$order['vat_number_i'].$this->prefixEnd.'</vat_number>
<address_line1>'.$this->prefixStart.$order['address1_i'].$this->prefixEnd.'</address_line1>
<address_line2>'.$this->prefixStart.$order['address2_i'].$this->prefixEnd.'</address_line2>
<post_code>'.$this->prefixStart.$order['postcode_i'].$this->prefixEnd.'</post_code>
<city>'.$this->prefixStart.$order['city_i'].$this->prefixEnd.'</city>
<country>'.$this->prefixStart.$country.$this->prefixEnd.'</country>
<phone>'.$this->prefixStart.$order['phone_i'].$this->prefixEnd.'</phone>
<phone_mobile>'.$this->prefixStart.$order['phone_mobile_i'].$this->prefixEnd.'</phone_mobile>';
}
protected function extraFieldCountry($order)
{
return (!empty($this->countryList[$order['id_country']]) ? $this->countryList[$order['id_country']] : '');
}
protected function extraFieldCity($order)
{
return !empty($order['city']) ? $order['city'] : '';
}
protected function extraFieldPostcode($order)
{
return !empty($order['postcode']) ? $order['postcode'] : '';
}
protected function extraFieldCurrency($order)
{
return !empty($this->currency['iso_code']) ? $this->currency['iso_code'] : '';
}
protected function extraFieldTaxTotalAmount($order)
{
return $this->getPriceFormat($order['total_paid_t_i'] - $order['total_paid_t_e']);
}
protected function extraFieldCustomerMessage($order)
{
return $this->getMessagesBranch($order['order_id']);
}
protected function extraFieldEmployeeMessage($order)
{
return $this->getMessagesBranch($order['order_id'], false);
}
protected function extraFieldVatNumberInvoice($order)
{
return !empty($order['vat_number_i']) ? $order['vat_number_i'] : '';
}
protected function extraFieldTotalProducts($order)
{
if (!empty($this->totalProducts)) {
return $this->totalProducts;
}
return Db::getInstance()->getValue('SELECT COUNt(od.id_order_detail)
FROM '._DB_PREFIX_.'order_detail od
WHERE od.id_order = '.(int)$order['order_id']);
}
protected function loadAddressData()
{
$countries = Db::getInstance()->ExecuteS('SELECT id_country, `name`
FROM `'._DB_PREFIX_.'country_lang`
WHERE `id_lang` = '.(int)$this->feedLangId);
foreach ($countries as $c) {
$this->countryList[$c['id_country']] = $c['name'];
}
$states = Db::getInstance()->ExecuteS('SELECT id_state, id_country, `name`
FROM `'._DB_PREFIX_.'state`');
foreach ($states as $s) {
$this->stateList[$s['id_country']][$s['id_state']] = $s['name'];
}
}
protected function getMessagesBranch($orderId, $isCustomerMessages = true)
{
$xml = '';
$where = $isCustomerMessages ? '=' : '>';
$messages = Db::getInstance()->ExecuteS('SELECT ct.id_customer_thread, cm.`message`, cm.`date_add`, cm.`private`
FROM '._DB_PREFIX_.'customer_thread ct
LEFT JOIN '._DB_PREFIX_.'customer_message cm ON
cm.id_customer_thread = ct.id_customer_thread
WHERE ct.id_order = '.(int)$orderId.' AND cm.`id_employee` '.pSQL($where).' 0
ORDER BY cm.id_customer_message DESC');
if (!empty($messages)) {
foreach ($messages as $m) {
$xml .= '<message>';
$xml .= '<text>'.$this->prefixStart.$m['message'].$this->prefixEnd.'</text>';
$xml .= '<date_add>'.$this->prefixStart.$m['date_add'].$this->prefixEnd.'</date_add>';
$xml .= '<is_private>'.$this->prefixStart.$m['private'].$this->prefixEnd.'</is_private>';
$xml .= '</message>';
}
}
return $xml;
}
protected function getBranchNames()
{
$branchNamesKey = array();
$branchNames = Db::getInstance()->ExecuteS('SELECT `name`, `value`, `category`
FROM '._DB_PREFIX_.'blmod_xml_block
WHERE category = "'.(int)$this->feedId.'"
');
foreach ($branchNames as $bl) {
$branchNamesKey[$bl['name']] = isset($bl['value']) ? $bl['value'] : $bl['name'];
}
return $branchNamesKey;
}
protected 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;
}
protected function getDeepTagName($tag = '', $close = false)
{
if (empty($tag)) {
return '';
}
if (strpos($tag, '/') === false) {
return '<'.($close ? '/' : '').$tag.'>';
}
if ($close) {
return '</vBLMOD></sBLMOD>';
}
return '<sBLMOD><nBLMOD>'.str_replace('/', '_lBLMOD_', $tag).'</nBLMOD><vBLMOD>';
}
protected function getPriceFormat($price = 0)
{
if (!empty($this->settings['currency_id'])) {
$price = Tools::convertPrice($price, $this->settings['currency_id']);
}
$price = PriceFormat::convertByType($price, $this->settings['price_format_id']);
return $price.(!empty($this->settings['price_with_currency']) ? ' '.$this->currency['iso_code'] : '');
}
protected function getNumberFormat($number = 0)
{
return Tools::ps_round($number, 3);
}
protected function isPriceField($field)
{
$priceFields = array(
'orders_total_paid',
'orders_total_paid_tax_incl',
'orders_total_paid_tax_excl',
'orders_total_wrapping',
'orders_total_discounts',
'orders_total_products',
'orders_total_shipping',
'orders_total_shipping_tax_incl',
'orders_total_shipping_tax_excl',
'order_detail_total_price_tax_incl',
'order_detail_total_price_tax_excl',
'order_detail_unit_price_tax_incl',
'order_detail_unit_price_tax_excl',
);
return in_array($field, $priceFields);
}
protected function isNumberField($field)
{
$fields = array(
'tax_rate'
);
return in_array($field, $fields);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,101 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
require_once(dirname(__FILE__).'/config/config.inc.php');
}
if (!class_exists('SkroutzAnalyticsXml', false)) {
require_once(_PS_MODULE_DIR_.'/xmlfeeds/SkroutzAnalyticsXml.php');
}
$feedSettings = getSkroutzFeedSettings();
if (empty($feedSettings['skroutz_analytics_id'])) {
die('Empty skroutz_analytics_id');
}
$skroutzAnalyticsXml = new SkroutzAnalyticsXml($feedSettings);
$productId = Tools::getValue('product_id');
$combinationId = Tools::getValue('combination_id');
$langId = Tools::getValue('lang_id', (int)Configuration::get('PS_LANG_DEFAULT'));
if (empty($productId)) {
die('Empty URL param product_id');
}
if (empty($combinationId)) {
echo '<div style="margin-bottom: 20px; color: #af0606;">Warning: Empty URL param combination_id</div>';
}
$product = new Product($productId, false);
$combinations = $product->getAttributesResume($langId, ' ', ', ');
$attributesGroups = AttributeGroupCore::getAttributesGroups($langId);
$groupName = '';
foreach ($attributesGroups as $a) {
if ($a['id_attribute_group'] == $feedSettings['merge_attributes_parent']) {
$groupName = $a['name'];
break;
}
}
echo 'Product: '.(!empty($product->name[$langId]) ? $product->name[$langId] : 'empty name').'<br>';
echo 'Product ID: '.$productId.'<br>';
echo 'Combination ID: '.$combinationId.'<br>';
echo 'Skroutz ID: '.$feedSettings['skroutz_analytics_id'].'<br>';
echo 'Merge by group: '.$groupName.'<br>';
foreach ($combinations as $c) {
$skroutzCombinationID = $skroutzAnalyticsXml->getCombinationId($productId, $c['id_product_attribute']);
echo '<div style="'.($combinationId == $c['id_product_attribute'] ? 'color: #f44336;' : '').'">';
echo '<br>Combination ID: '.$c['id_product_attribute'].'<br>';
echo 'Combination name: '.$c['attribute_designation'].'<br>';
echo 'Skroutz combination ID: '.$skroutzCombinationID.'<br>';
echo 'XML item ID: '.$productId.'-'.$skroutzCombinationID.'<br>';
echo '</div>';
}
function getSkroutzFeedSettings()
{
if (!class_exists('FeedMeta', false)) {
require_once(_PS_MODULE_DIR_.'/xmlfeeds/FeedMeta.php');
}
$feeds = Db::getInstance()->executeS('SELECT * FROM '._DB_PREFIX_.'blmod_xml_feeds f
WHERE f.feed_mode = "s"
ORDER BY f.id DESC');
if (empty($feeds)) {
return [];
}
$feedMeta = new FeedMeta();
foreach ($feeds as $f) {
$meta = $feedMeta->getFeedMeta($f['id']);
if (!empty($meta[$f['id']]['skroutz_analytics_id'])) {
return $f+$meta[$f['id']];
}
}
return [];
}
die('');

View File

@@ -0,0 +1,80 @@
<?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 SupplierXmlApi
{
protected $settings = array();
protected $feedLangId = 1;
protected $protocol = '';
public function getFeed($settings, $protocol)
{
$this->settings = $settings;
$this->feedLangId = (int)Configuration::get('PS_LANG_DEFAULT');
$this->protocol = $protocol;
return $this->generateXml($this->getSuppliers());
}
protected function generateXml($suppliers)
{
$xml = '<items>';
if (empty($suppliers)) {
return '</items>';
}
$link = new Link();
$addImage = method_exists($link, 'getSupplierImageLink');
foreach ($suppliers as $b) {
if ($addImage) {
$logoUrl = $link->getSupplierImageLink($b['id_supplier']);
if (!empty($logoUrl) && Tools::substr($logoUrl, 0, 4) != 'http') {
$logoUrl = $this->protocol . $logoUrl;
}
}
$xml .= '<item>';
$xml .= '<id><![CDATA['.$b['id_supplier'].']]></id>';
$xml .= '<name><![CDATA['.$b['name'].']]></name>';
$xml .= '<url><![CDATA['.$link->getSupplierLink($b['id_supplier'], null, (int)$this->feedLangId).']]></url>';
$xml .= '<date_add><![CDATA['.$b['date_add'].']]></date_add>';
$xml .= '<date_upd><![CDATA['.$b['date_upd'].']]></date_upd>';
$xml .= '<description><![CDATA['.strip_tags($b['description']).']]></description>';
$xml .= !empty($logoUrl) ? '<logo><![CDATA['.$logoUrl.']]></logo>' : '';
$xml .= '<active><![CDATA['.$b['active'].']]></active>';
$xml .= '</item>';
}
$xml .= '</items>';
return $xml;
}
protected function getSuppliers()
{
return Db::getInstance()->ExecuteS('
SELECT m.*, l.description
FROM '._DB_PREFIX_.'supplier m
LEFT JOIN '._DB_PREFIX_.'supplier_lang l ON
(l.id_supplier = m.id_supplier AND l.id_lang = "'.(int)$this->feedLangId.'")
WHERE m.`active` = 1
ORDER BY m.name ASC
');
}
}

View File

@@ -0,0 +1,24 @@
<?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
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

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

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<module>
<name>xmlfeeds</name>
<displayName><![CDATA[XML feeds Pro]]></displayName>
<version><![CDATA[3.9.8]]></version>
<description><![CDATA[Export from Prestashop to XML]]></description>
<author><![CDATA[Bl Modules]]></author>
<tab><![CDATA[export]]></tab>
<confirmUninstall><![CDATA[Are you sure you want to delete the module?]]></confirmUninstall>
<is_configurable>1</is_configurable>
<need_instance>1</need_instance>
<limited_countries></limited_countries>
</module>

View File

@@ -0,0 +1,32 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
die('Not Allowed, Xmlfeeds');
}
/**
* Class XmlfeedsApiModuleFrontController
*
* /index.php?fc=module&module=xmlfeeds&controller=api
* /module/xmlfeeds/api
*/
class XmlfeedsApiModuleFrontController extends ModuleFrontController
{
public function initContent()
{
require_once(dirname(__FILE__).'/../../api/xml.php');
}
}

View File

@@ -0,0 +1,24 @@
<?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
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,32 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
die('Not Allowed, Xmlfeeds');
}
/**
* Class XmlfeedsSkroutzModuleFrontController
*
* /index.php?fc=module&module=xmlfeeds&controller=skroutz
* /module/xmlfeeds/skroutz
*/
class XmlfeedsSkroutzModuleFrontController extends ModuleFrontController
{
public function initContent()
{
require_once(dirname(__FILE__).'/../../api/SkroutzAttributes.php');
}
}

View File

@@ -0,0 +1,24 @@
<?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
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,496 @@
#car.gr 2022-03-18
10 - Κόμπι/Kάραβαν
477 - Καταβρεκτήρας
484 - Τρέιλερ
165 - Sport / Ταχύπλοο
498 - Ιστιοπλοία
506 - Επιβατικό/οχηματαγωγό
471 - Σκάλα Υδραυλική
485 - Αγωνιστικό
492 - Καλάμια
507 - Επιβατικό/Τουριστικό
12 - Κάμπριο/Roadster
19 - Τετράτροχη-ATV
15 - Κουπέ-σπόρ
20 - Custom
23 - Super Motard
26 - Τρίτροχη
27 - Motocross
28 - Μοτοποδήλατο
29 - Μηχανή δρόμου
30 - On/Off
32 - Τσόπερ
16 - Αλλο
21 - Αλλο
248 - Αλλο
665 - Επαγγελματικό Eπιβατικό
666 - Τετράτροχο
667 - Αερογράφοι Μοντελισμού
18 - 4Χ4/Τζιπ/SUV
486 - Μπανάνα
668 - Ελικόπτερα
669 - Fat Bikes
516 - Τζαμάδικο
670 - Μελισσοκομικά
37 - Καρότσα
41 - Βυτίο
260 - Κόφα
671 - Θερμοκήπια
182 - Χορτοδετικά
337 - Σασί
206 - Κλαδευτικά
361 - Τζαμάδικο
363 - Ανυψωτικό
368 - Πλατφόρμα
202 - Παρελκόμενα
672 - Τρέιλερ - Τροχοσκηνή
43 - Σκουπιδιάρικο
46 - υnimog
51 - Τρέιλερ
54 - Φορτηγό με αλλαζόμενη καρότσα
700 - Dirt Jump
13 - Λιμουζίνα/Sedan
674 - Trekking
404 - Αλλο
56 - Σιλοφόρο
58 - Κοντέινερ
60 - Σάρωθρο
61 - Πρέσσα
55 - Σασί
127 - Ντάμπερ - DUMPER
108 - Finisher
112 - Wagon Drill
31 - Εnduro
169 - Αλλο
261 - Ψυγείο
238 - Βuggy
501 - Κάδοι
45 - Βυτίο-Καυσίμων
194 - Σβάρνα - Δισκοσβάρνα
172 - Φουσκωτά
173 - Κινητήρες - Μηχανές
168 - Fly / Yachts
175 - Ιστιοφόρα
177 - Αλιευτικά
204 - Λάστιχα
338 - Μεταφοράς Μηχανημάτων-Πλατφόρμα
181 - Τρέιλερ
183 - Μηχανήματα Αρμέγματος/εκτροφής
186 - Πατατοφυτευτής
187 - Τευτοεξαγωγική
188 - Χορτοσυλέκτες
688 - Van/MIni bus
191 - Σπαρτικά
192 - Σκαλιστήρια
193 - Σβωλοκόπτες
184 - Φρέζες
646 - Αλλο
515 - Δεματοποιητές
386 - Τηλεσκοπικά
500 - Μεταφορικές ταινίες
42 - Αλλο
123 - Πασαλομπήχτες
124 - Πιρούνια
651 - Τηλεσκοπικοί φορτωτές
133 - Μηχανήματα λατομείου
134 - Μαχαίρια
106 - Τηλεσκοπικά Περονοφόρα
107 - Παρελκόμενα
109 - Εκσκαφέας-Φορτωτής
110 - Φρέζες
111 - Ψαλίδια
113 - Φορτωτάκι
114 - Φορτωτής με ερπύστριες
115 - Φορτωτής με λάστιχα
116 - Σφυριά
117 - Σκούπες
514 - Αποφρακτικά
366 - Μεταφοράς Αυτοκινήτων
7 - Τρέιλερ Αυτοκινήτου
36 - Ψυγείο
196 - Ποτιστικά
197 - Πρέσες
198 - Πατατοεξαγωγέας
199 - Μαχαίρια
200 - Μηχανήματα διασποράς
203 - Αλλο
205 - Λιπασματοδιανομέας
207 - Κομπίνες
212 - Ισοπεδωτές
214 - Εξαρτήματα
215 - Βυτία
217 - Βαμβακοσυλέκτες
220 - Τρακτέρ Standard
219 - Αντλίες
223 - Super Sport
224 - Sport Touring
226 - Naked
689 - Ανταλλακτικά
606 - Αλωνιστική Μηχανή
24 - Roller/Scooter
25 - Παπί
232 - Mini..Moto
664 - Van/Mini bus
235 - Σκηνή
509 - Καρότσα Συρμού
162 - Βάρκα/Λεμβολόγιο
170 - Jet Ski
208 - Καταστροφέας-Σπαστήρας
185 - Αροτρο - Aλέτρι
454 - Αδειες Αλιείας
455 - Παιδικό
629 - Κύλινδρος
459 - Στελεχοκόπτες
460 - Κορφολογητές
461 - Καρποσυλλεκτικά
465 - Θαμνοκοπτικά
466 - Ψαλίδια μπορντούρας
517 - Καθαριστικά σπόρων (τριόρι)
227 - Αυτοκινούμενο
339 - Κλαδοσυλλέκτες
341 - Ντοματομηχανή
358 - Οικοδομική
64 - Ποτάδικο
65 - Οχημα οδικής βοήθειας
66 - Μπετονιέρα
75 - Καρότσα κουρτίνα
76 - Καρότσα μουσαμάς
77 - Καρότσα ανοιχτή
79 - Καλαθοφόρο
80 - Ζωάδικο
93 - Βυτίο τροφίμων
96 - Αυτοκινητάμαξα
97 - Αποφρακτικό
104 - Ανατρεπόμενο για containers με βραχίονες
105 - Αλατιέρα
102 - Ανατροπή
222 - Αποχιονιστικό
229 - Αδειες Δ.Χ.
242 - Αλλο
256 - Αλλο
216 - Τρυπάνια-Γεωτρύπανα
340 - Κοπροδιανομέας
464 - Αλυσοπρίονα-Πριονοκορδέλες
703 - Τριαθλητικά & Χρονομέτρου
652 - Jetsurf
236 - Λεωφορείο Σχολικό
334 - Σασί
385 - Παλετοφόρα
638 - Ραμποτέζα
462 - Κόσκινο
463 - Τσιμεντενέσεων
86 - Κουρτίνα
87 - Βυτίο τροφίμων
121 - Πρέσσες
126 - Οδοστρωτήρες
135 - Λάστιχα
335 - Αλυσιδάκι-Γάντζος
355 - Ανατροπή
48 - Φορτηγά μεταφοράς ποτών
57 - Τζαμάδικο
70 - Κόφα
74 - Κλούβα
78 - Καντίνα
83 - Ψυγείο
89 - Διπλοκάμπινο
98 - Ασθενοφόρο
99 - Απορριμματοφόρο
67 - Λεωφορείο ταξιδιωτικό
118 - Σπαστήρες
120 - Σάρωθρο
136 - Κουβάδες
137 - Κουβούκλια
138 - Κινητήρες (μοτέρ)
140 - Καλαθοφόρα
141 - Μηχανήματα καθαρισμού
142 - Ερπύστριες
143 - Εξέδρες εργασίας
144 - Μηχανήματα Ανακύκλωσης
145 - Εκσκαφάκι (διαβολάκι)
146 - Εκσκαφέας με ερπύστριες
147 - Εκσκαφέας με λάστιχα
148 - Δονητικές πλάκες
150 - Γκρέιντερ
151 - Γερανοί
152 - Ασφαλτικά
153 - Γεννήτρια
154 - Αρπάγες
156 - Αντλίες
158 - Αλυσιδάκι
159 - Αλατιέρες
160 - Εκχιονιστικά
161 - Αλλο
245 - Αλλο
250 - Αλλο
252 - Αλλο
329 - Ανατροπή
94 - Βυτίο
628 - Ρυμουλκά
213 - Θεριζοαλωνιστικές
468 - Φυσητήρες
457 - Skateboard -Waveboard
221 - Τροχόσπιτο
356 - Μεταφοράς Μηχανημάτων
359 - Ανατροπή
360 - Ποτάδικο
362 - Μεταφοράς Ξύλων
364 - Κόφα
369 - Ζωάδικο
473 - Θεριστές
467 - Αεροσυμπιεστές
63 - Βυτίο-άλλο
510 - Ψυγείο συρμού
474 - Σιλό
511 - Πλυντήριο κάδων
518 - Βυτίο λυμάτων
504 - Μηχανήματα Σπαραγγιών
505 - Πατητήρια
702 - Wingsuit flying
403 - Συρρόμενο Μουσαμά
405 - Cycle-Kart
406 - Off-road
398 - Αλυσιδάκι
407 - On-road
408 - Αλλο
480 - 4x4/Τζιπ/SUV
411 - Σκάφος
412 - Off-road
209 - Καρούλια - Ανέμες
211 - Καλλιεργητές - Ρίπερ
413 - On-road
414 - Mountain
415 - BMX
416 - Αλλο
419 - Πυροσβεστικό Οχημα
422 - Windsurf
423 - Kitesurf
424 - Wakeboard
425 - Ski
426 - Snowboard
427 - Snowmobile
431 - Ψυκτικοί θάλαμοι
433 - Θαλάσσιο Σκί
434 - Καταδυτικά
435 - Kano-Kayak
441 - Παιδικά
444 - Tandem
445 - Τρίτροχα
692 - Αλεξίπτωτα
450 - Ανταλλακτικά
451 - Αξεσουάρ
103 - Pickup/Agrotiko
490 - Ποδήλατα Θαλάσσης
436 - Αλιεία/Ψαροντούφεκο
521 - Μεταφοράς Κάδων
522 - Κουρτίνα
525 - Φορτωτές
526 - Τυλιχτικά
527 - Μηχανήματα Pellets
529 - Κτηνοτροφικά
530 - Τηλεκατευθύνσεις
524 - Μηχανήματα Ενσίρωσης-Σποροεκτοξευτήρες
531 - Ηλεκτρικά-Ηλεκτρονικά
532 - Μοτέρ
534 - Τσαπάκια για τρακτέρ
535 - Πετροσυλλέκτες
528 - Μηχανήματα- Ποτοποιίας
536 - Ερπυστριοφόρα τρακτέρ
630 - Καντίνα-Τροχόσπιτο
634 - Γερανός για Τρακτέρ
644 - SUP-Stand Up Paddle
542 - Φυτευτικές μηχανές
370 - Με γερανό
371 - Αυτοκινητάμαξα
373 - Ποτάδικο
374 - Μεταφοράς Ξύλων
502 - Κάδοι
481 - Άδειες
488 - Μηχανήματα εξορύξεων
50 - Ψυγείο
475 - Με κυλιόμενο δάπεδο
482 - Κόμπι/Kάραβαν
489 - Διαγραμμιστής
512 - Γεωτρύπανα
519 - Βυτίο λυμάτων
380 - Βιομηχανική
375 - Κόφα
376 - Σιλοφόρο
378 - Μεταφοράς Μηχανημάτων
379 - Ζωάδικο
381 - Αλλαζόμενης Καρότσας
383 - Μικρό
417 - Μεταφοράς Κοντέινερ
418 - Πάτωμα
420 - Πυροσβεστικό Όχημα
428 - Μηχανήματα επεξεργασίας μαρμάρων
429 - Σχιστικό για ξύλα
430 - Καλάθι γερανού
432 - Ψυκτικοί θάλαμοι
377 - Μεταφοράς Χωματουργική
452 - Άδειες
453 - Άδειες Δ.Χ.
513 - Μηχανήματα Πέλλετ
476 - Αμμοβολή
494 - Τόρνοι
495 - Πριόνια
497 - Ελασματουργικά
523 - Μηχανήματα επεξεργασίας-κοπής ξύλων
540 - Σιδηροδρόμων-Συντήρηση
539 - Φωτισμού Πύργοι
541 - Γεφυροπλάστιγγες
382 - Διώροφο
365 - Τρέιλερ Σκαφών
367 - Τρέιλερ Μοτοσυκλετών
440 - Σπαστά - Folded
230 - Τροχοβίλα - Προκάτ
443 - Πόλης
442 - Δρόμου
543 - Ξηραντήρες
472 - Μεταφορικές ταινίες-κοχλίες
544 - Χοάνες υποδοχής
545 - Flyboard
548 - Ανατροπή + Γερανός
210 - Πλατφόρμες-Καρότσες
549 - Ραδιοερασιτεχνικός εξοπλισμός
550 - Μύλος-Χαρμανιέρα
551 - Υπόδηση
552 - Ρουχισμός
553 - Ελκηθρα
554 - Απρέ Ski
555 - Φουσκωτά είδη
558 - Φορτίου / Ναυλωτής
14 - Αγροτικό/Pickup
559 - Μηχανήματα Πτηνοτροφικά
458 - Γραφείο-Κοντέινερ
561 - Τρέιλερ
562 - Ενδυση-Αξεσουάρ
563 - Αυτοσχέδια
564 - Καμπινάτα
565 - Parking-Σκαφών
567 - Απορροφητήρες-Αεροτουρμπίνα
569 - Σχίστες ξύλων
566 - Parking-Τροχοσπίτων
603 - Φασολοεξαγωγέας
604 - Φυστικοεξαγωγέας
605 - Κρεμμυδοεξαγωγέας
708 - Καντίνα
677 - Fitness
469 - Ελαιουργικά-Ραβδιστικά
607 - Μηχανήματα Διαλογής-Συσκευασίας
609 - Παιδικά Οχήματα
610 - Τρεχαντήρι
631 - Ράμπες
632 - Multicopters-Drones
614 - Cafe Racer
616 - Ανταλλακτικά-Αξεσουάρ
615 - Αιωροπτερισμός-Paraclyding
617 - Αεροσκάφη
618 - Base Jumping
619 - Αλεξίπτωτο Πλαγιάς-Παραπέντε
620 - Παραμοτέρ
621 - Ανεμόπτερο
622 - Αερόστατο-Zeppelin
623 - Μονόκλ-Μιάς Ρόδας
456 - Πατίνια
624 - Κανό-Καγιάκ
626 - Τρέιλερ Ποδηλάτου
410 - Drones - Multicopters
195 - Ραντιστικά - Ψεκαστικά
633 - Κλάρκ για Τρακτέρ
636 - UTV Side by Side
639 - Αυλακωτήρας
641 - Κλαδοτεμαχιστές
643 - Downhill
449 - Ανταλλακτικά-Εργαλεία
653 - Χιονιού - SnowBike
650 - Στατικά Μοντέλα
487 - Δενδροκομικά τρακτέρ
218 - Αμπελουργικά τρακτέρ
568 - Μοτο-Σκαπτικά
654 - Αμαξίδιο Ηλεκτρικό
660 - Αδειες + Οχημα
659 - Αδειες + Οχημα
658 - Αδειες + Οχημα
657 - Αδειες + Οχημα
470 - Νεκροφόρα
84 - Πλατφόρμα
88 - Καρότσα
479 - Λιμουζίνα/Sedan
508 - Ανελκυστήρες μετακομίσεων
90 - Βυτίο καυσίμων (καζάνια)
85 - Μουσαμάς
253 - Αλλο
330 - Καρότσα
333 - Οδικής Βοήθειας
354 - Αλατιέρα
372 - Σασί
384 - Για Κοντέινερ
100 - Κλαρκ
237 - Οικοδομικά Μηχανήματα
68 - Λεωφορεία φυσαρμόνικα
69 - Λεωφορείο πόλεως
59 - Τράκτορας
128 - Μπούμες
129 - Μπουλντόζες
130 - Μπετονιέρες
131 - Μηχανήματα θραύσεως μπετού
122 - Ράμπες
331 - Αυτοκινητοφόρο
332 - Γερανός-Φορτηγά με γερανό
546 - Μηχανήματα Αλουμινίου
547 - Ανατροπή + Γερανός
556 - Ηλεκτροσυγκόλληση
557 - Πλάνη
570 - Γερανόγεφυρες
149 - Διατρητικά-Τρυπάνια
612 - Ειδικά μικρά οχήματα
625 - Αερόθερμα
635 - Για Τρακτέρ
637 - Ζυγιστικά
640 - Περιστροφές
645 - Κομπρεσέρ Αέρος-Αεροσυμπιεστές
139 - Κομπρεσέρ-Σκαπτικά
648 - Κάμπριο/Roadster
649 - Κουπέ-σπόρ
132 - Μηχανήματα Σκυροδέματος και εκτοξευμένου
662 - Οχήματα χρηματαποστολών
357 - Τρέιλερ Αυτοκινήτου
663 - Αυλακωτήρες
675 - Χωματουργικό
167 - Ανοιχτό - Open
676 - Trial
11 - Κόμπακτ/Hatchback
409 - Αεροπλάνα
678 - Τρένα
679 - Μοτοσυκλέτες
680 - Χλοοκοπτικά
189 - Χορτοκοπτικά
681 - Συλλεκτικές μηχανές
682 - Δονητές συλλογής καρπών
683 - Σαμαρωτές - Πετροθάφτες
684 - Σπαστήρες καρπών
685 - Αποφλοιωτές - Διαχωριστές
686 - Γραμμή παραγωγής
687 - Κανόνια Πουλιών
647 - Κομπάκτ/Hatchback
491 - Ανταλλακτικά-Αξεσουάρ
691 - Ηλεκτρικά Πατίνια
693 - Full Suspension
656 - Άδεια + Όχημα
694 - Πολυμηχάνημα Αμπελουργικό-Δενδροκομικό
695 - Μηχανήματα καρυδιών
655 - Μηχανήματα τροφίμων
697 - Τρέιλερ μεταφοράς Αλόγων
696 - Τρέιλερ μεταφοράς σκύλων
673 - Υποβρύχια Scooter & Σκάφη
239 - Αλλο
701 - Τρέιλερ οδοσήμανσης
608 - Σέσουλες - Κουτιά Μεταφοράς
699 - Μηχανήματα επεξεργασίας Μετάλλων
336 - Γερανοί - Φορτηγά με Γερανό
446 - Ηλεκτρικά Ποδήλατα
704 - Τετράτροχα - Utv - Atv
707 - Τρακτέρ Ρυζιού
190 - Τουρμπίνες - Νεφελοψεκαστήρες
705 - Wing Surf
706 - Μηχανήματα Αεροδρομίου

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,650 @@
#Glami.eco, VERSION: 2020-01-29
1 - Women's clothing and shoes
180 - Glami.eco | Women's clothing and shoes | Women's clothing
53403 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's tops, tank tops and t-shirts
228 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's tops, tank tops and t-shirts | Women's t-shirts
324 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's tops, tank tops and t-shirts | Women's tank tops
2369 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's tops, tank tops and t-shirts | Crop tops
36409 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's tops, tank tops and t-shirts | Women's polo shirts
39335 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's tops, tank tops and t-shirts | Women's tops
86535 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's tops, tank tops and t-shirts | Women's athletic t-shirts and tank tops
6 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's blouses and shirts
327 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's blouses and shirts | Blouses
328 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's blouses and shirts | Women's shirts
1064 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's blouses and shirts | Tunics
235 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sweaters
335 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sweaters | Women's ponchos
339 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sweaters | Women's turtlenecks
340 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sweaters | Women's cardigans
53400 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sweaters | Women's classic sweaters
236 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sweatshirts
86533 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sweatshirts | Women's sport sweatshirts
352 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats
360 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's coats
362 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's coats | Women's trench coats
963 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's coats | Women's duffle coats
37568 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's coats | Women's fur coats
54209 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's coats | Women's wool coats
86688 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's coats | Women's quilted coats
769 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's jackets
363 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's jackets | Women's parkas
959 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's jackets | Women's bombers
962 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's jackets | Women's windbreakers
50796 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's jackets | Women's quilted jackets
53862 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's jackets | Women's leather jackets
63846 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's jackets | Women's denim jackets
86531 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jackets and coats | Women's jackets | Women's sports jackets
39567 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's suit jackets and blazers
334 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's suit jackets and blazers | Bolero
345 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's suit jackets and blazers | Women's blazers
1776 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's suit jackets and blazers | Kimonos
73075 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's suit jackets and blazers | Blazers
365 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's vests
86532 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's vests | Women's sports vests
373 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's pants
376 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's pants | Women's jeans
384 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's pants | Women's leggings
86777 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's pants | Women's leggings | Women's athletic leggings
995 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's pants | Women's sweatpants
53399 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's pants | Women's harem pants
75150 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's pants | Women's trousers
86537 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's pants | Women's sport trousers
386 - Glami.eco | Women's clothing and shoes | Women's clothing | Shorts
61038 - Glami.eco | Women's clothing and shoes | Women's clothing | Shorts | Women's shorts
71689 - Glami.eco | Women's clothing and shoes | Women's clothing | Shorts | Women's bermuda shorts
86536 - Glami.eco | Women's clothing and shoes | Women's clothing | Shorts | Women's athletic shorts
234 - Glami.eco | Women's clothing and shoes | Women's clothing | Skirts
86715 - Glami.eco | Women's clothing and shoes | Women's clothing | Skirts | Sporty skirts
184 - Glami.eco | Women's clothing and shoes | Women's clothing | Dresses
86545 - Glami.eco | Women's clothing and shoes | Women's clothing | Dresses | Sporty dresses
853 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's jumpsuits
133 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear
193 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear | One piece swimsuits
421 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear | One piece swimsuits | Monokinis
53402 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear | Kaftans and sarongs
461 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear | Kaftans and sarongs | Sarongs
2809 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear | Kaftans and sarongs | Kaftans
73065 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear | Two-piece swimsuits
201 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear | Two-piece swimsuits | Bikinis
420 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear | Two-piece swimsuits | Tankinis
86541 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's swimwear | Women's athletic swimsuits
8 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sleepwear
436 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sleepwear | Women's pajamas
36513 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sleepwear | Women's pajamas | Women's pajamas with pants
36514 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sleepwear | Women's pajamas | Women's pajamas with shorts
84153 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sleepwear | Women's pajamas | Women's onesie's
5223 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sleepwear | Women's nightgowns
437 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's bathrobes
39573 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments
132 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's socks
422 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Bras
424 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Bras | Push-up bras
1039 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Bras | Bra accessories
7145 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Bras | Demi-padded bras
7154 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Bras | Padded bras
10833 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Bras | Bralette's
43624 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Bras | Sports bras
53495 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Bras | Soft cup bras
73941 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Bras | Adhesive bras
430 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Corsets and garter belts
431 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Corsets and garter belts | Garters
7782 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Corsets and garter belts | Corsets
36686 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Corsets and garter belts | Garter belts
5382 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Panties and thongs
426 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Panties and thongs | Women's tangas
427 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Panties and thongs | Women's briefs
428 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Panties and thongs | Women's bikini panties
429 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Panties and thongs | Womens boxer briefs
5383 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Panties and thongs | Women's thongs
6993 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Panties and thongs | French panties
5449 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's lingerie
7105 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's lingerie | Teddies
7283 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's lingerie | Slips
39577 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's hosiery
433 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's hosiery | Women's tights
893 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's hosiery | Women's over the knee socks
1044 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's hosiery | Women's knee socks
6818 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's hosiery | Self-holding stockings
42072 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's undershirts
86542 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's undergarments | Women's sports underwear
86539 - Glami.eco | Women's clothing and shoes | Women's clothing | Women's sports jerseys
10 - Glami.eco | Women's clothing and shoes | Women's shoes
501 - Glami.eco | Women's clothing and shoes | Women's shoes | Pumps
512 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's sandals
520 - Glami.eco | Women's clothing and shoes | Women's shoes | Flats
527 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's snow boots
40087 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's snow boots | Women's high felt shoes
528 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's brogues
86716 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's brogues | Women's oxford and derby shoes
86719 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's brogues | Other women's low shoes
532 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's moccasins
536 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's espadrilles
537 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's rubber boots
538 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's sneakers
1020 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's mules
4591 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's loafers
36407 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's flip flops and slides
518 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's flip flops and slides | Women's flip flops
521 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's flip flops and slides | Women's slides
68714 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's sport shoes
65822 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's sport shoes | Women's outdoor shoes
73580 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's sport shoes | Women's running shoes
73582 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's sport shoes | Women's tennis shoes
73584 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's sport shoes | Women's golf shoes
86547 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's sport shoes | Women's fitness shoes
78521 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's boots and booties
523 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's boots and booties | Women's high boots
86569 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's boots and booties | Women's ankle boots
36408 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's boots and booties | Women's ankle boots | Women's combat boots
36776 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's boots and booties | Women's ankle boots | Women's ankle boots
38852 - Glami.eco | Women's clothing and shoes | Women's shoes | Women's boots and booties | Women's ankle boots | Women's chelsea boots
182 - Glami.eco | Women's clothing and shoes | Women's accessories
48561 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's handbags and bags
204 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's handbags and bags | Women's handbags
442 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's handbags and bags | Women's handbags | Women's clutches
67191 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's handbags and bags | Women's handbags | Tote bags
3319 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's handbags and bags | Women's laptop bags
49741 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's handbags and bags | Shoulder bags
49742 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's handbags and bags | Women's duffle bags
67196 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's handbags and bags | Women's briefcases
85492 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's handbags and bags | Handbag accessories
842 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's backpacks
86643 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's backpacks | Women's sport backpacks
203 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's wallets
768 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's suitcases and travel bags
40273 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's suitcases and travel bags | Women's suitcases
48565 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's suitcases and travel bags | Women's travel bags
75130 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's fanny packs
86641 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's fanny packs | Women's sports fanny packs
49743 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's sacks
221 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's belts
482 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's headwear
483 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's headwear | Women's hats
484 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's headwear | Women's beanies
488 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's headwear | Women's baseball caps
491 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's headwear | Women's berets
64188 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's headwear | Women's winter headbands
6372 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's shawls and scarves
450 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's shawls and scarves | Women's headscarves
455 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's shawls and scarves | Women's scarves
463 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's shawls and scarves | Women's neck warmers
847 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's gloves
68950 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's gloves | Women's mittens
68951 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's gloves | Women's fingerless gloves
494 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's hair accessories
495 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's hair accessories | Women's headbands
498 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's hair accessories | Women's hairbands
502 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's umbrellas
503 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's umbrellas | Women's bubble umbrellas
504 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's umbrellas | Women's foldable umbrellas
475 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's glasses
207 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's glasses | Women's sunglasses
476 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's glasses | Women's eyeglasses
86640 - Glami.eco | Women's clothing and shoes | Women's accessories | Women's glasses | Women's sports glasses
6477 - Glami.eco | Women's clothing and shoes | Women's accessories | Mobile phone cases
464 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches
465 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's watches
85493 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's watches | Women's watch straps
466 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's bracelets
467 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's rings
2800 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's rings | Women's engagement rings
2801 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's rings | Women's wedding rings
468 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's earrings
8005 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's earrings | Chandelier earrings
8006 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's earrings | Hoop earrings
8358 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's earrings | Stud earrings
469 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's necklaces
62700 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's necklaces | Choker necklaces
470 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's jewelry sets
471 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's tiaras
472 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's pendants
473 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's chains
474 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Women's piercing jewelry
845 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Broaches
2361 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Gift boxes
2370 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Jewelry boxes
113664 - Glami.eco | Women's clothing and shoes | Women's jewelry and watches | Stick-on jewelry
11 Men's clothing and shoes
202 - Glami.eco | Men's clothing and shoes | Men's clothing
45622 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's T-shirts and tank tops
197 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's T-shirts and tank tops | Men's t-shirts
554 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's T-shirts and tank tops | Men's polo shirts
561 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's T-shirts and tank tops | Men's tank tops
86523 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's T-shirts and tank tops | Men's sports t-shirts and tank tops
216 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's shirts
581 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sweaters
576 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sweaters | Men's cardigans
577 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sweaters | Men's turtlenecks
54212 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sweaters | Men's classic sweaters
215 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sweatshirts
86521 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sweatshirts | Men's sports sweatshirts
4 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats
599 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's coats
4902 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's coats | Men's trench coats
5244 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's coats | Men's duffle coats
54208 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's coats | Men's woolen coats
86714 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's coats | Men's quilted coats
2355 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's jackets
594 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's jackets | Men's windbreakers
597 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's jackets | Men's bombers
603 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's jackets | Men's parkas
53663 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's jackets | Men's quilted jackets
54207 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's jackets | Men's leather jackets
63847 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's jackets | Men's denim jackets
86519 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's jackets and coats | Men's jackets | Men's athletic jackets
39898 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's suit jackets and blazers
604 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's vests
86520 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's vests | Men's sport vests
605 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's pants
606 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's pants | Men's jeans
2453 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's pants | Men's sweatpants
4905 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's pants | Men's leggings
86525 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's pants | Men's sport pants
616 - Glami.eco | Men's clothing and shoes | Men's clothing | Men shorts
86524 - Glami.eco | Men's clothing and shoes | Men's clothing | Men shorts | Men's athletic shorts
222 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's swimwear
624 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's swimwear | Men's swim shorts
86529 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's swimwear | Men's sports swimsuit
589 - Glami.eco | Men's clothing and shoes | Men's clothing | Suits
2929 - Glami.eco | Men's clothing and shoes | Men's clothing | Suits | Tuxedo belts
2949 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sleepwear
632 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sleepwear | Men's pajamas
54213 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sleepwear | Men's nightshirts
633 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's bath robes
6133 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's undergarments
628 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's undergarments | Men's slips
629 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's undergarments | Men's briefs
630 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's undergarments | Men's boxers
703 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's undergarments | Men's socks
6551 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's tracksuits
86527 - Glami.eco | Men's clothing and shoes | Men's clothing | Men's sports jearseys
12 - Glami.eco | Men's clothing and shoes | Men's shoes
666 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sneakers
680 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's brogues
86717 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's brogues | Men's oxford and derby shoes
86720 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's brogues | Other men's low shoes
682 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's moccasins
683 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's moccasins | Men's boat shoes
685 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's espadrille shoes
686 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sandals
1024 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's house shoes
36646 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's slides and flip flops
679 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's slides and flip flops | Men's flip flops
688 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's slides and flip flops | Men's slides and flip flops
40328 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's boots
38853 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's boots | Men's chelsea boots
39349 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's boots | Men's combat boots
68713 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes
671 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's gym shoes
7658 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's football shoes
73696 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's football shoes | Men's turf football shoes
73700 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's football shoes | Men's football cleats
73701 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's football shoes | Men's spikes
65823 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's outdoor shoes
73581 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's running shoes
73583 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's tennis shoes
73585 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's golf shoes
73586 - Glami.eco | Men's clothing and shoes | Men's shoes | Men's sport shoes | Men's basketball shoes
199 - Glami.eco | Men's clothing and shoes | Men's accessories
205 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's bags
636 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's bags | Men's small bags
639 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's bags | Men's laptop bags
7127 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's bags | Men's satchel bags
40089 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's bags | Men's briefcases
67335 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's bags | Men's duffle bags
200 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's wallets
2357 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's backpacks
71123 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's backpacks | Men's school backpacks
74636 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's backpacks | Men's hiking backpacks
86635 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's backpacks | Men's sports backpacks
1030 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's suitcases and travel bags
67336 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's suitcases and travel bags | Men's suitcases
67337 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's suitcases and travel bags | Men's travel bags
75131 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's fanny packs
86633 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's fanny packs | Men's sport fanny packs
49920 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's sacks
209 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's belts
655 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's headwear
656 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's headwear | Men's hats
658 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's headwear | Men's baseball caps
2482 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's headwear | Men's caps
4611 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's headwear | Men's beanies
64189 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's headwear | Men's winter headbands
643 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's scarves and shawls
5455 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's scarves and shawls | Men's neck warmers
37202 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's scarves and shawls | Men's shawls
37203 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's scarves and shawls | Men's scarves
844 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's gloves
662 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's ties
663 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's bow ties
659 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's umbrellas
651 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's glasses
208 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's glasses | Men's sunglasses
652 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's glasses | Men's eyeglasses
1029 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's handkerchiefs
2358 - Glami.eco | Men's clothing and shoes | Men's accessories | Men's braces
644 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches
645 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's watches
85495 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's watches | Men's watch straps
646 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's bracelets
647 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's rings
648 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's chains
649 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's pendants
650 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's cufflinks
665 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's tie clips
2372 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's necklaces
7220 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's earrings
44546 - Glami.eco | Men's clothing and shoes | Men's jewelry and watches | Men's piercing jewelry
42 - Kids clothing and shoes
6598 - Glami.eco | Kids clothing and shoes | Kids clothing
212 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing
39548 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls t-shirts and shirts
8493 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls t-shirts and shirts | Girls t-shirts
38199 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls t-shirts and shirts | Girls blouses and shirts
39549 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls t-shirts and shirts | Girls tank tops
37857 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls sweaters
8791 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls sweatshirts
39543 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls jackets, coats and vests
8790 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls jackets, coats and vests | Kids jackets
38197 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls jackets, coats and vests | Girls vests
39547 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls jackets, coats and vests | Girls coats
71982 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls jackets and blazers
8492 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls pants
39554 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls pants | Girls jeans
39555 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls pants | Girls tracksuits
71970 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls pants | Girls leggings
72001 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls pants | Girls three quarter pants
7932 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls overalls
37861 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls shorts
8494 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls skirts
8792 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls dresses
71974 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls jumpsuits
8495 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls swimsuits
74167 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls swimsuits | Girls two-piece swimsuits
74168 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls swimsuits | Girls one-piece swimsuits
8496 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls sleepwear
39551 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls sleepwear | Girls pajamas
39553 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls sleepwear | Girls nightgowns
71973 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls sleepwear | Girls bathrobes
7043 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls underwear
7041 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls underwear | Girls tights
39552 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls underwear | Girls socks
71971 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls underwear | Girls bras
71972 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls underwear | Girls pants
71977 - Glami.eco | Kids clothing and shoes | Kids clothing | Girls clothing | Girls underwear | Girls undershirts
43 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing
8490 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys t-shirts
8796 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys shirts
8487 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys sweaters
8794 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys sweatshirts
39561 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys jackets, coats and vests
8793 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys jackets, coats and vests | Boys jackets
38198 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys jackets, coats and vests | Boys vests
39562 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys jackets, coats and vests | Boys coats
8454 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys pants
39565 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys pants | Boys jeans
39566 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys pants | Boys overalls
72002 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys pants | Boys three quarter pants
8795 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys shorts
71981 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys tracksuit
8489 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys swim shorts
8488 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys nightwear
39564 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys nightwear | Boys pajamas
71979 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys nightwear | Boys bathrobes
7031 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys underwear
7040 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys underwear | Boys tights
8491 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys underwear | Boys socks
71978 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys underwear | Boys undershirts
71980 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys underwear | Boys briefs and boxers
72000 - Glami.eco | Kids clothing and shoes | Kids clothing | Boys clothing | Boys suit jackets and suits
39412 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing
83580 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby rompers
39416 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby T-shirts and shirts
39415 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby sweaters and sweatshirts
37859 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby jackets and coats
39417 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby pants
39414 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby overalls
72187 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby dresses and skirts
72188 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby sets
72189 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby snowsuits
72290 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby swimsuits
72289 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby nightwear
72288 - Glami.eco | Kids clothing and shoes | Kids clothing | Baby clothing | Baby underwear
4889 - Glami.eco | Kids clothing and shoes | Kids shoes
2810 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes
7037 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls sneakers
7045 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls ballerina flats
7048 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls rainboots
7050 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls brogues
7051 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls boots
7052 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls pumps
7053 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls slippers
7055 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls ankle boots
7056 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls sandals
7057 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls snow boots
39419 - Glami.eco | Kids clothing and shoes | Kids shoes | Girls shoes | Girls indoor shoes
2811 - Glami.eco | Kids clothing and shoes | Kids shoes | Boys shoes
7020 - Glami.eco | Kids clothing and shoes | Kids shoes | Boys shoes | Boys indoor shoes
7021 - Glami.eco | Kids clothing and shoes | Kids shoes | Boys shoes | Boys sneakers
7022 - Glami.eco | Kids clothing and shoes | Kids shoes | Boys shoes | Boys rainboots
7025 - Glami.eco | Kids clothing and shoes | Kids shoes | Boys shoes | Boys brogues
7026 - Glami.eco | Kids clothing and shoes | Kids shoes | Boys shoes | Boys slippers
7027 - Glami.eco | Kids clothing and shoes | Kids shoes | Boys shoes | Boys sandals
7028 - Glami.eco | Kids clothing and shoes | Kids shoes | Boys shoes | Boys snow boots
7642 - Glami.eco | Kids clothing and shoes | Kids shoes | Boys shoes | Boys football shoes
37858 - Glami.eco | Kids clothing and shoes | Kids shoes | Baby shoes
7046 - Glami.eco | Kids clothing and shoes | Kids shoes | Baby shoes | Baby slippers
72291 - Glami.eco | Kids clothing and shoes | Kids shoes | Baby shoes | Baby sneakers
72354 - Glami.eco | Kids clothing and shoes | Kids shoes | Baby shoes | Baby ankle boots
72355 - Glami.eco | Kids clothing and shoes | Kids shoes | Baby shoes | Baby sandals
2902 - Glami.eco | Kids clothing and shoes | Kids accessories
761 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories
47193 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls backpacks, bags and handbags
75133 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls backpacks, bags and handbags | Girls school backpacks
47196 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls belts
47197 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls headwear
47199 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls shawls and scarves
47198 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls gloves
47195 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls hair accessories
72007 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls jewelry
47200 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls watches
47194 - Glami.eco | Kids clothing and shoes | Kids accessories | Girls accessories | Girls glasses
762 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories
47229 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories | Boys backpacks and bags
75134 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories | Boys backpacks and bags | Boys school backpacks
47232 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories | Boys belts
47230 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories | Boys headwear
47233 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories | Boys shawls and scarves
47234 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories | Boys gloves
47236 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories | Boys ties and bow ties
47235 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories | Boys watches
47231 - Glami.eco | Kids clothing and shoes | Kids accessories | Boys accessories | Boys glasses
39418 - Glami.eco | Kids clothing and shoes | Kids accessories | Baby accessories
6553 - Glami.eco | Kids clothing and shoes | Kids accessories | Baby accessories | Bibs
72602 - Glami.eco | Kids clothing and shoes | Kids accessories | Baby accessories | Baby hats
45 - Unisex
7193 - Glami.eco | Unisex | Digital camera accessories
6027 - Glami.eco | Unisex | Digital camera accessories | Camera bags
7194 - Glami.eco | Unisex | Phone and tablet accessories
5699 - Glami.eco | Unisex | Phone and tablet accessories | Cell phone charms
7195 - Glami.eco | Unisex | Phone and tablet accessories | Phone and tablet cases
42270 - Glami.eco | Unisex | Headphones and speakers
73296 - Glami.eco | Unisex | Computer accessories
11552 - Glami.eco | Unisex | Computer accessories | Laptop cases
7752 - Glami.eco | Unisex | Badges
73286 - Glami.eco | Unisex | Smoking paraphernalia
73287 - Glami.eco | Unisex | Smoking paraphernalia | Ashtrays
73288 - Glami.eco | Unisex | Smoking paraphernalia | Lighters
73289 - Glami.eco | Unisex | Smoking paraphernalia | Snuffboxes
73290 - Glami.eco | Unisex | Smoking paraphernalia | Smoking accessories
73291 - Glami.eco | Unisex | Smoking paraphernalia | Pipes
73292 - Glami.eco | Unisex | Smoking paraphernalia | Hookahs
2951 - Glami.eco | Home goods | Kitchen
42354 - Glami.eco | Home goods | Kitchen | Tableware
4471 - Glami.eco | Home goods | Kitchen | Tableware | Dishes
6554 - Glami.eco | Home goods | Kitchen | Tableware | Baby dishes
7577 - Glami.eco | Home goods | Kitchen | Tableware | Bowls and jars
7578 - Glami.eco | Home goods | Kitchen | Tableware | Fondue sets
8297 - Glami.eco | Home goods | Kitchen | Tableware | Bowls
42369 - Glami.eco | Home goods | Kitchen | Tableware | Cutlery
43674 - Glami.eco | Home goods | Kitchen | Tableware | Glasses
44536 - Glami.eco | Home goods | Kitchen | Tableware | Trays
44808 - Glami.eco | Home goods | Kitchen | Tableware | Cups
42353 - Glami.eco | Home goods | Kitchen | Cooking and baking supplies
7795 - Glami.eco | Home goods | Kitchen | Cooking and baking supplies | Baking forms
43459 - Glami.eco | Home goods | Kitchen | Cooking and baking supplies | Kitchen scales
44532 - Glami.eco | Home goods | Kitchen | Cooking and baking supplies | Pots and pan
44533 - Glami.eco | Home goods | Kitchen | Cooking and baking supplies | Baking trays and bowls
44535 - Glami.eco | Home goods | Kitchen | Cooking and baking supplies | Kitchen knives
44539 - Glami.eco | Home goods | Kitchen | Cooking and baking supplies | Kitchen utensils
44540 - Glami.eco | Home goods | Kitchen | Cooking and baking supplies | Cutting boards
7579 - Glami.eco | Home goods | Kitchen | Spice jars
42355 - Glami.eco | Home goods | Kitchen | Coffee, wine and tea
7100 - Glami.eco | Home goods | Kitchen | Coffee, wine and tea | Tea and coffee
7101 - Glami.eco | Home goods | Kitchen | Coffee, wine and tea | Beer and wine
42358 - Glami.eco | Home goods | Kitchen | Food storage and transport
5937 - Glami.eco | Home goods | Kitchen | Food storage and transport | Thermos' and drinking bottles
6559 - Glami.eco | Home goods | Kitchen | Food storage and transport | Snack boxes
7099 - Glami.eco | Home goods | Kitchen | Food storage and transport | Ice trays
44534 - Glami.eco | Home goods | Kitchen | Food storage and transport | Lunch boxes
42356 - Glami.eco | Home goods | Kitchen | Kitchen textiles
7580 - Glami.eco | Home goods | Kitchen | Kitchen textiles | Place mats
7581 - Glami.eco | Home goods | Kitchen | Kitchen textiles | Napkins
7582 - Glami.eco | Home goods | Kitchen | Kitchen textiles | Tablecloths
7583 - Glami.eco | Home goods | Kitchen | Kitchen textiles | Dishtowels
7584 - Glami.eco | Home goods | Kitchen | Kitchen textiles | Aprons
44806 - Glami.eco | Home goods | Kitchen | Dining furniture
44638 - Glami.eco | Home goods | Kitchen | Dining furniture | Dining chairs
44807 - Glami.eco | Home goods | Kitchen | Dining furniture | Dining tables
74431 - Glami.eco | Home goods | Kitchen | Kitchen units
2952 - Glami.eco | Home goods | Bedroom
42359 - Glami.eco | Home goods | Bedroom | Bed linen
4492 - Glami.eco | Home goods | Bedroom | Bed linen | Bedlinen
4493 - Glami.eco | Home goods | Bedroom | Bed linen | Covers
4494 - Glami.eco | Home goods | Bedroom | Bed linen | Sheets
4491 - Glami.eco | Home goods | Bedroom | Bedroom accessories
2953 - Glami.eco | Home goods | Bathroom
2955 - Glami.eco | Home goods | Bathroom | Towels and bath towels
44531 - Glami.eco | Home goods | Bathroom | Laundry baskets
44538 - Glami.eco | Home goods | Bathroom | Bathroom curtains
44558 - Glami.eco | Home goods | Bathroom | Bathroom mats
44804 - Glami.eco | Home goods | Bathroom | Bathroom accessories
44805 - Glami.eco | Home goods | Bathroom | Bathroom mirrors
2954 - Glami.eco | Home goods | Home accessories
2950 - Glami.eco | Home goods | Home accessories | Clocks
2956 - Glami.eco | Home goods | Home accessories | Wall stickers
2958 - Glami.eco | Home goods | Home accessories | Candles
2974 - Glami.eco | Home goods | Home accessories | Christmas decorations
4495 - Glami.eco | Home goods | Home accessories | Carpets
7574 - Glami.eco | Home goods | Home accessories | Carpets | Rugs
7798 - Glami.eco | Home goods | Home accessories | Carpets | Carpet runners
4508 - Glami.eco | Home goods | Home accessories | Blinds
7036 - Glami.eco | Home goods | Home accessories | Blankets and pillows
4276 - Glami.eco | Home goods | Home accessories | Blankets and pillows | Pillows
5213 - Glami.eco | Home goods | Home accessories | Blankets and pillows | Blankets
7523 - Glami.eco | Home goods | Home accessories | Metal and wood decor
7572 - Glami.eco | Home goods | Home accessories | Candlesticks
7585 - Glami.eco | Home goods | Home accessories | Paintings
7586 - Glami.eco | Home goods | Home accessories | Wallpaper
7587 - Glami.eco | Home goods | Home accessories | Storage boxes
7588 - Glami.eco | Home goods | Home accessories | Plant pots
7589 - Glami.eco | Home goods | Home accessories | Frames
7814 - Glami.eco | Home goods | Home accessories | Vases
42670 - Glami.eco | Home goods | Home accessories | Bean bags
43457 - Glami.eco | Home goods | Home accessories | Hangers
43458 - Glami.eco | Home goods | Home accessories | Mirrors
43594 - Glami.eco | Home goods | Home accessories | Curtains and drapes
2957 - Glami.eco | Home goods | Lighting
44810 - Glami.eco | Home goods | Lighting | Floor lamps
44811 - Glami.eco | Home goods | Lighting | Ceiling lights
44812 - Glami.eco | Home goods | Lighting | Table lamps
7792 - Glami.eco | Home goods | Lighting | Kids lamps
6556 - Glami.eco | Home goods | Kids room
5933 - Glami.eco | Home goods | Kids room | Kids room decorations
6555 - Glami.eco | Home goods | Kids room | Kids furniture
7124 - Glami.eco | Home goods | Kids room | Baby equipment
1023 - Glami.eco | Home goods | Kids room | Baby equipment | Kids toys
1042 - Glami.eco | Home goods | Kids room | Baby equipment | Equipment and entertainment
7546 - Glami.eco | Home goods | Kids room | Baby equipment | Equipment and entertainment | Toys for boys
7547 - Glami.eco | Home goods | Kids room | Baby equipment | Equipment and entertainment | Toys for girls
7569 - Glami.eco | Home goods | Kids room | Baby equipment | School supplies
7104 - Glami.eco | Home goods | Office
7126 - Glami.eco | Home goods | Living room
37926 - Glami.eco | Home goods | Living room | Furniture
44537 - Glami.eco | Home goods | Living room | Shelves
74421 - Glami.eco | Home goods | Living room | Sofa sets
74423 - Glami.eco | Home goods | Living room | Couches
74425 - Glami.eco | Home goods | Living room | Armchairs
74427 - Glami.eco | Home goods | Living room | Living room units
37927 - Glami.eco | Home goods | Garden
42357 - Glami.eco | Home goods | Garden | Grilling and picnic
44813 - Glami.eco | Home goods | Garden | Garden furniture
44814 - Glami.eco | Home goods | Garden | Garden equipment
1783 - Glami.eco | Cosmetics | Women's cosmetics | Hair care
2312 - Glami.eco | Cosmetics | Women's cosmetics | Makeup
2313 - Glami.eco | Cosmetics | Women's cosmetics | Makeup | Eye shadows
2314 - Glami.eco | Cosmetics | Women's cosmetics | Makeup | Mascara
2316 - Glami.eco | Cosmetics | Women's cosmetics | Makeup | Eye pencils
2317 - Glami.eco | Cosmetics | Women's cosmetics | Makeup | Powders
2319 - Glami.eco | Cosmetics | Women's cosmetics | Makeup | Foundation
2322 - Glami.eco | Cosmetics | Women's cosmetics | Makeup | Concealer
2324 - Glami.eco | Cosmetics | Women's cosmetics | Foot care
2332 - Glami.eco | Cosmetics | Women's cosmetics | Neck and décolleté care
2333 - Glami.eco | Cosmetics | Women's cosmetics | Hand care
2334 - Glami.eco | Cosmetics | Women's cosmetics | Eye area care
2336 - Glami.eco | Cosmetics | Women's cosmetics | Eyelashes and eyebrows
2338 - Glami.eco | Cosmetics | Women's cosmetics | Women's perfume
2364 - Glami.eco | Cosmetics | Women's cosmetics | Tooth care
2779 - Glami.eco | Cosmetics | Women's cosmetics | Skincare
2791 - Glami.eco | Cosmetics | Women's cosmetics | Nail care
2792 - Glami.eco | Cosmetics | Women's cosmetics | Lip care
4278 - Glami.eco | Cosmetics | Women's cosmetics | Body care
1784 - Glami.eco | Cosmetics | Women's cosmetics | Body care | Soaps
2323 - Glami.eco | Cosmetics | Men's cosmetics
2327 - Glami.eco | Cosmetics | Men's cosmetics | Men's hair care
2339 - Glami.eco | Cosmetics | Men's cosmetics | Men's perfume
8499 - Glami.eco | Cosmetics | Men's cosmetics | Men's skin care
8501 - Glami.eco | Cosmetics | Men's cosmetics | Men's body care
86046 - Glami.eco | Cosmetics | Men's cosmetics | Men's toiletry bags
73255 - Glami.eco | Sport and outdoor | Camping
73256 - Glami.eco | Sport and outdoor | Camping | Tents
73257 - Glami.eco | Sport and outdoor | Camping | Sleeping bags
73258 - Glami.eco | Sport and outdoor | Camping | Sleeping pads
73259 - Glami.eco | Sport and outdoor | Camping | Camping equipment
73260 - Glami.eco | Sport and outdoor | Hiking equipment
73264 - Glami.eco | Sport and outdoor | Winter sports equipment
38344 - Glami.eco | Sport and outdoor | Winter sports equipment | Snowboarding equipment
73261 - Glami.eco | Sport and outdoor | Winter sports equipment | Ski equipment
73262 - Glami.eco | Sport and outdoor | Winter sports equipment | Hockey equipment
73263 - Glami.eco | Sport and outdoor | Winter sports equipment | Ice skating equipment
73265 - Glami.eco | Sport and outdoor | Cycling equipment
73266 - Glami.eco | Sport and outdoor | Cycling equipment | Bicycles
73267 - Glami.eco | Sport and outdoor | Cycling equipment | Bicycle accessories
73268 - Glami.eco | Sport and outdoor | Cycling equipment | Cycling accessories
73269 - Glami.eco | Sport and outdoor | Inline skating equipment
73270 - Glami.eco | Sport and outdoor | Inline skating equipment | Scooters
73271 - Glami.eco | Sport and outdoor | Inline skating equipment | Roller skates
73272 - Glami.eco | Sport and outdoor | Inline skating equipment | Skateboards
73273 - Glami.eco | Sport and outdoor | Inline skating equipment | Longboards
73274 - Glami.eco | Sport and outdoor | Rock climbing equipment
73275 - Glami.eco | Sport and outdoor | Racket sports equipment
73276 - Glami.eco | Sport and outdoor | Racket sports equipment | Badminton equipment
73277 - Glami.eco | Sport and outdoor | Racket sports equipment | Tennis equipment
73278 - Glami.eco | Sport and outdoor | Racket sports equipment | Table tennis equipment
73279 - Glami.eco | Sport and outdoor | Racket sports equipment | Squash equipment
73283 - Glami.eco | Sport and outdoor | Watersport equipment
73284 - Glami.eco | Sport and outdoor | Golf equipment
73293 - Glami.eco | Sport and outdoor | Fitness equipment
73294 - Glami.eco | Sport and outdoor | Boxing equipment
73295 - Glami.eco | Sport and outdoor | Yoga and pilates equipment
73299 - Glami.eco | Sport and outdoor | Team sports equipment
73417 - Glami.eco | Sport and outdoor | Team sports equipment | Football equipment
73418 - Glami.eco | Sport and outdoor | Team sports equipment | Volleyball equipment
73419 - Glami.eco | Sport and outdoor | Team sports equipment | Handball equipment
73420 - Glami.eco | Sport and outdoor | Team sports equipment | Floorball equipment
73421 - Glami.eco | Sport and outdoor | Team sports equipment | Basketball equipment
111241 - Glami.eco | Sport and outdoor | Motorcycling equipment
38201 - Glami.eco | Sport and outdoor | Horse riding equipment
73300 - Pet products
73308 - Carpentry tools
1427166 - Baby scarves

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,24 @@
<?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
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,246 @@
#Spartoo.it 2020-06-17
10008 - Ballerine
10038 - Ciabatte
10040 - Zoccoli
11084 - ciabatte
10924 - Derby & Richelieu
10034 - Derby
10039 - Richelieu
10035 - Décolleté
10036 - Espadrillas
10044 - Infradito
10018 - Scarpe da barca
10037 - Mocassini
10016 - Pantofole
10017 - Scarpette neonato
10041 - Sandali
10525 - Scarpe a rotelle
10015 - Scarpe da lavoro
11424 - Scarpe antinfortunistiche
11425 - Settore medico / alimentare
10019 - Calcio
10020 - Rugby
10022 - Trekking
10023 - Running / Trail
10025 - Sci
10026 - Multisport
10027 - Sport Indoor
10028 - Tennis
10029 - Pallacanestro
10031 - Equitazione
10042 - Sandali sport
10570 - Scarpe acquatiche
10620 - Fitness / Training
9845 - Ciclismo
10024 - Scarpe da Skate
10043 - Slip on
10002 - Sneakers
10009 - Sneakers basse
10010 - Sneakers alte
10013 - Stivaletti
10014 - Stivaletti
10609 - Tronchetti
10003 - Stivali
10011 - Stivali
10012 - Stivali da pioggia
10021 - Stivali da neve
10033 - Stivali a metà coscia
10099 - Vanity
10639 - Trousse da toilette
10090 - Bisacce
10755 - Tracolle
10602 - Borse cambio
10095 - Borse da sport
10614 - Borse termiche
10498 - Borse
10093 - Borse a mano
10596 - Borse a spalla
10096 - Borse da viaggio
10611 - Cartelle
10685 - Borse / Cartelle con rotelle
10598 - Fodere cellulare
10624 - Custodie
10094 - Marsupi
10678 - Pochette / Borselli
10687 - Borse da sera
10686 - Porta Documenti
10600 - Porta PC
10085 - Portafogli
10608 - Porta monete
10676 - Tote bag / Borsa shopping
10567 - Trousse
10098 - Valigie
10650 - Valigie rigide
10651 - Valigie morbide
10657 - Pilot Case
10091 - Zaini
10047 - Camicie
10770 - Camicie maniche corte
10771 - Camicie maniche lunghe
10050 - Cappotti
10773 - Piumini
10781 - Parka
10786 - Trench
11061 - Completi e cravatte
11062 - Cravatte e accessori
11063 - Giacche da completo
11064 - Gilet da completo
11065 - Pantaloni da completo
11066 - Completi
9989 - Completo
10778 - Costume / Bermuda da spiaggia
10999 - Perei
9992 - Costume componibile
9995 - Costume a due pezzi
9996 - Costume intero
10051 - Felpe in pile
10054 - Felpe
9999 - Giacche
10045 - Giubbotti
10057 - Giacche / Blazer
10789 - Giacca in cuoio / simil cuoio
10790 - Giacche in jeans
10800 - giacca a vento
10512 - Gonne
9998 - Jeans
10059 - Jeans dritti
10774 - Jeans bootcut
10775 - Jeans slim
10994 - Jeans skynny
10995 - Jeans 3/4 & 7/8
10996 - Jeans boyfriend
10776 - Pantaloni da tuta
10788 - Giacche sportive
10998 - Tuta
10088 - Leggings
10053 - Maglioni
10695 - Gilet / Cardigan
10063 - Shorts / Bermuda
10004 - Pantaloni
10061 - Pantaloni 5 tasche
10772 - Chino
10779 - Pinocchietto
10797 - Pantaloni morbidi / Pantaloni alla zuava
10798 - Pantalone Cargo
9987 - Pigiami / camicie da notte
11081 - Premaman
11057 - Reggiseno sportivo
10001 - T-shirt & Polo
10048 - Top / T-shirt senza maniche
10052 - Polo maniche corte
10056 - T-shirt maniche corte
10697 - T-shirts a maniche lunghe
10782 - Polo maniche lunghe
10065 - Tuniche
10511 - Top / Blusa
10792 - Tuta jumpsuit / Salopette
10000 - Vestiti
10062 - Abiti corti
10784 - Abiti lunghi
10523 - Gioelli
10101 - Collane
10103 - Gioielli piercing
10104 - Orecchini
10105 - Gemelli
10106 - Bracciali
10107 - Spille
10108 - Ornamenti
10561 - Ciondoli
9848 - Occhiali da sole
10495 - Orologi e gioielli
10689 - Orologio Analogico
10691 - Orologio Digitale
10693 - Orologio Misto Analogico-Digitale
10563 - Ganci porta-borse
10007 - Accessori scarpe
10952 - Linguette
11180 - Lacci
10100 - Accessori sport
10087 - Calzini
11473 - Calze sportive
11422 - Collants e calze
10112 - Prodotti di trattamento
10113 - Lucidi
10114 - Impermeabilizzanti
10633 - Portachiavi
10078 - Cinture
10080 - Sciarpe
10082 - Guanti
10109 - Berretti
10110 - Cappellini
10111 - Cappelli
438 - Corpo e Bagno > Scrub & peeling
439 - Corpo e Bagno > Idratanti & nutrienti
440 - Corpo e Bagno > Corpo e Bagno
441 - Corpo e Bagno > Bio & naturale
442 - Corpo e Bagno > Prodotti snellenti
443 - Corpo e Bagno > Deodoranti
444 - Corpo e Bagno > Trattamento mani e piedi
445 - Corpo e Bagno > Protezione solare
11560 - Cura dei capelli > Tinta
475 - Cura dei capelli > Shampoo
476 - Cura dei capelli > Maschere &Balsamo
477 - Cura dei capelli > Gel & Modellante per capelli
461 - Mani > Base & Topcoats
462 - Mani > Smalti
463 - Mani > Levasmalti
464 - Mani > Trattamento unghie
465 - Mani > Kit manicure
478 - Prodotti di bellezza > Pennelli
479 - Prodotti di bellezza > Accessori per il viso
480 - Prodotti di bellezza > Accessori per gli occhi
481 - Prodotti di bellezza > Accessori per capelli
482 - Prodotti di bellezza > Accessori per manicure
483 - Prodotti di bellezza > Accessori per il corpo
466 - Profumi > Eau de toilette
467 - Profumi > Eau de parfum
468 - Profumi > Acqua di colonia
469 - Profumi > Eau Fraîche
470 - Profumi > Cofanetti di profumi
471 - Rasatura > Trattamento rasatura e post-rasatura
472 - Rasatura > Trattamenti post-rasatura
473 - Rasatura > Rasoi & lame
474 - Rasatura > Dopobarba
430 - Trattamenti viso > Detergenti e struccanti
431 - Trattamenti viso > Antietà & Antirughe
432 - Trattamenti viso > Idratanti e nutrienti
433 - Trattamenti viso > Bio & naturale
434 - Trattamenti viso > Maschere & scrub
435 - Trattamenti viso > Protezione solari
436 - Trattamenti viso > Trattamento mirato
437 - Trattamenti viso > Trucco BB & creme CC
453 - Trucco labbra > Rossetti
454 - Trucco labbra > Gloss
455 - Trucco labbra > Matita per labbra
456 - Trucco labbra > Trattamento e primer labbra
447 - Trucco occhi > Ombretti & primer
448 - Trucco occhi > Cofanetto ombretti
449 - Trucco occhi > Mascara Ciglia-finte
450 - Trucco occhi > Matia per occhi
451 - Trucco occhi > Eyeliners
452 - Trucco occhi > Trucco sopracciglia
457 - Trucco viso > Fondotinta & primer
458 - Trucco viso > Blush & cipria
459 - Trucco viso > Contorno occhi & correttori
460 - Trucco viso > Illuminanti
11412 - Body
11414 - Reggicalze
11416 - Guêpière
11418 - Corsetti e bustini
11420 - Prodotti modellanti
11475 - Boxer
11472 - Maglietta intima
11476 - Mutande uomo
11394 - Non imbottito
11395 - Balconcino
11396 - Imbottiti
11397 - Minimizer
11400 - Fascia/spalline amovibili
11470 - Triangolo/Senza ferretto
11471 - Brassiere
11402 - Culotte e slip
11404 - Culotte e boxer
11406 - Perizoma
11408 - Tanga
11410 - Guaina modellante
11477 - Slip

View File

@@ -0,0 +1,69 @@
<?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
*/
if (!defined('_PS_VERSION_')) {
die('Not Allowed, GoogleCategoryBlMod');
}
class GoogleCategoryBlMod
{
public $path = '';
public function __construct($fileName)
{
$this->path = _PS_MODULE_DIR_.'xmlfeeds/ga_categories/'.$fileName;
}
public function getList()
{
$file = $this->readFile();
if (empty($file)) {
return false;
}
return $file;
}
private function readFile()
{
$categories = array();
if (is_file($this->path) && is_readable($this->path)) {
$handle = fopen($this->path, 'r');
}
if (empty($handle)) {
return false;
}
while (($data = fgetcsv($handle, 1000, '-')) !== false) {
if (empty($data[1])) {
continue;
}
$id = trim($data[0]);
if (!empty($id) && Tools::substr($id, 0, 1) == '#') {
continue;
}
unset($data[0]);
$categories[$id] = trim(implode('-', $data));
}
return $categories;
}
}

View File

@@ -0,0 +1,24 @@
<?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
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

BIN
modules/xmlfeeds/logo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
modules/xmlfeeds/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
modules/xmlfeeds/logo.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

View File

@@ -0,0 +1,23 @@
<?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
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,18 @@
<?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
*/
echo 'Deprecated url, please check the feed settings (XML FILE box field).';
die();

159
modules/xmlfeeds/search.php Normal file
View File

@@ -0,0 +1,159 @@
<?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
*/
$_POST = [];
$_FILES = [];
$_GET['module'] = 'xmlfeeds';
require(dirname(__FILE__).'/../../config/config.inc.php');
require(dirname(__FILE__).'/../../modules/xmlfeeds/XmlFeedsTools.php');
class SearchApiXml extends ModuleFrontController
{
private $limit = 50;
private $wordLength = 100;
private $langId = 1;
private $search_type = '';
private $s = '';
public function __construct()
{
$this->module = 'xmlfeeds';
parent::__construct();
}
public function init()
{
$this->s = htmlspecialchars(Tools::getValue('s'), ENT_QUOTES);
if (empty($this->s)) {
die();
}
$this->langId = (int)(Configuration::get('PS_LANG_DEFAULT'));
$this->search_type = htmlspecialchars(Tools::getValue('s_t'), ENT_QUOTES);
$selectedProducts = trim(Tools::getValue('s_p'), ',');
$whereSelected = '';
$moduleImgPath = '../modules/xmlfeeds/views/img/';
$where = 'l.id_product = "'.(int)$this->s.'"';
if (!empty($selectedProducts) && $selectedProducts != 'undefined') {
$idList = explode(',', $selectedProducts);
$idListInt = [];
foreach ($idList as $i) {
$i = (int)$i;
if (empty($i)) {
continue;
}
$idListInt[] = $i;
}
$whereSelected = ' AND l.id_product NOT IN ('.pSQL(implode(',', $idListInt)).')';
}
if ($this->search_type != 'search_id') {
$this->search_type = 'search_name';
$where = 'l.name LIKE "%'.pSQL($this->s).'%"';
}
$products = $this->getProducts($where, $whereSelected);
$this->context->smarty->assign([
'products' => $products,
'moduleImgPath' => $moduleImgPath,
'totalProducts' => count($products),
'limit' => $this->limit,
]);
echo $this->context->smarty->fetch(_PS_MODULE_DIR_.'xmlfeeds/views/templates/admin/page/searchApi.tpl');
}
private function getProducts($where, $whereSelected)
{
return $this->productTransformer(Db::getInstance()->ExecuteS('SELECT DISTINCT(l.id_product), l.name,
cl.name AS cat_name, i.id_image
FROM '._DB_PREFIX_.'product_lang l
LEFT JOIN '._DB_PREFIX_.'product p ON
l.id_product = p.id_product
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON
(p.id_category_default = cl.id_category AND cl.id_lang = "'.(int)$this->langId.'")
LEFT JOIN `'._DB_PREFIX_.'image` i ON
(p.id_product = i.id_product AND i.`cover`= "1")
WHERE '.$where.' AND l.id_lang = "'.(int)$this->langId.'"'.$whereSelected.'
GROUP BY l.id_product
ORDER BY l.name ASC
LIMIT '.(int)$this->limit));
}
private function highlight($needle, $haystack)
{
$container = 'span';
$style = 'class';
$ind = stripos($haystack, $needle);
$len = Tools::strlen($needle);
if ($ind !== false) {
return Tools::substr($haystack, 0, $ind) . '<'.$container.' '.$style.'="find_word">' . Tools::substr($haystack, $ind, $len) . '</'.$container.'>' . $this->highlight($needle, Tools::substr($haystack, $ind + $len));
}
return $haystack;
}
private function productTransformer($products = array())
{
if (empty($products)) {
return $products;
}
$imageClassName = (!class_exists('ImageCore', false) || _PS_VERSION_ > '1.5.3') ? 'Image' : 'ImageCore';
$imgType = XmlFeedsTools::getImageType();
foreach ($products as $k => $p) {
$cat_name = '';
if (Tools::strlen($p['name']) > $this->wordLength) {
$products[$k]['name'] = Tools::substr($p['name'], 0, $this->wordLength) . '...';
}
if ($this->search_type == 'search_name') {
$p['name'] = $this->highlight($this->s, $p['name']);
}
if (!empty($p['cat_name'])) {
$cat_name = ', ' . $p['cat_name'];
}
$imageClass = new $imageClassName($p['id_image']);
$name = $imageClass->getExistingImgPath();
$url = _PS_BASE_URL_._THEME_PROD_DIR_.$name.$imgType;
if (!file_exists(_PS_PROD_IMG_DIR_.$name.$imgType)) {
$url = _PS_BASE_URL_._THEME_PROD_DIR_.$name.'.jpg';
}
$products[$k]['img_url'] = $url;
$products[$k]['cat_name'] = $cat_name;
}
return $products;
}
}
$searchApiXml = new SearchApiXml();
$searchApiXml->init();

View File

@@ -0,0 +1,24 @@
<?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
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,11 @@
1 - Toys > Puzzles
3 - Toys > Building Toys
10 - Toys > Activity Toys > Bouncy Balls
901 - Toys > Activity Toys > Ball & Cup Games
150 - Toys > Sports Toys
405 - Toys > Sports Toys > Tennis Toys
309 - Toys > Sports Toys > Basketball Toys
206 - Toys > Sports Toys > Basketball Toys > Accessories
5614 - Vehicles
3395 - Vehicles > Aircraft
4267 - Vehicles > Motor Vehicles

View File

10
modules/xmlfeeds/vendor/.htaccess vendored Normal file
View File

@@ -0,0 +1,10 @@
# Apache 2.2
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
# Apache 2.4
<IfModule mod_authz_core.c>
Require all denied
</IfModule>

View File

@@ -0,0 +1,789 @@
<?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
*/
/**
* Formula Parser - A library for parsing and evaluating mathematical formulas given as strings.
*
* @author Denis Simon <denis.v.simon@gmail.com>
*
* @license MIT (https://github.com/denissimon/formula-parser/blob/master/LICENSE)
*
* @version 2.7.1-2019.11.05
*/
class FormulaParser
{
protected $formula, $original_formula = "";
protected $precision = "";
protected $expression = "";
protected $correct = true;
protected $error_type = 0;
protected $variables = [];
protected $valid_variables = ['x', 'y', 'z', 'a', 'b'];
protected $valid_functions = ['abs', 'sin', 'cos', 'tan', 'log', 'exp', 'sqrt'];
/**
* Constructor
*
* @param string $formula The formula given as a string
* @param integer $precision The rounding precision (number of digits after the decimal point)
*/
public function __construct($formula = "", $precision = 6)
{
if (!empty($formula))
$this->formula = $this->original_formula = trim($formula);
if (isset($precision))
$this->precision = $precision;
}
/**
* Magic overloading method
*
* @param string $name
* @param array $arguments
*
* @throws \Exception when the method doesn't exist
*/
public function __call($name, $arguments)
{
throw new \Exception("No such method exists: $name (".implode(', ', $arguments).")");
}
/**
* Overwrites default valid variables
*
* @param array $vars
*/
public function setValidVariables(array $vars)
{
$this->valid_variables = $vars;
}
/**
* Sets variables
*
* @param array $vars
*/
public function setVariables(array $vars)
{
$this->variables = $vars;
}
/**
* Returns the text of the formula passed to the constructor
*
* @return string
*/
public function getFormula()
{
return $this->original_formula;
}
/**
* @return boolean
*/
private function validate()
{
$validate_str = count_chars(implode("", $this->valid_variables).
implode("", $this->valid_functions), 3);
if (preg_match('/[^0-9\*\+\-\/\^\.'.$validate_str.'EINF\s\(\)]/', $this->expression)) {
return false;
}
return true;
}
/**
* @param string $v1
* @param string $v2
*/
private function checkInf(&$v1, &$v2 = '') {
$v1 = ($v1==='INF') ? INF : (($v1==='-INF') ? -INF : $v1);
$v2 = ($v2==='INF') ? INF : (($v2==='-INF') ? -INF : $v2);
}
/**
* @param mixed $value
*
* @return mixed
*/
private function return_($value) {
if (abs($value) === INF) {
return $value;
} else if ($value === 'INF') {
return INF;
} else if ($value === '-INF') {
return -INF;
} else {
return (float) $value;
}
}
/**
* Calculates an operation ^
*
* @param array $array The subexpression of the formula
*
* @return array
*/
private function calculate1(array $array)
{
for ($i=count($array)-1; $i>=0; $i--) {
if (isset($array[$i]) && isset($array[$i-1]) && isset($array[$i+1])
&& $array[$i] === '^') {
$otp = 1;
$this->checkInf($array[$i-1], $array[$i+1]);
if (is_numeric($array[$i-1]) && is_numeric($array[$i+1])) {
if ($array[$i-1] < 0) {
$a = pow($array[$i-1]*-1, $array[$i+1]);
$otp = 2;
} else {
$a = pow($array[$i-1], $array[$i+1]);
}
} else {
$this->correct = false;
break;
}
unset($array[$i-1], $array[$i+1]);
$array[$i] = ($otp == 1) ? $a : $a*-1;
$array = array_values($array);
$i = count($array)-1;
}
}
return $array;
}
/**
* Calculates operations *, /
*
* @param array $array The subexpression of the formula
*
* @return array
*/
private function calculate2(array $array)
{
for ($i=0; $i<count($array); $i++) {
if (isset($array[$i]) && isset($array[$i-1]) && isset($array[$i+1])
&& ($array[$i] === '*' || $array[$i] === '/')) {
$this->checkInf($array[$i-1], $array[$i+1]);
if (!is_numeric($array[$i-1]) || !is_numeric($array[$i+1])) {
$this->correct = false;
break;
}
if ($array[$i] === '*') {
$a = $array[$i-1] * $array[$i+1];
} elseif ($array[$i] === '/') {
if ($array[$i+1] != 0) {
$a = $array[$i-1] / $array[$i+1];
} elseif ($array[$i-1] != 0 && $array[$i+1] == 0) {
$a = ($array[$i-1] > 0) ? INF : -INF;
} else {
$a = NAN;
}
}
unset($array[$i-1], $array[$i+1]);
$array[$i] = $a;
$array = array_values($array);
$i = 0;
}
}
return $array;
}
/**
* Calculates operations +, -
*
* @param array $array The subexpression of the formula
*
* @return array
*/
private function calculate3(array $array)
{
for ($i=0; $i<count($array); $i++) {
if (isset($array[$i]) && isset($array[$i-1]) && isset($array[$i+1])
&& ($array[$i] === '+' || $array[$i] === '-')) {
$this->checkInf($array[$i-1], $array[$i+1]);
if (!is_numeric($array[$i-1]) || !is_numeric($array[$i+1])) {
$this->correct = false;
break;
}
if ($array[$i] === '+') {
$a = $array[$i-1] + $array[$i+1];
} elseif ($array[$i] === '-') {
$a = $array[$i-1] - $array[$i+1];
}
unset($array[$i-1], $array[$i+1]);
$array[$i] = $a;
$array = array_values($array);
$i = 0;
}
}
return $array;
}
/**
* Calculates functions
*
* @param string $function
* @param string $str
* @param integer $strlen
* @param integer $i
*/
private function calculateFunction($function, &$str, &$strlen, $i)
{
$j = ($function == 'sqrt') ? $i+4 : $i+3;
$arg = null;
while (true) {
if (isset($str[$j])) {
if ((strstr('+-', $str[$j]) && $arg === null)
|| preg_match('/([\d\.eE\+\-])|([\d\.INF])/', $str[$j])) {
$arg .= $str[$j];
} elseif (strstr(' ', $str[$j]) && !strpbrk($arg, '0123456789')) {
} else {
$arg = trim($arg);
break;
}
$j++;
} else {
break;
}
}
$this->checkInf($arg);
if (!is_numeric($arg)) {
$this->correct = false;
} else {
if ($function == 'exp') {
$result = pow(M_E, $arg);
} else {
$result = $function($arg);
}
}
if (is_numeric($result) && $this->correct) {
$str1 = substr($str, 0, $i);
$str2 = substr($str, $j);
$str = $str1.' '.$result.$str2;
$strlen = strlen($str);
}
}
/**
* Combines operators and numbers
*
* @param array $array The subexpression of the formula
*
* @return array
*/
private function combine($array) {
$new_array = [];
$i = $j = $key = 0;
foreach ($array as $item) {
$array_ip1 = (isset($array[$i+1])) ? $array[$i+1] : null;
end($new_array);
$cur = current($new_array);
if ((@strstr('+-', (string) $item))
&& (!empty($cur) && @strstr('+-', (string) $cur))
&& (!empty($array_ip1) && @strstr('+-', (string) $array_ip1))) {
if ($item === '-')
$new_array[key($new_array)] = ($cur == '+') ? '-' : '+';
} elseif ((@strstr('+-', (string) $item))
&& (!empty($cur) && @strstr('*/^', (string) $cur))
&& (!empty($array_ip1) && @strstr('+-', (string) $array_ip1))) {
$new_array[] = $item;
} else {
if ((@strstr('+-', (string) $item)) && ($key+1 != $i)
&& (@strstr('*/^', (string) $array[$key]))
&& (!is_numeric($array[$key+1])) && (isset($array[$key+1]))) {
if ($item === '-')
$new_array[key($new_array)] = ($cur == '+') ? '-' : '+';
} else {
$new_array[] = $item;
$key = $i;
}
}
$i++;
}
$array = $new_array;
$new_array = [];
foreach ($array as $item) {
$array_i = $array[$j];
$array_ip1 = (isset($array[$j+1])) ? $array[$j+1] : null;
$array_im1 = (isset($array[$j-1])) ? $array[$j-1] : null;
$array_im2 = (isset($array[$j-2])) ? $array[$j-2] : null;
$array_im3 = (isset($array[$j-3])) ? $array[$j-3] : null;
if ($item === '+' || $item === '-') {
if (($j == 0 && is_numeric($array_ip1))
|| ($j > 0 && is_numeric($array_ip1)
&& (!empty($array_im1) && @stristr('+-*/^e', (string) $array_im1)))) {
if ($item === '+') {
$new_array[] = $array_ip1;
} else {
if ($array_im1 === '-' && $array_im2 !== '-') {
$new_array[] = $array_ip1;
} elseif ($array_im1 === '-' && $array_im3 === '-') {
$this->correct = false;
break;
} else {
$new_array[] = $item.$array_ip1;
}
}
} else {
if ($item === '-' && $array_ip1 === '-') {
if (count($new_array))
$new_array[] = '+';
} elseif ($item === '-' && $array_ip1 === '+') {
if (count($new_array))
$new_array[] = '+';
$new_array[] = '0';
$new_array[] = '-';
} else {
if (count($new_array) || $item != '+')
$new_array[] = $item;
}
}
} elseif (($j == 1 && is_numeric($item)
&& (!empty($array_im1) && @strstr('+-', (string) $array_im1)))
|| ($j > 1 && is_numeric($item)
&& (!empty($array_im1) && @strstr('+-', (string) $array_im1))
&& (!empty($array_im2) && @stristr('+-*/^e', (string) $array_im2)))) {
} else {
$new_array[] = $item;
}
$j++;
}
return $new_array;
}
/**
* Parses and evaluates the subexpression of the formula.
*
* @param string $str The subexpression inside parentheses, or entire formula
* if it doesn't contain parentheses.
*
* @return float
*/
private function parse($str)
{
$str = trim($str);
$this->expression = $str;
$strlen = strlen($str);
$main_array = [];
$count = 0;
for ($i=0; $i<$strlen; $i++) {
$str_i = $str[$i];
$str_ip1 = (isset($str[$i+1])) ? $str[$i+1] : null;
$str_ip2 = (isset($str[$i+2])) ? $str[$i+2] : null;
$str_ip3 = (isset($str[$i+3])) ? $str[$i+3] : null;
$str_ip4 = (isset($str[$i+4])) ? $str[$i+4] : null;
$str_im1 = (isset($str[$i-1])) ? $str[$i-1] : null;
$str_im2 = (isset($str[$i-2])) ? $str[$i-2] : null;
// NaN
if (stristr($str, 'NaN'))
return NAN;
// Spaces will be skipped
if ($str_i == ' ') {
$count++;
// Number
} elseif (is_numeric($str_i)) {
$main_array[$count] = (isset($main_array[$count])) ?
$main_array[$count].$str_i : $str_i;
// Constant pi
} elseif ($str_im1.$str_i == 'pi') {
} elseif (($str_i.$str_ip1 == 'pi')
&& (!$str_ip2 || (!empty($str_ip2) && strstr('+-*/^ ', $str_ip2)))) {
$count++;
$main_array[$count] = M_PI;
// Constant e
} elseif (($str_i == 'e') && ($str_ip1 != 'x') && (!is_numeric($str_im1))
&& (!$str_ip1 || (!empty($str_ip1) && strstr('+-*/^ ', $str_ip1)))) {
$count++;
$main_array[$count] = M_E;
// Number in E notation
} elseif ((strtolower($str_i) == 'e') && ($str_ip1 != 'x')
&& (is_numeric($str_im1))) {
$main_array[$count] = $main_array[$count].'E';
} elseif ((strstr('+-', $str_i)) && (strtolower($str_im1) == 'e')
&& (is_numeric($str_ip1)) && (is_numeric($str_im2))) {
$main_array[$count] = $main_array[$count].$str_i;
// Decimal point
} elseif (($str_i == '.') && ((isset($str_im1) && is_numeric($str_im1))
|| (isset($str_ip1)) && is_numeric($str_ip1))) {
$main_array[$count] = (isset($main_array[$count])) ?
$main_array[$count].'.' : '.';
// Function
} elseif ((in_array($str_i.$str_ip1.$str_ip2, $this->valid_functions))
|| ($str_i.$str_ip1.$str_ip2.$str_ip3 == 'sqrt')) {
if ($str_i.$str_ip1.$str_ip2.$str_ip3 == 'sqrt') {
if ($str_ip4 == ' ')
$this->calculateFunction('sqrt', $str, $strlen, $i);
} else {
if ($str_ip3 == ' ')
$this->calculateFunction($str_i.$str_ip1.$str_ip2, $str, $strlen, $i);
}
// Variable
} elseif (in_array($str_i, $this->valid_variables) && count($this->variables)) {
if (array_key_exists($str_i, $this->variables)
&& is_numeric($this->variables[$str_i])) {
$count++;
$main_array[$count] = (float) $this->variables[$str_i];
$count++;
} else {
$this->correct = false;
$this->error_type = 4;
break;
}
} else {
// Operator
$count++;
if (strstr('+-*/^', $str_i)) {
if (!count($main_array) && $str_i == '+')
continue;
$main_array[$count] = $str_i;
$count++;
} else {
// Constant Inf
if ($str_im2.$str_im1.$str_i == 'INF') {
} elseif ($str_im1.$str_i.$str_ip1 == 'INF') {
} elseif ($str_i.$str_ip1.$str_ip2 == 'INF') {
if ($str_im1 == '-' && !count($main_array)) {
$main_array[$count] = '-';
$count++;
}
$main_array[$count] = INF;
$count++;
} else {
// Nothing matches
$this->correct = false;
if (!$this->validate())
$this->error_type = 1;
break;
}
}
}
}
if (!$this->correct)
return 0;
$main_array = array_values($main_array);
if (isset($main_array[1])) {
$main_array = $this->combine($main_array);
$main_array = $this->calculate1($main_array);
$main_array = $this->calculate2($main_array);
$main_array = $this->calculate3($main_array);
if (count($main_array) != 1) {
$this->correct = false;
return 0;
}
}
if (!isset($main_array[0]) || strstr('+-*/^', (string) $main_array[0])
|| substr_count((string) $main_array[0], '.') > 1) {
$this->correct = false;
return 0;
}
return $this->return_($main_array[0]);
}
/**
* @param string $expression
* @param integer $length
* @param integer $cursor
* @param float $base
*
* @return \stdClass
*/
private function checkExp($expression, $length, $cursor, $base)
{
$response = new \stdClass();
if ($base < 0) {
$test_func = preg_replace('/\s+/', '', $expression);
$test_func = substr($test_func , 0, -strlen(preg_replace('/\s+/', '',
$base.substr($expression, $length-$cursor))));
$test_func_ok = true;
if (preg_match('/([nstpg]\()|(in|os|an|bs|rt|xp|og)/', substr($test_func, -2)))
$test_func_ok = false;
if ($test_func_ok) {
$expression = substr($expression, $length-$cursor+1);
$test_exp = ltrim($expression);
if (isset($test_exp[0]) && $test_exp[0] === '^') {
$exp = '';
for ($q=0; $q<=$cursor-1; $q++) {
if (isset($expression[$q]) && $expression[$q] === '^') {
$exp = ' ';
} elseif ($exp != '' && !strstr(' ', $expression[$q])) {
if (strstr('+-', $expression[$q]) && $exp == ' ') {
$exp .= $expression[$q];
} elseif (strstr('0123456789.(', $expression[$q])) {
if ($expression[$q] != '(')
$exp .= $expression[$q];
} else {
$exp = trim($exp);
$cursor = $cursor - $q;
if (isset($exp[0]) && $exp[0] == '+')
$exp = substr($exp, 1);
break;
}
}
}
$response->cursor = $cursor;
if (substr($exp, -1) == '.')
$exp = substr($exp, 0, -1);
if (!is_numeric($exp) || strstr($exp, '.')) {
$this->correct = false;
$response->result = 0;
} else {
$response->result = pow(abs($base),$exp) * pow(-1,$exp);
}
}
}
}
return $response;
}
/**
* Returns an error message
*
* @return string
*/
private function errorMsg()
{
switch ($this->error_type) {
case 1:
return 'Invalid character';
case 2:
return 'Empty string';
case 3:
return 'Mismatched parentheses';
case 4:
return 'Variable error';
default:
return 'Syntax error';
}
}
/**
* @param string $formula
*/
private function prepare(&$formula) {
$formula = '( '.$formula.' )';
$formula = str_replace('Inf', 'INF', $formula);
// Spaces and tab characters will be transformed
$formula = preg_replace('/[\+\-\*\/\^\(\)]/', ' ${0} ', preg_replace('/\s+/', '', $formula));
}
/**
* @param array $matches
*
* @return string
*/
private function match($matches) {
return ' ( '.preg_replace('/\s+/', '', $matches[0]).' ) ';
}
/**
* @param array $matches
*
* @return string
*/
private function match1($matches) {
return $matches[0][0] . '( ( '.substr($matches[0],1,1).' ) )' . $matches[0][2];
}
/**
* @return string
*/
private function match2($matches) {
return ' ( ( '.$matches[0].' ) ) ';
}
/**
* Groups the parts of the formula that must be evaluated first into parentheses
*
* @param string $formula
* @param string $opt
*/
private function group(&$formula, $opt = 'init') {
if ($opt == 'init') {
// Numbers in E notation
$formula = preg_replace_callback('/[\d\.]+( )?[eE]( )?[\+\-]?( )?[\d\.]+ /',
[$this, 'match'], $formula);
// Variables
if (count($this->variables) > 0) {
$valid_variables = implode("|", $this->valid_variables);
$formula = preg_replace_callback('/[\+\-\*\/\^ ]('.$valid_variables.')[ \+\-\*\/\^]/',
[$this, 'match1'], $formula);
}
} else {
// Functions
$valid_functions = implode("|", $this->valid_functions);
$formula = preg_replace_callback('/('.$valid_functions.')( )?[\+\-]?( )?[\d\.eEINF]+ /',
[$this, 'match2'], $formula);
}
}
/**
* @param float $result
* @param integer $precision
*
* @return float
*/
private function round_($result, $precision) {
if (abs($result) === INF) {
return $result;
}
$str = strtolower((string) $result);
if (strpos($str, 'e') !== false) {
$r = explode('e', $str);
$left = round((float) $r[0], (int) $precision);
$right = $r[1];
return (float) ($left.'e'.$right);
}
return round($result, (int) $precision);
}
/**
* Parses and evaluates a given formula.
*
* @return array Returns an array [0 => v1, 1 => v2], where
* v1 is 'done' or 'error', and
* v2 is a computed result or error message, respectively.
*/
public function getResult()
{
// Check that the formula is not empty
if (!isset($this->formula[0])) {
$this->correct = false;
$this->error_type = 2;
}
// Check set variables
for ($i=0; $i<=count($this->valid_variables)-1; $i++) {
if (strlen($this->valid_variables[$i]) != 1
|| !preg_match('/^([a-z])$/', $this->valid_variables[$i]) === 1
|| $this->valid_variables[$i] == "e") {
$this->correct = false;
$this->error_type = 4;
}
}
$this->prepare($this->formula);
$this->group($this->formula);
$open_parentheses_count = substr_count($this->formula, '(');
$close_parentheses_count = substr_count($this->formula, ')');
// Check for an equality of opening and closing parentheses
if ($open_parentheses_count != $close_parentheses_count) {
$this->correct = false;
$this->error_type = 3;
}
// Check the syntax is correct when using parentheses
if (preg_match('/(\)( )?[^\)\+\-\*\/\^ ])|(\(( )*?\))|([^nstgp\(\+\-\*\/\^ ]( )?\()/',
$this->formula)) {
$this->correct = false;
}
$processing_formula = $this->formula;
// Begin a general parse
while ((strstr($processing_formula, '(') || strstr($processing_formula, ')'))
&& $this->correct) {
$start_cursor_pos = 0;
$end_cursor_pos = 0;
$this->group($processing_formula, '');
$temp = $processing_formula;
while (strstr($temp, '(')) {
$strlen_temp = strlen($temp);
for ($i=0; $i<=$strlen_temp-1; $i++) {
if (isset($temp[$i]) && $temp[$i] == '(') {
$start_cursor_pos = $start_cursor_pos + $i+1;
$temp = substr($temp, $i+1);
break;
}
}
}
$strlen_temp = strlen($temp);
for ($i=0; $i<=$strlen_temp-1; $i++) {
if (isset($temp[$i]) && $temp[$i] == ')') {
$end_cursor_pos = $strlen_temp - $i;
$temp = substr($temp, 0, $i);
break;
}
}
$length = strlen($processing_formula);
if (!empty($temp)) {
$temp = $this->parse($temp);
$checkExp = $this->checkExp($processing_formula, $length, $end_cursor_pos, $temp);
if (isset($checkExp->result)) {
$temp = $checkExp->result;
$end_cursor_pos = $checkExp->cursor;
}
}
$processing_formula = substr($processing_formula, 0, $start_cursor_pos-1)
.$temp.substr($processing_formula, $length - $end_cursor_pos+1);
}
if ($this->correct) {
$this->formula = $processing_formula;
$result = $this->parse($this->formula);
}
if ($this->correct) {
return ['done', $this->round_($result, $this->precision)];
} else {
return ['error', $this->errorMsg()];
}
}
/**
* Get result, only value
*
* @return string
*/
public function getResultValue()
{
$result = $this->getResult();
return ($result[0] == 'done') ? $result[1] : 0;
}
}

11
modules/xmlfeeds/vendor/index.php vendored Normal file
View File

@@ -0,0 +1,11 @@
<?php
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,11 @@
<?php
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

1312
modules/xmlfeeds/views/css/jquery-ui.css vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,3 @@
.xml_feed_module .alert img{
display: none;
}

View File

@@ -0,0 +1,53 @@
#content.bootstrap .panel, #content.bootstrap #dash_version, #content.bootstrap .message-item-initial .message-item-initial-body, #content.bootstrap .timeline .timeline-item .timeline-caption .timeline-panel {
position: relative;
padding: 20px;
margin-bottom: 20px;
border: solid 1px #e6e6e6;
background-color: #fff;
-webkit-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: rgba(0,0,0,0.1) 0 2px 0,#fff 0 0 0 3px inset;
box-shadow: rgba(0,0,0,0.1) 0 2px 0,#fff 0 0 0 3px inset;
}
.nobootstrap .panel:not(.bootstrap), .nobootstrap .bootstrap #dash_version:not(.bootstrap), .bootstrap .nobootstrap #dash_version:not(.bootstrap), .nobootstrap .bootstrap .message-item-initial .message-item-initial-body:not(.bootstrap), .bootstrap .message-item-initial .nobootstrap .message-item-initial-body:not(.bootstrap), .nobootstrap .bootstrap .timeline .timeline-item .timeline-caption .timeline-panel:not(.bootstrap), .bootstrap .timeline .timeline-item .timeline-caption .nobootstrap .timeline-panel:not(.bootstrap) {
background-color: #ebedf4;
border: 1px solid #ccced7;
color: #585a69;
margin: 0 0 10px 0;
padding: 1em;
float: left;
width: 100%;
box-sizing: border-box;
}
#content.bootstrap .panel .panel-heading, #content.bootstrap #dash_version .panel-heading, #content.bootstrap .message-item-initial .message-item-initial-body .panel-heading, #content.bootstrap .timeline .timeline-item .timeline-caption .timeline-panel .panel-heading {
font-family: "Ubuntu Condensed",Helvetica,Arial,sans-serif;
font-weight: 400;
font-size: 14px;
text-overflow: ellipsis;
white-space: nowrap;
color: #555;
height: 32px;
}
h3:not(.modal-title), #content.bootstrap .panel-heading {
border: none;
font-size: 1.2em;
line-height: 2.2em;
height: 2.2em;
text-transform: uppercase;
border-bottom: solid 1px #eee;
padding: 0 0 0 5px;
margin: -20px -16px 15px -16px;
}
.bootstrap .panel-heading {
padding: 10px 15px;
border-bottom: 1px solid transparent;
border-top-right-radius: 2px;
border-top-left-radius: 2px;
}
.bootstrap .row, .bootstrap .multishop-well, .bootstrap #dashboard .data_list_vertical {
margin-left: -5px;
margin-right: -5px;
}
.color_box_core i{
margin-top: 4px;
}

View File

@@ -0,0 +1,736 @@
.blmod_mt10 {
margin-top: 10px;
}
.blmod_mt10i {
margin-top: 10px!important;
}
.blmod_mt15 {
margin-top: 15px;
}
.blmod_mt15i {
margin-top: 15px!important;
}
.blmod_m20 {
margin-top: 20px;
}
.blmod_b10 {
margin-bottom: 10px;
}
.blmod_b15 {
margin-bottom: 15px;
}
.blmod_b20 {
margin-bottom: 20px;
}
.blmod_mr15 {
margin-right: 15px;
}
.blmod_mr20 {
margin-right: 20px;
}
.blmod_ml10 {
margin-left: 10px;
}
.blmod_ml10i {
margin-left: 10px!important;
}
.blmod_ml15 {
margin-left: 15px;
}
.blmod_mb10 {
margin-bottom: 10px;
}
.blmod_mb15 {
margin-bottom: 15px;
}
.blmod_mb20 {
margin-bottom: 20px;
}
.blmod_mb25 {
margin-bottom: 25px;
}
.blmod_mb30 {
margin-bottom: 30px;
}
.mb15 {
margin-bottom: 15px;
}
.mb10 {
margin-bottom: 10px;
}
.cd {
cursor: default!important;
}
.blmod-modal-bg {
display: none;
z-index: 1000;
position: fixed;
width: 100%;
height: 100%;
background: #ffffffd9;
}
.blmod-modal {
display: none;
height: 100%;
z-index: 1000;
position: fixed;
color: #202226;
font-size: 20px;
left: 50%;
text-align: center;
}
.blmod-body {
padding: 15px 30px;
background: #25b9d72b;
border-radius: 5px;
}
.blmod-dual-ring {
display: inline-block;
width: 80px;
height: 80px;
}
.blmod-dual-ring:after {
content: " ";
display: block;
width: 60px;
height: 60px;
margin: 8px;
border-radius: 50%;
border: 7px solid #25b9d7;
border-color: #25b9d7 transparent #25b9d7 transparent;
animation: blmod-dual-ring 1.7s linear infinite;
}
@keyframes blmod-dual-ring {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.blmod_module input[type=radio] {
position: relative;
top: -2px;
margin-right: 1px;
}
.blmod_module input[type=checkbox] {
position: relative;
top: -1px;
}
.blmod_module input[type=text], .blmod_module input[type=password] {
height: 31px;
}
.blmod_module select{
height: 31px;
padding: 6px 8px;
}
.blmod_module .conf {
border: 1px solid #72CB67;
background-color: #DFFAD3;
}
.blmod_module .warn {
border: 1px solid #D3C200;
background-color: #FFFAC6;
}
.blmod_module .warn, .blmod_module .error, .blmod_module .conf {
color: #383838;
font-weight: 700;
margin: 0 0 10px 0;
line-height: 20px;
padding: 10px 15px;
font-family: Arial,Verdana,Helvetica,sans-serif;
}
.blmod_module .warning {
width: 400px;
margin: 0 0 15px 0;
line-height: 20px;
padding: 10px 20px 10px 20px;
border-top: 1px solid #FF9900;
border-bottom: 1px solid #FF9900;
background-color: #FFEBCC;
}
.blmod_module .conf img, .blmod_module .warn img, .blmod_module .error img {
margin: -4px 5px 0 0;
vertical-align: middle;
}
.blmod_module .btn {
padding: 6px 8px;
}
.module_logo{
float: left;
margin-right: 10px;
margin-top: 4px;
}
.module_logo img{
width: 36px;
height: 36px;
}
.module_title{
float: left;
}
.blmod_module h2{
margin-bottom: 0px;
margin-top: 0px;
}
.module_version{
font-size: 11px;
color: #7F7F7F;
margin-bottom: 10px;
font-style: italic;
}
.name_block{
float: left;
width: 155px;
color: #268CCD;
margin-top: 5px;
}
.name_block_main{
margin-top: 7px;
}
.info_block{
float: left;
}
.info_block_last{
margin-bottom: 13px;
}
.clear_block{
clear: both;
font-size: 0px;
height: 0px;
}
.blmod_comment{
font-size: 11px;
color: #7F7F7F;
padding-bottom: 5px;
}
.blmod_comment_warn{
font-size: 11px;
margin-left: 5px;
color: #FF6600;
font-weight: normal;
}
.more_info{
font-size: 11px;
color: #7F7F7F;
}
.list_checkbox{
float: left;
margin-right: 10px;
}
.list_input_text, .list_input_text_big{
margin-top: 7px;
float: left;
text-align: left;
width: 250px;
}
.list_input_text input{
width: 240px;
}
.list_input_text_big{
width: 500px;
}
.list_input_text_big input{
width: 250px!important;
}
.list_checkbox input{
margin-top: 2px;
}
.list_name{
float: left;
text-align: left;
width: 500px;
}
.list_name img{
height: 16px;
}
.list_row{
padding-bottom: 5px;
}
.blmod_module label{
cursor: pointer;
width: auto;
margin-bottom: 0!important;
}
.blmod_module label.with-input {
margin-top: 7px;
}
.order_status_color{
float: left;
width: 17px;
height: 16px;
margin-right: 5px;
margin-top: 1px;
}
.order_status_color_box{
margin-top: 3px;
}
.blmod_module_menu{
margin-bottom: 15px;
}
.menu_box{
}
.menu_box div{
float: left;
border-right: 1px solid #83796f;
margin-right: 10px;
padding-right: 10px;
}
.menu_box div.menu_title:last-child{
border: 0px;
}
.order_table{
margin-top: 20px;
}
.empty_message{
margin-top: 20px!important;
width: auto!important;
}
.pagination{
text-align: center;
margin-top: 15px;
color: silver;
font-size: 15px;
}
.pagination a{
padding: 5px;
color: #336699;
text-decoration: none;
}
.pagination a:hover{
color: #000;
}
.log_send_manual{
color: #005500;
}
.log_send_auto{
color: #000099;
}
.log_send_with_error{
color: #FF0000;
}
.log_send_with_error img{
margin-left: 5px;
}
.send_refund_send_status{
font-size: 10px;
}
.showMoreInfo{
display: none;
position: absolute;
border: 1px solid #333;
background-color: #414141;
border-radius: 3px;
padding: 7px;
color: #FFF;
font-size: 12px;
font-family: Verdana;
max-width: 230px;
text-align: left;
word-wrap: break-word;
}
.order_error_message{
color: #FF0000;
font-style: italic;
}
.checkbox_inline input{
width: auto!important;
}
.checkbox_inline label{
float: none;
margin-left: 7px;
}
.input_empty{
border-color: red!important;
}
.blmod_module #content{
padding: 0px!important;
margin: 0px!important;
}
.color_box_core{
float: left;
width: 50px;
height: 50px;
line-height: 45px;
font-size: 42px;
text-align: center;
color: #fff;
webkit-border-radius: 3px;
border-radius: 3px;
margin-right: 8px;
}
.color_box_core i{
font-size: 42px;
}
.icon_menu_box{
float: left;
margin-right: 35px;
padding: 5px;
}
.icon_menu_box .title_menu{
font-size: 16px;
}
.menu_active{
background-color: #d9edf7;
color: #117fe3;
webkit-border-radius: 3px;
border-radius: 3px;
padding: 4px;
border: 1px solid #badde3;
}
.icon_menu_box .title_info{
font-size: 11px;
color: #7F7F7F;
}
.icon_menu_box .title_text{
float: left;
}
.color_box_blue {
background-color: #2ba8e3;
-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 -3px 0 inset;
box-shadow: rgba(0, 0, 0, 0.2) 0 -3px 0 inset;
}
.color_box_red{
background-color: #ff5450;
-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 -3px 0 inset;
box-shadow: rgba(0, 0, 0, 0.2) 0 -3px 0 inset;
}
.color_box_green{
background-color: #95cc6b;
-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 -3px 0 inset;
box-shadow: rgba(0, 0, 0, 0.2) 0 -3px 0 inset;
}
.color_box_purple{
background-color: #9e5ba1;
-webkit-box-shadow: rgba(0,0,0,0.2) 0 -3px 0 inset;
box-shadow: rgba(0,0,0,0.2) 0 -3px 0 inset;
}
.color_box_grey{
background-color: #919191;
-webkit-box-shadow: rgba(0,0,0,0.2) 0 -3px 0 inset;
box-shadow: rgba(0,0,0,0.2) 0 -3px 0 inset;
}
.content_blmod{
font-size: 14px;
font-weight: normal;
}
.blmod_module .bootstrap label{
font-weight: normal!important;
}
.search_order_id{
width: 150px!important;
margin-top: 4px;
margin-right: 5px;
}
.blmod_module .bootstrap input[type="text"]{
display: inline!important;
}
.nobootstrap{
min-width: 600px;
}
.order_table_logs{
width: 850px!important;
}
.order_table_order{
width: 950px!important;
}
.table{
margin-top: 20px;
}
.icon-cog:before{
content: "\f013";
}
.user_anonymous{
font-style: italic;
}
#callback_url{
cursor: default;
}
.payment_status_box, .payment_status_box_demo{
display: inline;
padding: .2em .6em .3em;
font-size: 83%;
line-height: 1;
color: #fff;
text-align: center;
vertical-align: baseline;
border-radius: .25em;
background-color: #4169E1;
}
.payment_status_box_demo{
padding: 0px 4px 1px 4px;
background-color: DarkOrange;
}
.error-incompatible{
color: #B61212;
font-weight: bold;
padding-left: 5px;
padding-right: 5px;
}
.menu-top {
font-weight: bold;
font: 14px "Open Sans",Helvetica,Arial,sans-serif;
color: #000;
margin-left: 8px;
text-transform: uppercase;
}
.menu-top-item {
display: block;
padding-bottom: 7px;
}
.menu-top-item i {
margin-right: 7px;
width: 15px;
}
.menu-top-item .icon-copy{
position: relative;
top: -1px;
}
.menu-top-item .icon-plus-circle {
font-size: 16px;
}
.menu-top-item-title{
font-size: 13px;
word-wrap: break-word;
max-width: 227px;
display: inline-block;
}
.menu-top-feeds {
margin-top: 7px;
border-left: 1px solid #eee;
padding-left: 10px;
margin-bottom: 7px;
}
.menu-top-feeds .menu-top-item:last-child {
padding-bottom: 3px;
}
.menu-top-icon-block {
display: inline-block;
}
.icon-cart-arrow-down {
font-size: 16px;
}
.menu-top-item .icon-folder-open {
font-size: 15px;
}
.menu-top-item .icon-info-circle {
font-size: 16px;
}
.menu-top-item .icon-bar-chart {
font-size: 16px;
}
.menu-top-item .icon-trash {
font-size: 16px;
}
.menu-top-item .icon-user{
font-size: 15px;
}
.menu-top-statistics:hover i{
color: #6c5ce7;
}
.menu-top-duplicate:hover i{
color: #00b894;
}
.menu-top-delete:hover i{
color: #e77366;
}
.menu-top-item-icon{
color: #226290;
}
.menu-a, a.menu-a {
color: #2EACCE;
}
.affiliate-price-cron-button, .blmod_button_small {
cursor: pointer;
display: inline-block;
margin-right: 9px;
margin-bottom: 7px;
border: 1px solid #DEDEDE;
padding: 1px 6px 3px 6px;
border-radius: 3px;
color: #363A41;
background-color: #FFF;
}
.blmod_button_small {
font-size: 12px;
margin: 0;
background-color: #f3f3f3;
}
.affiliate-price-cron-button-active, .affiliate-price-cron-button:hover, .blmod_button_small:hover {
color: #fff;
background-color: #00aff0;
border-color: #008abd;
}
.blmod_tooltip{
position: relative;
cursor: help;
}
.blmod_tooltip span {
width: 450px;
margin-left: -999em;
position: absolute;
padding: 5px;
font-weight: normal;
word-wrap: break-word;
color: #000;
background: #FFF;
-webkit-filter: drop-shadow(1px 2px 1px #bcbcbc);
filter: drop-shadow(1px 2px 1px #bcbcbc);
border: 1px solid #cecece;
border-radius: 2px;
}
.blmod_tooltip span em {
font-style: normal;
font-weight: bold;
}
.blmod_tooltip:hover span {
left: 1em;
top: 2em;
z-index: 99;
margin-left: -60px;
}
.blmod_tooltip code{
word-wrap: break-word;
}
.blmod_about a{
color: #268CCD;
}
.blmod_about{
line-height: 25px;
}
.feed_url_copy_action:hover {
color: #0077a4;
}
.bootstrap .alert.alert-success:before, .bootstrap .alert.alert-warning:before{
font-size: 37px;
}
ul.blmod-instruction {
margin-top: 10px;
font-size: 12px;
margin-left: 0;
padding-left: 13px;
}
ul.blmod-instruction li {
padding-bottom: 5px;
}
.feed-type-not-found {
background: #fafbfc;
border: 2px solid #25b9d7;
border-radius: 3px;
padding: 10px;
font-size: 13px;
margin-top: 15px;
}
.feed-type-not-found a{
color: #25b9d7;
}
#search-feed-box .feed-search-icon {
color: #25b9d7;
top: 10px;
position: relative;
}
#search-feed-box .feed-search-input {
width: 377px;
border: 0;
border-bottom: 1px solid #CCC;
border-radius: 0;
background-color: #FFF;
box-shadow: none;
padding-top: 10px;
}
.product-property-row {
border-bottom: 1px solid #eaedef;
padding-bottom: 3px;
padding-top: 10px;
}
.product-property-row:hover {
background-color: #f4f8fb;
}
.product-property-row-name {
margin-left: 5px;
margin-bottom: 2px;
}
#title-replace-box .cn_line{
margin-bottom: 10px;
}
.title-editor-type {
margin-bottom: 15px;
}
.title-editor-type-name {
margin-bottom: 10px;
font-weight: bold;
font-size: 14px;
}
.nobootstrap .table-clean {
margin-top: 0;
border: 0;
border-radius: 0;
}
.nobootstrap .table-clean tr th {
background-color: #FFF;
font-weight: bold!important;
}
.bootstrap .table-clean tbody>tr>td {
padding: 8px 7px;
}
.alert-small-blmod, .info-small-blmod {
border-left: 3px solid #fcc94f;
background-color: #fff3d7;
color: #d2a63c;
border-radius: 3px;
padding: 5px 10px;
font-size: 13px;
}
.info-small-blmod {
border-color: #25b9d7;
background-color: #d5eef33b;
color: #0e3c61;
}
.info-small-blmod a, a.link-highlighted {
text-decoration: underline;
color: #0077a4;
}
.line-with-button {
cursor: pointer;
float: right;
color: #3586AE;
font-size: 13px;
margin-top: 5px;
}
.delete-link-alert {
color: #7F7F7F!important;
}
.delete-link-alert:hover {
color: #B61212!important;
}
.edit-price-value, .info-bubble {
display: inline-block;
background: #ff9800;
color: #FFF;
font-size: 11px;
padding: 1px 3px;
border-radius: 2px;
margin-left: 3px;
}
.info-bubble {
background: rgb(37, 185, 215);
color: #FFF;
padding: 0 7px;
border-radius: 8px;
font-weight: bold;
line-height: 16px;
}
.blmod-table-light {
border: 0!important;
}
.blmod-table-light th {
border-top: 0!important;
border-bottom: solid 1px #a0d0eb;
font-weight: normal;
background-color: #fafbfc!important;
font-size: 12px!important;
}
table.table-no-space tbody>tr>td {
padding-top: 0!important;
padding-bottom: 0!important;
}

View File

@@ -0,0 +1,667 @@
.cb, .blmod_cb{
clear: both;
font-size: 0;
height: 0;
}
.xml_feed_module table{
font-size: 14px;
}
.xml_feed_module table td{
padding-bottom: 5px;
}
.settings-column-name {
text-align: right;
padding-right: 20px;
width: 205px;
}
.xml_feed_module label {
float: left;
width: auto;
padding: 0;
text-align: left;
font-weight: normal;
cursor: pointer;
}
.table_name{
float: left;
font-size: 16px;
color: #268CCD;
font-weight: bold;
margin: 10px 0 3px 10px;
cursor: pointer;
}
.table_drop{
float: left;
font-size: 12px;
color: #a4a4a5;
font-weight: bold;
margin: 7px 0 0 3px;
}
.cn_table{
margin: 0 0 5px 0;
}
.cn_top{
font-weight: bold;
}
.cn_top div{
margin-bottom: 5px;
}
.cn_line{
clear: both;
}
.cn_line:hover{
background-color: #FFF;
}
.cn_name{
float: left;
width: 200px;
line-height: 21px;
}
.cn_status{
float: left;
max-width: 140px;
overflow: hidden;
max-height: 28px;
}
.cn_status label{
margin-top: 4px;
}
.cn_name_xml{
float: left;
width: 235px;
margin-right: 20px;
}
.cn_name-block-name {
float: left;
width: 300px;
line-height: 32px;
}
.block-name-box .cn_name_xml {
margin-right: 0;
}
.blmod_clicks_list{
margin-top: 20px;
}
.blmod_clicks_title{
border-bottom: 1px solid #EDE4D1;
color: #000!important;
background-color: #fafbfc!important;
}
.blmod_clicks_title a:hover {
text-decoration: none;
}
.blmod_clicks_row{
clear: both;
border-bottom: 1px solid #EAEDEF;
font-size: 12px;
color: #666;
background-color: #fff;
vertical-align: middle;
line-height: 33px;
}
.blmod_clicks_row:hover{
background-color: #F4F8FB;
}
.blmod_clicks_ip{
float: left;
width: 130px;
}
.blmod_clicks_user_id{
float: left;
width: 350px;
}
.blmod_clicks_date{
float: left;
width: 158px;
}
.blmod_clicks_url{
float: left;
}
.blmod_click_bg_dark{
background-color: #FFF;
}
.blmod_graphdiv{
font-size: 11px!important;
}
.blmod_unique_c{
color: #f5a834;
}
.blmod_total_c{
color: #427fc3;
}
.blmod_displays_c{
color: #008040;
}
.banner_line_text_small{
font-size: 12px;
}
.blmod_pagination{
font-size: 19px;
}
.blmod_pagination a{
text-decoration: underline;
}
.show_underline a:hover{
text-decoration: underline!important;
}
.bl_comments, .bl_comments_warn, .bl_comments_small{
color: #7F7F7F;
font-size: 11px;
margin-top: 1px;
}
.bl_comments_warn{
color: #B61212;
font-size: 15px;
}
.bl_comments_small {
font-size: 10px;
line-height: 10px;
}
ul.bl_affiliate_prices_list{
list-style-type: none;
margin-left: 0;
padding-left: 0;
}
ul.bl_affiliate_prices_list li{
margin-top: 4px;
padding-bottom: 3px;
border-bottom: 1px solid #CCCED7;
}
.xml_feed_module hr{
border: none;
height: 1px;
color: #CCCED7;
background-color: #CCCED7;
padding: 0;
margin-top: 10px;
margin-bottom: 10px;
}
.xml_feed_module .conf {
border: 1px solid #72CB67;
background-color: #DFFAD3;
}
.xml_feed_module .warn {
border: 1px solid #D3C200;
background-color: #FFFAC6;
}
.xml_feed_module .warn, .xml_feed_module .error, .xml_feed_module .conf {
color: #383838;
font-weight: 700;
margin: 0 0 10px 0;
line-height: 20px;
padding: 10px 15px;
font-family: Arial,Verdana,Helvetica,sans-serif;
}
.xml_feed_module .warning {
width: 400px;
margin: 0 0 15px 0;
line-height: 20px;
padding: 10px 20px 10px 20px;
border-top: 1px solid #FF9900;
border-bottom: 1px solid #FF9900;
background-color: #FFEBCC;
}
.xml_feed_module .conf img, .xml_feed_module .warn img, .xml_feed_module .error img {
margin: -4px 5px 0 0;
vertical-align: middle;
}
.xml_feed_module fieldset a{
text-decoration: none;
}
.read_more{
color: #336699!important;
font-size: 12px;
font-family: "Arial Black";
}
.xml_feed_kbd, kbd{
cursor: pointer;
padding: .1em .6em;
border: 1px solid #ccc;
font-size: 11px;
font-family: Arial,Helvetica,sans-serif;
background-color: #f7f7f7;
color: #333;
-moz-box-shadow: 0 1px 0 rgba(0,0,0,0.2),0 0 0 2px #fff inset;
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.2),0 0 0 2px #fff inset;
box-shadow: 0 1px 0 rgba(0,0,0,0.2),0 0 0 2px #fff inset;
border-radius: 3px;
display: inline-block;
margin: 0 .1em;
text-shadow: 0 1px 0 #fff;
line-height: 1.4;
white-space: nowrap;
}
.xml_feed_kbd{
padding: 2px 10px;
font-size: 15px;
text-decoration: none!important;
font-weight: bold;
}
#cron_file_box{
font-size: 12px;
}
#cron_file_box p{
margin: 0 0 3px 0;
padding: 0;
}
#cron_install_instruction{
margin-top: 5px;
border-top: 1px solid #ccced7;
padding-top: 5px;
}
label.feed_type_icon{
width: 107px!important;
text-align: center;
border-bottom: 2px solid #FFF;
}
.feed_type_icon{
float: left;
margin-left: 2px;
margin-top: 15px;
}
.feed_type_icon_f{
margin-left: 0;
}
.feed_type_icon img{
display: block;
text-align: center;
margin: 0 auto;
}
label.feed_type_icon:hover{
background: #f6f6f6;
border-radius: 4px;
border-bottom: 2px solid #d9d9d9;
}
.feed_type_id{
width: 45px;
margin-left: 5px;
}
img.feed_type_id {
vertical-align: middle!important;
}
.feed_settings_box{
float: left;
width: 615px;
}
input[type="text"].price_range_field{
width: 120px;
}
@media screen and (max-width: 1190px) {
.feed_settings_box{
width: 550px;
}
.cn_name_xml{
width: 150px;
}
input[type="text"].price_range_field{
width: 60px;
}
}
@media screen and (max-width: 1100px) {
.feed_settings_box{
width: 454px;
}
.cn_name{
width: 180px;
}
.cn_status{
width: 110px;
}
.cn_name_xml{
width: 130px;
}
}
#multistore_url_list label{
float: none;
}
.google_cat_map_blmod{
height: 22px;
border-radius: 1px;
box-shadow: none;
}
#search_result, .show_with_products, .show_with_products_edit{
margin-top: -18px;
background-color: #FFF;
color: #585A69;
font-size: 11px;
}
#search_result{
display: none;
position: absolute;
width: 450px;
border: 1px solid #d7d7d7;
z-index: 100;
margin-top: 0;
margin-left: 15px;
}
.show_with_products_edit img{
margin-top: 0;
}
#search_result ul, .show_with_products, .show_with_products_edit{
margin: 0;
padding: 0;
list-style: none;
}
#search_result ul li, .show_with_products li, .show_with_products_edit li{
min-height: 30px;
padding: 3px 5px 0px 7px;
border-bottom: 1px solid #eaedef;
text-decoration: none;
color: #666;
cursor: pointer;
}
.show_with_products li, .show_with_products_edit li{
cursor: default;
}
.show_with_products{
margin-bottom: 10px;
}
#search_result ul li:hover, .show_with_products li:hover, .show_with_products_edit li:hover{
background-color: #f4f8fb;
}
.productListDeleted {
background-color: #e77366;
color: #FFF!important;
}
.productListDeleted .search_drop_product img, .productListDeleted .search_drop_product i{
display: none;
}
.show_with_products li.productListDeleted:hover {
background-color: #f1ac9b;
color: #FFF;
}
.search_small_text{
font-size: 10px;
}
.find_word{
color: #1575bb;
font-weight: bold;
}
.autocomplite_clear{
float: left;
cursor: pointer;
display: none;
color: #D54E21;
font-size: 13px;
font-weight: bold;
margin-top: 5px;
margin-left: 5px;
}
.search_drop_product{
float: right;
font-weight: bold;
color: #d54e21;
font-size: 12px;
font-family: Verdana, serif;
text-align: center;
margin-top: 2px;
}
.search_drop_product i {
font-size: 17px;
color: #a06d6d;
}
.search_drop_product i:hover {
color: #d54e21;
}
.search_drop_product img {
padding-top: 2px!important;
}
.search_p_list .search_drop_product{
display: none;
}
.show_with_products,.show_with_products_edit{
margin-top: 10px;
line-height: 13px;
font-weight: normal;
color: #585A69;
}
.show_with_products .search_drop_product{
display: block;
cursor: pointer;
}
.show_with_products .search_p_name{
width: 315px;
}
.show_with_products_edit{
cursor: default;
}
.search_types{
color: #7F7F7F;
font-size: 11px;
margin-top: 5px;
}
.search_types label {
float: none;
}
#search_mask{
display: none;
position: fixed;
left: 0;
top: 0;
background-color: #336699;
z-index: 99;
opacity: 0.1;
}
.delete-button-link {
display: inline-block;
background: #ead4d1;
padding: 4px 10px;
font-weight: bold;
color: #a06d6d;
margin-left: 4px;
margin-top: 2px;
border-radius: 3px;
}
.delete-button-link:hover {
background: #d36a63;
color: #FFF;
}
.price-formula-text span {
color: #1472af;
}
.product-img {
float: left;
margin-right: 10px;
}
.product-settings {
float: left;
}
.product-settings-input {
}
.product-settings-input span {
display: inline-block;
width: 100px;
}
.product-settings-input input{
width: 80px!important;
}
.product-settings-input textarea{
width: 343px;
height: 43px;
display: inline-block;
}
.product-settings-input select{
width: 343px;
display: inline-block;
}
.block-info {
color: #6c868e;
font-size: 13px;
margin-bottom: 4px;
font-style: italic;
}
.category-level {
display: inline-block;
margin-left: 12px;
height: 26px;
background: url('../img/lv_bg.png') repeat-x;
}
.category-level-b, .category-level-f {
display: inline-block;
width: 25px;
height: 26px;
background: url('../img/lv2_b.png') no-repeat;
}
.category-level-f {
background: url('../img/lv2_f.png') no-repeat;
}
.filter-by-quantity img {
vertical-align: middle!important;
}
.filter-by-quantity select {
display: inline-block;
width: 55px;
margin-right: 7px;
vertical-align: bottom!important;
}
.filter-by-quantity label {
vertical-align: bottom!important;
float: none;
margin-right: 7px;
}
.button-title {
background: #2fabce;
color: #FFF;
font-weight: bold;
padding: 0 5px;
border-radius: 2px;
}
.option-box {
clear: both;
width: 100%;
border-bottom: 1px solid #EAEDEF;
padding: 10px 5px;
}
.option-box-title {
cursor: pointer;
color: #3586AE;
font-size: 15px;
}
.option-box-title i {
font-size: 16px;
font-weight: bold;
margin-left: 4px;
}
.option-box-content {
margin-top: 15px;
}
.option-box-content table {
border-spacing: 0 10px;
border-collapse: separate;
}
table.table {
border-spacing: 0;
}
#category-feed-settings .only-product {
display: none;
}
.box-toggle-active {
background-color: #f6f6f6;
}
.order-feed-settings .order-settings{
display: table-row!important;
}
.attribute-group-title {
font-weight: bold;
margin-bottom: 2px;
}
.attribute-list {
display: inline-block;
margin-right: 15px;
margin-bottom: 6px;
}
label.attribute-list {
float: none;
}
.blmod_module .bootstrap .attribute-list input[type="checkbox"] {
margin-top: 1px!important;
}
#affiliate_price_url_list a {
text-decoration: underline;
font-size: 13px;
}
#affiliate_price_url_list span {
color: #268CCD;
font-size: 13px;
}
.al-t {
vertical-align: top;
padding-top: 20px;
}
.attribute-box-scroll {
height: 700px;
overflow-y: scroll;
}
.attribute-box-scroll .cn_name_xml{
width: 195px;
}
.attribute-box-scroll ::-webkit-scrollbar {
display: block;
width: 11px;
}
.attribute-box-scroll ::-webkit-scrollbar-track {
background: #fcf8f8;
}
.attribute-box-scroll ::-webkit-scrollbar-thumb {
background: #bdbdbd;
}
.attribute-box-scroll ::-webkit-scrollbar-thumb:hover {
background: #626262;
}
.product-list-row {
padding-top: 4px;
padding-bottom: 4px;
}
.blmod-switch {
position: relative;
display: inline-block;
width: 30px!important;
height: 17px;
}
.blmod-switch input {
opacity: 0;
width: 0;
height: 0;
}
.blmod-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #b3c6cd;
-webkit-transition: .2s;
transition: .2s;
border-radius: 17px;
}
.blmod-slider:before {
position: absolute;
content: "";
height: 13px;
width: 13px;
left: 2px;
bottom: 2px;
background-color: #FFF;
-webkit-transition: .2s;
transition: .2s;
border-radius: 50%;
}
input:checked + .blmod-slider {
background-color: #50AD53FF;
}
input:focus + .blmod-slider {
box-shadow: 0 0 1px #50AD53FF;
}
input:checked + .blmod-slider:before {
-webkit-transform: translateX(13px);
-ms-transform: translateX(13px);
transform: translateX(13px);
}
.field-settings-languages label {
margin-top: 1px;
}
.field-settings-languages .cn_line {
margin-bottom: 7px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,11 @@
<?php
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 B

Some files were not shown because too many files have changed in this diff Show More