* @copyright 2014,2015 Vaclav Mach * @license EULA * @version 2.9.3 * @link http://www.prestahost.eu */ require_once("classes/FeedLocal.php"); class FeedSeznam extends FeedLocal { protected $feedname='zbozi_seznam.xml'; protected $cats_forbidden=array(); protected $ext_behav; protected $transformed; protected $filteredAttributes; protected $FilterCombinations; protected $unitFeatures; protected $upname ='SEZNAM'; public function __construct() { parent::__construct(); $cats=Configuration::get('ZBOZI_CATS_FORBIDDENzb'); if($cats && strlen($cats )) $this->cats_forbidden = explode(',', $cats); $features = json_decode(Configuration::get('ZBOZI_FEATURESzb'), true); if($features && is_array($features)) { foreach($features as $feature) { $this->unitFeatures[$feature[0]] = $feature[1]; } } $this->transformed=json_decode(Configuration::get('ZBOZI_TRANSFORMEDzb'), true); $this->ext_behav = (int)Configuration::get('ZBOZI_TEXT_EXT'); if(Configuration::get('ZBOZI_FILTERATR_'.$this->upname)) { $this->filteredAttributes = $this->getFilteredAttributes($this->upname); $this->FilterCombinations = new FilterCombinations(); } } protected function StartFeed($fp) { fputs($fp, "\n"); fputs($fp, "\n"); } protected function CloseFeed($fp) { fputs($fp, ""); } protected function createItem($product, $url, $imgurl, $all_images) { if($this->isInForbiddenCategory($product['id_category_default']) && (int) Configuration::get('ZBOZI_CATS_EROTIC') != 1) return; if(Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL')) { $url= $this->cs_utf2ascii($url); } $url.=trim(Configuration::get('ZBOZI_UTM_'.$this->upname)); $item= "\t\t\n"; $item.=$this->createTag('ITEM_ID', $this->unique_item_id($product['id_product'], 0)); $reference = $this->getReference($product); $item.=$this->addProductAndProductname($product, $reference, $product['ean13']); if(isset($product['productline']) && strlen($product['productline'])) { $item.=$this->createTag('PRODUCT_LINE', $product['productline']); } $item.=$this->getCategoryText($product['categorytext_seznam'])."\n"; if(isset($product['extramessage']) && strlen($product['extramessage'])) { $messages = array('extended_warranty','free_accessories','free_case','free_gift','free_installation','free_store_pickup','voucher', 'free_delivery'); while(list($key,$val) = each($messages)) { if(isset($product['extramessage'][$key]) && strlen($product['extramessage'][$key] ) &&(int)$product['extramessage'][$key] ) { $item.=$this->createTag('EXTRA_MESSAGE', $val); } } } $features = $this->prefilterFeatures($product['features'], $product['categorytext_seznam']); if(is_array($features) && count($features)) { $item.=$this->addFeatures($features); } $item.= "\t\t\t".$this->prepareString($this->getDescription($product))."\n"; $item.= "\t\t\t".$this->prepareString($url)."\n"; // $item.= "\t\t\tdets2908\n"; if($imgurl) { $item.=$this->createTag('IMGURL', $this->prepareString($imgurl)); } if(Configuration::get('ZBOZI_MULTIPLE_IMAGES') && $all_images) $item.=$this->additionalImages($all_images, $imgurl, 0); global $CurrencyTo; if(! is_null($CurrencyTo)) { $product['price'] =Tools::convertPrice( $product['price'] , $CurrencyTo); } if(Configuration::get("ZBOZI_ROUND_ZBOZI") && (is_null($CurrencyTo) || $CurrencyTo->iso_code == 'CZK' )) { $product['price'] = Tools::ps_round($product['price'],0); } $item.=$this->createTag('PRICE_VAT', $product['price']); $item.= "\t\t\t".$this->getAvailability($product)."\n"; if($this->isValidEan($product['ean13'])) $item.=$this->createTag('EAN', $this->prepareString($product['ean13'])); if($reference && strlen($reference)) { $item.=$this->createTag('PRODUCTNO', $reference); } if(isset($product['max_cpc']) && strlen($product['max_cpc'])) $item .=$this->createTag('MAX_CPC', $this->floatFromString($product['max_cpc'])); if(isset($product['max_cpc_search']) && strlen($product['max_cpc_search'])) $item .=$this->createTag('MAX_CPC_SEARCH', $this->floatFromString($product['max_cpc_search'])); if(($this->isInForbiddenCategory($product['id_category_default']) && (int) Configuration::get('ZBOZI_CATS_EROTIC') == 1) || Configuration::get('ZBOZI_CATS_EROTIC') == 2 ) $item.=$this->createTag('EROTIC', 1); if($product['manufacturer_name']) $item.=$this->createTag('MANUFACTURER', $this->prepareString($product['manufacturer_name'])); $item.="\t\t\n"; return $item; } protected function getItemGroup($product, $url, $cover, $all_images) { if($this->isInForbiddenCategory($product['id_category_default'])) { return; } $itemgroup=''; foreach($product['attributes'] as $combination) { if($this->jen_skladem && $combination['quantity'] <=0) { continue; } if((float)($product['price'] + $combination['price'] > 0)) { if(Configuration::get('ZBOZI_FILTERATR_'.$this->upname)) { if($this->FilterCombinations->remap($combination, $this->filteredAttributes, $product['id_product']) !== false) $itemgroup.=$this->createItemCombination($product, $combination, $url, $cover, $all_images); } else $itemgroup.=$this->createItemCombination($product, $combination, $url, $cover, $all_images); } else { ; } } return $itemgroup; } protected function createItemCombination($product, $combination, $url, $imgurl, $all_images) { if($this->isInForbiddenCategory($product['id_category_default']) && (int) Configuration::get('ZBOZI_CATS_EROTIC') != 1) return; $item= "\t\t\n"; $item.=$this->createTag('ITEM_ID', $this->unique_item_id($product['id_product'], $combination['id_product_attribute'])); $item.=$this->createTag('ITEMGROUP_ID', $product['id_product']); $reference = $this->getReference($product, $combination); if(isset($combination['ean13']) && strlen($combination['ean13'])) $ean13=$combination['ean13']; else $ean13=$product['ean13']; $item.=$this->addProductAndProductname($product, $reference, $ean13, $combination); if(isset($product['productline']) && strlen($product['productline'])) { $item.=$this->createTag('PRODUCT_LINE', $product['productline']); } if($this->isValidEan($ean13)) $item.=$this->createTag('EAN', $ean13); if($reference && strlen($reference)) $item.=$this->createTag('PRODUCTNO', $reference); $item.=$this->createTag('DESCRIPTION', $this->prepareString($this->getDescription($product))); $url.=trim(Configuration::get('ZBOZI_UTM_'.$this->upname)); $url.='#'.$this->getCombinationUrl($combination['attributes']); if(isset($combination['removed']) && count($combination['removed'])) { $url.= $this->getCombinationUrl($combination['removed']); } $item.=$this->createTag('URL', $this->prepareString($url)); $imgurlc = ''; if($combination['id_image']) { $imgurlc = $this->combinationCoverUrl($all_images, $combination['id_product_attribute']); $item.=$this->createTag('IMGURL', $this->prepareString($imgurlc)); if(Configuration::get('ZBOZI_MULTIPLE_IMAGES') && $all_images) $item.= $this->additionalImages($all_images, $imgurlc, $combination['id_product_attribute']); } if($imgurlc == '' && $imgurl) { $item.=$this->createTag('IMGURL', $this->prepareString($imgurl)); } if(isset($this->cache[$product['id_product']][$combination['id_product_attribute']]) && $this->cache[$product['id_product']][$combination['id_product_attribute']]['date_upd'] == $product['date_upd'] && $this->cache[$product['id_product']][$combination['id_product_attribute']]['product_price'] == $product['price'] && $this->cache[$product['id_product']][$combination['id_product_attribute']]['attribute_price'] == $combination['price'] ) { $price=$this->cache[$product['id_product']][$combination['id_product_attribute']]['price']; } else { $price=Product::getPriceStatic($product['id_product'], true, $combination['id_product_attribute'],2); if((float)$product['unit_price_ratio'] > 0 && $this->unitprice) { $price = Tools::ps_round(($price /$product['unit_price_ratio']), 2); } $this->cache[$product['id_product']][$combination['id_product_attribute']]['price']=$price; $this->cache[$product['id_product']][$combination['id_product_attribute']]['date_upd']=$product['date_upd']; $this->cache[$product['id_product']][$combination['id_product_attribute']]['product_price']=$product['price']; $this->cache[$product['id_product']][$combination['id_product_attribute']]['attribute_price']=$combination['price']; } global $CurrencyTo; if(! is_null($CurrencyTo)) { $price=Tools::convertPrice($price, $CurrencyTo); } if(Configuration::get("ZBOZI_ROUND_ZBOZI") && (is_null($CurrencyTo) || $CurrencyTo->iso_code == 'CZK' )) { $price = Tools::ps_round($price,0); } $item.=$this->createTag('PRICE_VAT', $price); $item.=$this->getCategoryText($product['categorytext_seznam'])."\n"; if(isset($product['extramessage']) && strlen($product['extramessage'])) { $messages = array('extended_warranty','free_accessories','free_case','free_gift','free_installation','free_store_pickup','voucher', 'free_delivery'); while(list($key,$val) = each($messages)) { if(isset($product['extramessage'][$key]) && strlen($product['extramessage'][$key] ) &&(int)$product['extramessage'][$key] ) { $item.=$this->createTag('EXTRA_MESSAGE', $val); } } } // $features = $product['features']; $features=$this->featuresFromCombination($combination, $product['features']); $features = $this->prefilterFeatures($features, $product['categorytext_seznam']); if(is_array($features) && count($features)) { $item.=$this->addFeatures($features); } $item.=$this->createTag('DELIVERY_DATE', $this->getAvailability($this->mergeAvailability($combination, $product))); if(isset($product['max_cpc']) && strlen($product['max_cpc'])) $item .=$this->createTag('MAX_CPC', $this->floatFromString($product['max_cpc'])); if(isset($product['max_cpc_search']) && strlen($product['max_cpc_search'])) $item .=$this->createTag('MAX_CPC_SEARCH', $this->floatFromString($product['max_cpc_search'])); if(($this->isInForbiddenCategory($product['id_category_default']) && (int) Configuration::get('ZBOZI_CATS_EROTIC') == 1) || Configuration::get('ZBOZI_CATS_EROTIC') == 2 ) $item.=$this->createTag('EROTIC', 1); if($product['manufacturer_name']) $item.=$this->createTag('MANUFACTURER', $this->prepareString($product['manufacturer_name'])); if(isset($product['max_cpc']) && strlen($product['max_cpc'])) $item .=$this->createTag('MAX_CPC', $this->floatFromString($product['max_cpc'])); if(isset($product['max_cpc_search']) && strlen($product['max_cpc_search'])) $item .=$this->createTag('MAX_CPC_SEARCH', $this->floatFromString($product['max_cpc_search'])); $item.="\t\t\n"; return $item; } protected function getCategoryText($categorytext) { $item=''; if(!empty($categorytext) && is_array($categorytext)) { foreach($categorytext as $category) { $item.=''.$this->prepareString($category).''; } } elseif(!empty($categorytext)) { $item.=''.$this->prepareString($categorytext).''; } return $item; } protected function getAvailability($item) { $availability=parent::getAvailability($item); if(strlen($availability) == 10 && substr($availability,0,1) == 2) return $availability; if($availability == 32) // 32 je rezervovano pro heureka $availability = 31; if((int)Configuration::get('ZBOZI_SKLADzb') && (int)$this->availability_mode == 0 && !empty($item['available_now'])) { if((int)Configuration::get('ZBOZI_SKLADzb') == 1) { if($availability == 1) return 0; } elseif((int)Configuration::get('ZBOZI_SKLADzb') == 2) { $text=mb_strtolower($item['available_now'], 'UTF-8'); $pos=strpos($text, 'skladem'); if(!($pos === false)) return 0; } } return $availability; } protected function isInForbiddenCategory($id_category_default) { if(!is_array($this->cats_forbidden)) return false; if(!count($this->cats_forbidden)) return false; if(in_array($id_category_default, $this->cats_forbidden)) return true; return false; } private function additionalImages($all_images, $cover_url, $id_product_attribute = 0) { $retval =''; foreach($all_images as $imgurl) { if($imgurl['id_product_attribute'] == $id_product_attribute) if($cover_url != $imgurl['url']) $retval.=$this->createTag('IMGURL', $this->prepareString($imgurl['url'])); } return $retval; } //todo filter and remap features viz samostatne soubory ve 3.14 private function prefilterFeatures($features, $categorytext) { return $features; } protected function addFeatures($features) { $retval=''; foreach($features as $feature) { $retval.="\t\t\t\n\t\t\t\t{$this->prepareString($feature['name'])}"; $retval.="\t\t\t\t{$this->prepareString($feature['value'])}\n"; if(is_array($this->unitFeatures) && isset($this->unitFeatures[$feature['id_feature']])) { $retval.="\n\t\t\t\t{$this->prepareString($this->unitFeatures[$feature['id_feature']])}\n"; } $retval.="\t\t\t\n"; } return $retval; } } ?>