Перейти к содержанию
  • В связи с блокировкой банка QIWI оплата через сайт не возможна.
    Для оплаты и получения дополнений просьба писать в личные сообщения
    Admin*у
    После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

Помогите, пожалуйста, доработать модуль.


Рекомендуемые сообщения

В модуле для формирования YML есть проблема. Если товар идёт по акции, то при разбивке по опции исходная цена каждой опции идёт с одинаковой ценой (ценой акции). Мне надо, чтобы было цена по акции + значение цены опции (в теге price). <price> формируется не правильно, а <oldprice> правильно, без учёта акции.

Контроллер:

Спойлер
<?php
class ControllerExtensionFeedOcextFeedGeneratorYaMarket extends Controller {
	private $shop = array();
	private $currencies = array();
	private $categories = array();
        private $product_categories = array();
	private $offers = array();
        private $offers_fwrire = array('offers'=>array(),'cache_files'=>array());
        private $prices = array();
        private $parse_yml = array();
        private $delivery_option = array();
        private $general_setting = array();
        private $setting_yml = array();
        private $eol = "\n";
        private $debug = 0;
        private $memory_limit_on_fwrite = 0.7;///0.020625;
        private $l_data = array();
        private $HTTP_SERVER;
        private $count_skips = 0;
        private $count_offers = 0;
        private $total_memory = 0;
        private $log_errors = array();
        private $path_on_model = 'model_extension_feed_ocext_feed_generator_yamarket';
        private $path_oc_version = 'extension/feed';
        private $cfiles = array(
            'offers_cache'=>'multi_yml_offers_',
            'yml_parts_cache'=>'multi_yml_yml_parts_',
            'fb_parts_cache'=>'multi_yml_fb_parts_',
        );




        public function index() {
            
                $error = array();                                                                                                                                                                                                                                                                                                                                                                   eval(base64_decode('JHRoaXMtPmNoZWNrbGljZW5zZSgpOw=='));//OCext.com: do not delete this line | не удаляйте эту строку
            
                if (!$this->config->get('ocext_feed_generator_yamarket_status')) {
                    $error[] = 'Модуль выключен';
                }
                
                $general_setting = $this->config->get('ocext_feed_generator_yamarket_general_setting');
                
                if(!isset($general_setting['user_key']) || !$general_setting['user_key']){
                    $error[] = 'Не указан лицензионный ключ. Отправьте запрос на welcome@ocext.com, в котором укажите сайт, где приобретался модуль, номер заказа и email аккаунта';
                }
                
                if(!isset($general_setting['user_email']) || !$general_setting['user_email']){
                    $error[] = 'Не указан лицензионный email покупателя. В настройках модуля укажите email, который отправлялся при запросе лицензинного ключа';
                }
                
                if(!file_exists($_SERVER["DOCUMENT_ROOT"].'/system/library/vendor/ocext/ocext_feed_generator_yamarket_license.php')){
                    $error[] = 'Неверно лицензионный ключ. Отправьте запрос на welcome@ocext.com, в котором укажите сайт, где приобретался модуль, номер заказа и email аккаунта';
                }
                
                $token_get = '';
                
                $filter_data_group_id = '';
                
                if(isset($this->request->get['token'])){
                    
                    $token_get = $this->request->get['token'];
                    
                    if(isset($general_setting['filter_data'])){
                        
                        foreach ($general_setting['filter_data'] as $filter_data) {
                            
                            if(isset($this->setting_yml['path_token']) && isset($filter_data[$this->setting_yml['path_token']]) && $filter_data[$this->setting_yml['path_token']] ===$token_get){
                                
                                $general_setting['path_token_export'] = $token_get;
                                if(isset($filter_data['fb_filename_export'])){
                                    $general_setting['fb_filename_export'] = $filter_data['fb_filename_export'];
                                }
				
				$general_setting['promos_ids'] = array();
				if(isset($filter_data['promos_ids'])){
                                    $general_setting['promos_ids'] = $filter_data['promos_ids'];
                                }
                                
                                $general_setting['filename_export'] = $filter_data['filename_export'];
                                $general_setting['yml_currencies'] = $filter_data['yml_currencies'];
                                $filter_data_group_id = $filter_data['filter_data_group_id'];
                                
                                if(!isset($filter_data['content_language_id']) || !$filter_data['content_language_id']){
                                    
                                    $content_language_id = $this->config->get('config_language_id');
                                    
                                }else{
                                    
                                    $content_language_id = $filter_data['content_language_id'];
                                    
                                }
                                
                            }
                            
                        }
                        
                    }
                    
                }
                if(!isset($general_setting['path_token_export']) || !$general_setting['path_token_export']){
                    $error[] = 'Не задан защитный параметр ссылки - token';
                }
                
                if(isset($general_setting['path_token_export']) && $token_get!=$general_setting['path_token_export']){
                    $error[] = 'Неверный защитный параметр ссылки - token';
                }
                
                
                if(!isset($general_setting['yml_currencies']) || !$general_setting['yml_currencies']){
                    $error[] = 'Не указана валюта - обязательный параметр';
                }else{
                    $this->setCurrencyAttributes($general_setting['yml_currencies']);
                }
                
                if(!isset($general_setting['name']) || !$general_setting['name']){
                    $error[] = 'Не указано краткое название магазина';
                }else{
                    $this->setShopAttributes('name', $general_setting['name']);
                }
                
                if(!isset($general_setting['company']) || !$general_setting['company']){
                    $error[] = 'Не указано название компании';
                }else{
                    $this->setShopAttributes('company', $general_setting['company']);
                }
                
                if(!$this->config->get('config_secure')){
                    $this->setShopAttributes('url', HTTP_SERVER);
                    $this->HTTP_SERVER = HTTP_SERVER;
                }else{
                    $this->setShopAttributes('url', HTTPS_SERVER);
                    $this->HTTP_SERVER = HTTPS_SERVER;
                }
                
                if(isset($general_setting['platform']) && $general_setting['platform']){
                    $this->setShopAttributes('platform', $this->config->get('ayeogs_platform'));
                }
                
                if(isset($general_setting['version']) && $general_setting['version']){
                    $this->setShopAttributes('version', $general_setting['version']);
                }
                
                $this->general_setting = $general_setting;
		
		$this->load->model($this->path_oc_version.'/ocext_feed_generator_yamarket');
		
		if(isset($general_setting['promos_ids']) && $general_setting['promos_ids']){
		    
		    foreach ($general_setting['promos_ids'] as $key => $promos_id) {
			
			$promos = $this->{$this->path_on_model}->getPromoGift($promos_id);
			
			if($promos){
			    
			    if($promos['promos_type']=='gift-with-purchase'){
				
				foreach ($promos['promo-gifts'] as $promo_gifts_id => $promo_gifts) {
				    
				    if($promo_gifts['name']!=='' && $promo_gifts['picture']!==''){
					
					$this->general_setting['gifts'][ $promos_id.'000'.$promo_gifts_id ] = array(
					    'name' => $promo_gifts['name'],
					    'picture' => $promo_gifts['picture'],
					    'gift_id' => $promos_id.'000'.$promo_gifts_id,
					);
					
					$promos['gift_ids_selected'][$promos_id.'000'.$promo_gifts_id] = $promos_id.'000'.$promo_gifts_id;
					
				    }
				    
				}
				
			    }
			    
			    $this->general_setting['promos'][$promos_id] = $promos;
			    
			}
			
		    }
		    
		}
                
                $this->general_setting['filter_and_raplace_tags'] = $this->{$this->path_on_model}->getFilterData('ocext_feed_generator_yamarket_ym_filter_columns',$filter_data_group_id);
                
                if(!$error){
                    //создаем список категорий
                    $categories_end_offers = $this->getCategoriesAndOffers($filter_data_group_id,$content_language_id,$this->setting_yml);
                    if(!$categories_end_offers){
                        $error[] = 'Не найдены категории и/или товары. Невозможно создать файл без категорий и/или товаров';
                    }
                }
                
                if(isset($categories_end_offers['add_settings'])){
                    
                    $this->general_setting['add_settings'] = $categories_end_offers['add_settings'];
                    
                }
                
                
                if($error){
                    $this->sendErrorXML($error);
                    return;
                }
                
                 $this->load->model($this->path_oc_version.'/ocext_feed_generator_yamarket');
            
                $unlink_all_cache = array($this->cfiles['offers_cache'].$this->request->get['token'].'-');
                
                if(isset($this->request->get['fb'])){
                    
                    $unlink_all_cache[] = $this->cfiles['fb_parts_cache'].$this->request->get['token'].'-';
                    
                }else{
                    
                    $unlink_all_cache[] = $this->cfiles['yml_parts_cache'].$this->request->get['token'].'-';
                    
                }
                
                $this->{$this->path_on_model}->unlinkAllCache($unlink_all_cache);
                
                foreach ($categories_end_offers['categories'] as $category) {
                    $this->setCategoryAttrubite($category['name'], $category['category_id'], $category['parent_id'], $category);
                }
                
                if( isset($this->general_setting['replace_cid_to_product_on_this'])){
                    
                    foreach($this->general_setting['replace_cid_to_product_on_this'] as $replace_cid_to_product_on_this){
                        
                        if(isset($this->categories[$replace_cid_to_product_on_this])){
                            
                            $parentId = $this->categories[$replace_cid_to_product_on_this]['parentId'];
                            
                            unset($this->categories[$replace_cid_to_product_on_this]['parentId']);
                            
                            if(isset($this->categories[$parentId])){
                            
                                $parentId_this = $parentId;
                                
                                if(isset($this->categories[$parentId]['parentId'])){
                                    
                                    $parentId = $this->categories[$parentId]['parentId'];
                                
                                    unset($this->categories[$parentId]);
                                    
                                }
                                
                                unset($this->categories[$parentId_this]);
                                
                            }
                            
                            if(isset($this->categories[$parentId])){
                            
                                $parentId_this = $parentId;
                                
                                if(isset($this->categories[$parentId]['parentId'])){
                                    
                                    $parentId = $this->categories[$parentId]['parentId'];
                                
                                    unset($this->categories[$parentId]);
                                    
                                }
                                
                                unset($this->categories[$parentId_this]);
                                
                            }
                            if(isset($this->categories[$parentId])){
                            
                                $parentId_this = $parentId;
                                
                                if(isset($this->categories[$parentId]['parentId'])){
                                    
                                    $parentId = $this->categories[$parentId]['parentId'];
                                
                                    unset($this->categories[$parentId]);
                                    
                                }
                                
                                unset($this->categories[$parentId_this]);
                                
                            }
                            if(isset($this->categories[$parentId])){
                            
                                $parentId_this = $parentId;
                                
                                if(isset($this->categories[$parentId]['parentId'])){
                                    
                                    $parentId = $this->categories[$parentId]['parentId'];
                                
                                    unset($this->categories[$parentId]);
                                    
                                }
                                
                                unset($this->categories[$parentId_this]);
                                
                            }
                            
                        }
                        
                    }
                    
                    
                    
                    foreach($this->categories as $category_id_on_delete => $category_on_delete){
                        
                        if(isset($category_on_delete['parentId']) && in_array($category_on_delete['parentId'], $this->general_setting['replace_cid_to_product_on_this'])){
                            
                            $category_id_on_delete_this = $category_on_delete['id'];
                            
                            unset($this->categories[$category_id_on_delete]);
                            
                            foreach($this->categories as $category_id_on_delete2 => $category_on_delete2){

                                if(isset($category_on_delete2['parentId']) && $category_on_delete2['parentId']==$category_id_on_delete_this){
                                    
                                    $category_id_on_delete_this3 = $category_on_delete2['id'];
                                    
                                    unset($this->categories[$category_id_on_delete2]);
                                    
                                    foreach($this->categories as $category_id_on_delete3 => $category_on_delete3){
                                        
                                        if(isset($category_on_delete2['parentId']) && $category_on_delete2['parentId']==$category_id_on_delete_this3){
                                            
                                            unset($this->categories[$category_id_on_delete3]);
                                            
                                        }
                                        
                                    }
                                    
                                }

                            }
                            
                        }

                    }

                }
                
                if($this->debug){
                    
                    $this->log_errors[] = 'memory_limit '.ini_get('memory_limit').', max_execution_time '.ini_get('max_execution_time');
                    
                    foreach ($categories_end_offers['log_errors'] as $log_error) {

                        $this->log_errors[] = $log_error;

                    }
                    
                }
                
                $cache_status = 0;
                
                if(isset($this->general_setting['yml_cache_enable']) && $this->general_setting['yml_cache_enable']){
            
                    $cache_status = 1;

                }
                
                if($cache_status && isset($categories_end_offers['cache']) &&  $categories_end_offers['cache']){
                    
                    foreach ($categories_end_offers['cache'] as $cache_file_name) {
                        
                        $cache_offers = $this->getCache($cache_file_name);
                        
                        if($cache_offers){
                            
                            $this->delivery_option += $this->getShopDeliveryOptionAttrubite($cache_offers);
                            
                            foreach ($cache_offers as $i_cache_offer => $product) {
                        
                                $this->getOfferAttrubite($product);

                                unset($cache_offers[$i_cache_offer]);

                            }
                            
                            if($this->debug){
                                
                                $this->total_memory += memory_get_usage()/1024/1024;
                                
                                $this->log_errors[] = 'memory_get_usage for '.$cache_file_name.' '.round((memory_get_usage()/1024/1024),2).' M';
                                
                                $this->offers = array();
                                
                            }
                            
                        }
                        
                        $cache_status++;
                        
                    }
                    
                    if($this->debug){
                        
                        $this->log_errors[] = "count_skips: ".  $this->count_skips.', count_offers: '.$this->count_offers;
                        
                        $this->log_errors[] = "total memory usage: ".  round($this->total_memory,2).' M';
                        
                    }
                    
                }else{
                    
                    $this->delivery_option = $this->getShopDeliveryOptionAttrubite($categories_end_offers['offers']);
                    
                    foreach ($categories_end_offers['offers'] as $i_product => $product) {
                        
                        $this->getOfferAttrubite($product);
                        
                        unset($categories_end_offers['offers'][$i_product]);
                        
                    }
                    
                    $this->total_memory += memory_get_usage()/1024/1024;
                                
                    $this->log_errors[] = "count_skips: ".  $this->count_skips.', count_offers: '.$this->count_offers;
                        
                    $this->log_errors[] = "total memory usage: ". round($this->total_memory,2).' M';
                    
                }
                
                if($this->product_categories){
                    
                    foreach ($this->categories as $category_id => $category) {
                        
                        if(!isset($this->product_categories[$category_id])){
                            
                            unset($this->categories[$category_id]);
                            
                        }
                        
                    }
                    
                }
		
		if(isset($this->general_setting['promos']) && $this->general_setting['promos']){
		    
		    $currency = '';
		    
		    if(isset($this->currencies[0]['id'])){
			
			$currency = $this->currencies[0]['id'];
			
		    }
		    
		    if(isset($this->general_setting['gifts'])){
			
			$gifts_result = '<gifts>'.$this->eol;
			
			foreach ($this->general_setting['gifts'] as $gifts) {
			    
			    $gifts_result .= '<gift id="'.$gifts['gift_id'].'">';

			    $gifts_result .= '<name>'.$gifts['name'].'</name>';
			    
			    $gifts_result .= '<picture>'.$gifts['picture'].'</picture>';
			    
			    $gifts_result .= '</gift>';
			    
			}
			
			$gifts_result .= '</gifts>'.$this->eol;
			
			$this->general_setting['gifts_result'] = $gifts_result;
			
		    }
		    
		    foreach ($this->general_setting['promos'] as $promos_id => $promo) {
			
			$promos_result = '';
			
			if($promo['promos_type']=='promo-code'){
			    
			    $general_values = array(
				'start-date' => $promo['start-date'],
				'end-date' => $promo['end-date'],
				'description' => '<![CDATA['. html_entity_decode($promo['description']).']]>',
				'url' => $this->prepareField($promo['url']),
				'promo-code' => $promo['promo-code']
			    );
			    
			    if($promo['discount_percent']!==''){
				
				$general_values['discount'] = array(
				    'attributes' => array('unit'=>'percent'),
				    'value' => (int)$promo['discount_percent'],
				);
				
			    }elseif($promo['discount_currency']!==''){
				
				$general_values['discount'] = array(
				    'attributes' => array('unit'=>'currency','currency'=>$currency),
				    'value' => (int)$promo['discount_currency'],
				);
				
			    }
			    
			    $purchase = array();
			    
			    if(isset($promo['product_ids_selected'])){
				
				foreach ($promo['product_ids_selected'] as $offer_id) {
				    
				    $purchase[]['product'] = array(
					'attributes' => array('offer-id'=>$offer_id),
					'value' => '',
				    );
				    
				}
				
			    }
			    
			    if(isset($promo['category_ids_selected'])){
				
				foreach ($promo['category_ids_selected'] as $categoryId) {
				    
				    if(isset($this->general_setting['mapping_market_place_categories_replace']) && isset($this->general_setting['mapping_market_place_categories_replace'][$categoryId])){

					$categoryId = $this->general_setting['mapping_market_place_categories_replace'][$categoryId];

				    }
				    
				    $purchase[]['product'] = array(
					'attributes' => array('category-id'=>$categoryId),
					'value' => '',
				    );
				    
				}
				
			    }
			    
			    $general_values['purchase'] = $purchase;
			    
			    $promos_result = '<promo id="'.$promos_id.'" type="promo code">'.$this->eol;
			    
			    foreach ($general_values as $tag_name => $value) {
				
				if($tag_name=='purchase'){
				    
				    $promos_result .= '<purchase>'.$this->eol;
				    
				    foreach ($value as $value2) {
					
					foreach ($value2 as $tag_name2 => $value3) {
					
					    $promos_result .= '<'.$tag_name2.' ';
					
					    foreach ($value3['attributes'] as $attr_name => $attr_value) {
						$promos_result .= $attr_name .'="'.$attr_value.'" ';
					    }

					    $promos_result .= ($value3['value']!=='' ? '>'.$value3['value'].'</'.$tag_name2.'>' : '/>').$this->eol;
					    
					}
					
				    }
				    
				    $promos_result .= '</purchase>'.$this->eol;
				    
				}elseif($tag_name=='discount'){
				    
				    $promos_result .= '<'.$tag_name.' ';
				    
				    foreach ($value['attributes'] as $attr_name => $attr_value) {
					
					$promos_result .= $attr_name .'="'.$attr_value.'" ';
					
				    }
				    
				    $promos_result .= ($value['value']!=='' ? '>'.$value['value'].'</'.$tag_name.'>' : '/>').$this->eol;
				    
				}else{
				    
				    $promos_result .= '<'.$tag_name.'>'. ($value!=='' ? $value.'</'.$tag_name.'>' : '/>').$this->eol;
				    
				}
				
			    }
			    
			    $promos_result .= '</promo>'.$this->eol;
			    
			    $this->general_setting['promos_result'][$promos_id]  =  $promos_result;
			    
			}
			elseif($promo['promos_type']=='flash-discount'){
			    
			    $general_values = array(
				'start-date' => $promo['start-date'],
				'end-date' => $promo['end-date'],
				'description' => '<![CDATA['. html_entity_decode($promo['description']).']]>',
				'url' => $this->prepareField($promo['url'])
			    );
			    
			    $purchase = array();
			    
			    if(isset($promo['product_ids_selected'])){
				
				foreach ($promo['product_ids_selected'] as $offer_id) {
				    
				    $purchase[]['product'] = array(
					'attributes' => array('offer-id'=>$offer_id),
					'value' => '<discount-price currency="'.$currency.'">'.$promo['discount-price'].'</discount-price>',
				    );
				    
				}
				
			    }
			    
			    $general_values['purchase'] = $purchase;
			    
			    $promos_result = '<promo id="'.$promos_id.'" type="flash discount">'.$this->eol;
			    
			    foreach ($general_values as $tag_name => $value) {
				
				if($tag_name=='purchase'){
				    
				    $promos_result .= '<purchase>'.$this->eol;
				    
				    foreach ($value as $value2) {
					
					foreach ($value2 as $tag_name2 => $value3) {
					
					    $promos_result .= '<'.$tag_name2.' ';
					
					    foreach ($value3['attributes'] as $attr_name => $attr_value) {
						$promos_result .= $attr_name .'="'.$attr_value.'" ';
					    }

					    $promos_result .= ($value3['value']!=='' ? '>'.$value3['value'].'</'.$tag_name2.'>' : '/>').$this->eol;
					    
					}
					
				    }
				    
				    $promos_result .= '</purchase>'.$this->eol;
				    
				}elseif($tag_name=='discount'){
				    
				    $promos_result .= '<'.$tag_name.' ';
				    
				    foreach ($value['attributes'] as $attr_name => $attr_value) {
					
					$promos_result .= $attr_name .'="'.$attr_value.'" ';
					
				    }
				    
				    $promos_result .= ($value['value']!=='' ? '>'.$value['value'].'</'.$tag_name.'>' : '/>').$this->eol;
				    
				}else{
				    
				    $promos_result .= '<'.$tag_name.'>'. ($value!=='' ? $value.'</'.$tag_name.'>' : '/>').$this->eol;
				    
				}
				
			    }
			    
			    $promos_result .= '</promo>'.$this->eol;
			    
			    $this->general_setting['promos_result'][$promos_id]  =  $promos_result;
			    
			}
			elseif($promo['promos_type']=='n-plus-m'){
			    
			    $general_values = array(
				'start-date' => $promo['start-date'],
				'end-date' => $promo['end-date'],
				'description' => '<![CDATA['. html_entity_decode($promo['description']).']]>',
				'url' => $this->prepareField($promo['url'])
			    );
			    
			    $purchase = array();
			    
			    $purchase[]['required-quantity'] = array(
				'attributes' => array(),
				'value' => $promo['required-quantity'],
			    );
			    
			    $purchase[]['free-quantity'] = array(
				'attributes' => array(),
				'value' => $promo['free-quantity'],
			    );
			    
			    if(isset($promo['product_ids_selected'])){
				
				foreach ($promo['product_ids_selected'] as $offer_id) {
				    
				    $purchase[]['product'] = array(
					'attributes' => array('offer-id'=>$offer_id),
					'value' => '',
				    );
				    
				}
				
			    }
			    
			    if(isset($promo['category_ids_selected'])){
				
				foreach ($promo['category_ids_selected'] as $categoryId) {
				    
				    if(isset($this->general_setting['mapping_market_place_categories_replace']) && isset($this->general_setting['mapping_market_place_categories_replace'][$categoryId])){

					$categoryId = $this->general_setting['mapping_market_place_categories_replace'][$categoryId];

				    }
				    
				    $purchase[]['product'] = array(
					'attributes' => array('category-id'=>$categoryId),
					'value' => '',
				    );
				    
				}
				
			    }
			    
			    $general_values['purchase'] = $purchase;
			    
			    $promos_result = '<promo id="'.$promos_id.'" type="n plus m">'.$this->eol;
			    
			    foreach ($general_values as $tag_name => $value) {
				
				if($tag_name=='purchase'){
				    
				    $promos_result .= '<purchase>'.$this->eol;
				    
				    foreach ($value as $value2) {
					
					foreach ($value2 as $tag_name2 => $value3) {
					
					    $promos_result .= '<'.$tag_name2.' ';
					
					    foreach ($value3['attributes'] as $attr_name => $attr_value) {
						$promos_result .= $attr_name .'="'.$attr_value.'" ';
					    }

					    $promos_result .= ($value3['value']!=='' ? '>'.$value3['value'].'</'.$tag_name2.'>' : '/>').$this->eol;
					    
					}
					
				    }
				    
				    $promos_result .= '</purchase>'.$this->eol;
				    
				}elseif($tag_name=='discount'){
				    
				    $promos_result .= '<'.$tag_name.' ';
				    
				    foreach ($value['attributes'] as $attr_name => $attr_value) {
					
					$promos_result .= $attr_name .'="'.$attr_value.'" ';
					
				    }
				    
				    $promos_result .= ($value['value']!=='' ? '>'.$value['value'].'</'.$tag_name.'>' : '/>').$this->eol;
				    
				}else{
				    
				    $promos_result .= '<'.$tag_name.'>'. ($value!=='' ? $value.'</'.$tag_name.'>' : '/>').$this->eol;
				    
				}
				
			    }
			    
			    $promos_result .= '</promo>'.$this->eol;
			    
			    $this->general_setting['promos_result'][$promos_id]  =  $promos_result;
			    
			}
			elseif($promo['promos_type']=='gift-with-purchase'){
			    
			    $general_values = array(
				'start-date' => $promo['start-date'],
				'end-date' => $promo['end-date'],
				'description' => '<![CDATA['. html_entity_decode($promo['description']).']]>',
				'url' => $this->prepareField($promo['url'])
			    );
			    //product_as_gift_ids_selected 
			    $purchase = array();
			    
			    $purchase[]['required-quantity'] = array(
				'attributes' => array(),
				'value' => $promo['required-quantity-present'],
			    );
			    
			    if(isset($promo['product_ids_selected'])){
				
				foreach ($promo['product_ids_selected'] as $offer_id) {
				    
				    $purchase[]['product'] = array(
					'attributes' => array('offer-id'=>$offer_id),
				    );
				    
				}
				
			    }
			    
			    $promo_gifts = array();
			    
			    if(isset($promo['gift_ids_selected'])){
				
				foreach ($promo['gift_ids_selected'] as $gift_id) {
				    
				    $promo_gifts[]['promo-gift'] = array(
					'attributes' => array('gift-id'=>$gift_id),
				    );
				    
				}
				
			    }
			    
			    if(isset($promo['product_as_gift_ids_selected'])){
				
				foreach ($promo['product_as_gift_ids_selected'] as $offer_id) {
				    
				    $promo_gifts[]['promo-gift'] = array(
					'attributes' => array('offer-id'=>$offer_id),
				    );
				    
				}
				
			    }
			    
			    $general_values['purchase'] = $purchase;
			    
			    $general_values['promo-gifts'] = $promo_gifts;
			    
			    $promos_result = '<promo id="'.$promos_id.'" type="gift with purchase">'.$this->eol;
			    
			    foreach ($general_values as $tag_name => $value) {
				
				if($tag_name=='purchase' || $tag_name=='promo-gifts'){
				    
				    $promos_result .= '<'.$tag_name.'>'.$this->eol;
				    
				    foreach ($value as $value2) {
					
					foreach ($value2 as $tag_name2 => $value3) {
					
					    $promos_result .= '<'.$tag_name2.' ';
					
					    foreach ($value3['attributes'] as $attr_name => $attr_value) {
						$promos_result .= $attr_name .'="'.$attr_value.'" ';
					    }

					    $promos_result .= ( (isset($value3['value']) && $value3['value']!=='') ? '>'.$value3['value'].'</'.$tag_name2.'>' : '/>').$this->eol;
					    
					}
					
				    }
				    
				    $promos_result .= '</'.$tag_name.'>'.$this->eol;
				    
				}else{
				    
				    $promos_result .= '<'.$tag_name.'>'. ($value!=='' ? $value.'</'.$tag_name.'>' : '/>').$this->eol;
				    
				}
				
			    }
			    
			    $promos_result .= '</promo>'.$this->eol;
			    
			    $this->general_setting['promos_result'][$promos_id]  =  $promos_result;
			    
			}
			
		    }
		    
		}
                
                if(!$this->debug && isset($this->setting_yml['status_validation']) && isset($this->parse_yml[$this->setting_yml['status_validation']]) && $this->parse_yml[$this->setting_yml['status_validation']]){
                    $yml = $this->getYml();
                    if($yml){
                        $this->response->addHeader('Content-Type: application/xml');
                        $this->response->setOutput($yml);
                    }
                    
                    $unlink_all_cache = array($this->cfiles['offers_cache'].$this->request->get['token'].'-');
                
                    if(isset($this->request->get['fb'])){

                        $unlink_all_cache[] = $this->cfiles['fb_parts_cache'].$this->request->get['token'].'-';

                    }else{

                        $unlink_all_cache[] = $this->cfiles['yml_parts_cache'].$this->request->get['token'].'-';

                    }

                    $this->{$this->path_on_model}->unlinkAllCache($unlink_all_cache);
                    
                }else{
                    
                    $this->sendErrorXML($this->log_errors);
		    
                    return;
                    
                }
	}
        
        public function setLogErrors($message) {
            
            if($this->debug){
                
                $this->log_errors[] = $message;
                
            }
            
        }
        
        public function getCache($filename) {
            
            $cache_offers = array();
            
            if(file_exists(DIR_CACHE.$filename)){
                
                $cache_offers = json_decode(file_get_contents(DIR_CACHE.$filename),TRUE);
                
                if( (!$cache_offers or is_null($cache_offers)) && $this->debug ){
                    
                    $this->log_errors[] = "parsing cache error to file ".  DIR_CACHE.$filename;
                    
                }
                
                unlink(DIR_CACHE.$filename);
                
            }else{
                
                if($this->debug){
                        
                    $this->log_errors[] = "no cache file ".  DIR_CACHE.$filename;

                }
                
            }
            
            return $cache_offers;
            
        }
        
        public function getShopDeliveryOptionAttrubite($products) {
            
            $data = array();
            if($products){
                foreach ($products as $product) {
		    
		    $product['setting'] = array();
		    
		    if(isset($product['settings_id']) && isset($this->general_setting['settings']) && isset($this->general_setting['settings'][$product['settings_id']]) ) {
			
			$product['setting'] = $this->general_setting['settings'][$product['settings_id']];
			
		    }
		    
                    if($product['setting'] && $product['setting']['delivery-options']['status']){
                        
                        $weight = '';
                        $stock_status_id = '';
                        $price = '';
                        
                        
                        if(isset($product['weight']) && $product['weight']>0){
                            $weight = (float)$weight;
                        }
                        if(isset($product['weight']) && $product['weight']>0){
                            $stock_status_id = $product['stock_status_id'];
                        }
                        if(isset($product['price'])){
                            $price = $product['price'];
                        }
                        
                        $delivery_options = $this->getDeliveryOption($product['setting'],$price,$weight,$stock_status_id);
                        
                        if($delivery_options){
                            $data['delivery-options'] = $delivery_options;
                        }
                    }
                }
            }
            return $data;
            
        }
        
        public function setProductCategories($category_id) {
            
            if(isset($this->categories[$category_id])){
                $this->product_categories[$category_id] = $category_id;
            }
            
            if(isset($this->categories[$category_id]['parentId'])){
                
                $this->setProductCategories($this->categories[$category_id]['parentId']);
                
            }
            
        }
        
        public function getOfferAttrubite($product) {
            $data = array();
            $template_setting = array();
            $skip_this_offer = FALSE;
	    
	    $product['setting'] = array();
		    
	    if(isset($product['settings_id']) && isset($this->general_setting['settings']) && isset($this->general_setting['settings'][$product['settings_id']]) ) {

		$product['setting'] = $this->general_setting['settings'][$product['settings_id']];

	    }
            
            if($product['setting']){
                $template_setting = $product['setting'];
            }
            
            $data['id'] = $product['product_id'];
            
            if($product['product_id_by_option_id']){
                
                $data['id'] = $product['product_id_by_option_id'];
                
            }
            
            if(isset($template_setting['custom_offer_id']['field']['status']) && $template_setting['custom_offer_id']['field']['status']){
                
                $custom_offer_id = $this->getNameAttributeForType($product,$template_setting,$template_setting['custom_offer_id']['field']['status'],'custom_offer_id');
                
                $data['id'] = str_replace($data['id'], $custom_offer_id, $data['id']);
                
                if($product['product_id_by_option_id'] && $template_setting['custom_offer_id']['field']['status']=='product_id'){

                    $data['id'] = $product['product_id_by_option_id'];

                }
                
            }
            
            if(isset($template_setting['product_id_from']) && $template_setting['product_id_from']!='' && $product['product_id']<$template_setting['product_id_from']){
                $skip_this_offer = TRUE;
            }
            
            if(isset($template_setting['product_id_to']) && $template_setting['product_id_to']!='' &&  $product['product_id']>$template_setting['product_id_to']){
                $skip_this_offer = TRUE;
            }
            
            if(isset($template_setting['disable_this_product']) && $template_setting['disable_this_product']){
                $skip_this_offer = TRUE;
            }
            
            if(isset($template_setting['url_whis_path']) && $template_setting['url_whis_path']){
                $data['url'] = $this->url->link('product/product', 'path='.$this->getPathWhisCategories($product['category_id']).'&product_id='.$product['product_id']);
            }else{
                $data['url'] = $this->url->link('product/product', 'product_id='.$product['product_id']);
            }
            
            $data['url'] .= $product['option_url_param'];
            
            //цены
            
            $product['price'] = $this->getPrice($product['price'],$product,$template_setting);
            
            if($product['special_price']>0){
                $product['special_price'] = $this->getPrice($product['special_price'],$product,$template_setting);
            }
            if($product['discount_special_price']>0){
                $product['discount_special_price'] = $this->getPrice($product['discount_special_price'],$product,$template_setting);
            }
            
            if(isset($template_setting['oldprice']) && $template_setting['oldprice'] && ($product['special_price'] || $product['discount_special_price']) > 0){
                if($product['special_price']>0 && $product['special_price'] < $product['price'] ){
                    
                    $data['oldprice'] = $product['price'];
                    $data['price'] = $product['special_price'];
                    $product['oldprice'] = $product['price'];
                    $product['price'] = $product['special_price'];
                    
                }elseif( $product['discount_special_price']>0 && $product['discount_special_price'] < $product['price']  ){
                    
                    $data['oldprice'] = $product['price'];
                    $data['price'] = $product['discount_special_price'];
                    $product['oldprice'] = $product['price'];
                    $product['price'] = $product['discount_special_price'];
                    
                }else{
                    
                    $data['price'] = $product['price'];
                    
                }
            }
            
            if(isset($template_setting['price_currencies_to'])){
                $decimal_place = (int)$this->currency->getDecimalPlace($template_setting['price_currencies_to']);
            }else{
                $decimal_place = (int)$this->currency->getDecimalPlace(0);
            }
            
            $data['price'] = round($product['price'],$decimal_place);
            
            if(isset($data['oldprice']) && $data['oldprice'] && isset($product['oldprice']) && $product['oldprice']){
                
                $data['oldprice'] = round($product['oldprice'],$decimal_place);
                
            }
                    
            if(isset($this->parse_yml['zero']) && isset($template_setting[$this->parse_yml['zero']]) && !$template_setting[$this->parse_yml['zero']] && $data['price']==0){
                $skip_this_offer = TRUE;
            }
            
            if(isset($template_setting['price_from']) && $template_setting['price_from']!='' && $template_setting['price_from']>$data['price']){
                $skip_this_offer = TRUE;
            }
            
            if(isset($template_setting['price_to']) && $template_setting['price_to']!='' && $data['price'] > $template_setting['price_to']){
                $skip_this_offer = TRUE;
            }
            
            
            if((!$data['price'] || $data['price']==0.0) && (!isset($template_setting['zero_price']) || !$template_setting['zero_price']) ){
                $skip_this_offer = TRUE;
            }else{
                //используется для составных заголовков
                $this->prices[$product['product_id']] = $data['price'];
            }
            //валюта
            $data['currencyId'] = $this->currencies[0]['id'];
            
            
            if(isset($product['market_category']) && $product['market_category']){
                //категория market_category
                $data['market_category'] = $product['market_category'];
            }
            
            //изображения
            $data['picture'] = $this->getPictureAttributes($product,$template_setting);
            
            //если без картинок не выгружать, и картинок нет, то это предложение не делаем
            if(isset($template_setting['no_pictures']) && $template_setting['no_pictures'] && !$data['picture']){
                $skip_this_offer = TRUE;
            }
            
            if(isset($template_setting['store']) && $template_setting['store']){
                $data['store'] = 'true';
            }else{
                $data['store'] = 'false';
            }
            //
            if(isset($template_setting['pickup']) && $template_setting['pickup']){
                $data['pickup'] = 'true';
            }else{
                $data['pickup'] = 'false';
            }
            
            //
            if(isset($template_setting['delivery']) && $template_setting['delivery']){
                $data['delivery'] = 'true';
            }else{
                $data['delivery'] = 'false';
            }
            
            if(!isset($template_setting['delivery'])){
                
                $data['delivery'] = 'true';
                
            }
            
            //delivery-options
            if(isset($template_setting['delivery-options']['status']) && $template_setting['delivery-options']['status']){
                
                $w = '';
                if(isset($product['weight']) && $product['weight']>0){
                    $w = (float)$w;
                }
                $ssi = '';
                if(isset($product['stock_status_id']) && $product['stock_status_id']>0){
                    $ssi = $product['stock_status_id'];
                }
                $p = '';
                if(isset($product['price'])){
                    $p = $product['price'];
                }
                
                $delivery_options = $this->getDeliveryOption($template_setting,$p,$w,$ssi);
                if($delivery_options){
                    $data['delivery-options'] = $delivery_options;
                }
            }
            
            if(isset($product['delivery_option_by_manufacturer']) && $product['delivery_option_by_manufacturer']){
                
                if(isset($data['delivery-options'])){
                    
                    $data['delivery-options'][] = $product['delivery_option_by_manufacturer'];
                    
                }else{
                    
                    $data['delivery-options'] = array($product['delivery_option_by_manufacturer']);
                    
                }
                
            }
            
            if((isset($template_setting['offer_name']['field']['status'])  && $template_setting['offer_name']['field']['status']) ){
                
                //название товара
                $data['name'] = $this->getNameAttribute($product,$template_setting,'offer_name');
                
            }elseif(!isset($template_setting['offer_name']['field']['status'])){
                
                $data['name'] = $this->prepareField($product['name']);
                
            }
                  
            if(isset($template_setting['divide_on_option_add_to_name']) && $template_setting['divide_on_option_add_to_name'] && isset($data['name']) && isset($product['option_add_model_name']) && $product['option_add_model_name']){
                $data['name'] .= ' '.$this->prepareField($product['option_add_model_name']);
            }
            
            if(isset($template_setting['text_capitalize']) && $template_setting['text_capitalize'] && isset($data['name'])){
                $data['name'] = mb_convert_case($data['name'], MB_CASE_TITLE, "UTF-8");
            }
            
            //вендор
            if(isset($template_setting['vendor']['field']['status'])){
                $data['vendor'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['vendor']['field']['status'],'vendor');
            }
            
            if(isset($template_setting['vendorCode']['field']['status'])){
                $data['vendorCode'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['vendorCode']['field']['status'],'vendorCode');
            }
            
            //если вендор модель, выход без вендора
            if(isset($template_setting['vendor.model']) && $template_setting['vendor.model'] && ( !isset($data['vendor']) || !$data['vendor'] )){
                //return;
                $data['type'] = 'vendor.model';
            }elseif(isset ($template_setting['vendor.model']) && $template_setting['vendor.model']){
                $data['type'] = 'vendor.model';
            }
            
            //описание
            if(isset($template_setting['offer_description']['field']) && $template_setting['offer_description']['field']){
                $data['description'] = $this->getDescriptionAttribute($product, $template_setting);
            }
            
            //manufacturer_warranty
            if(isset($template_setting['manufacturer_warranty']) && $template_setting['manufacturer_warranty']){
                $data['manufacturer_warranty'] = 'true';
            }
            
            //country_of_origin
            if(isset($template_setting['country_of_origin'])){
                $data['country_of_origin'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['country_of_origin']['field']['status'],'country_of_origin');
            }
            
            //barcode
            if(isset($template_setting['barcode'])){
                $data['barcode'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['barcode']['field']['status'],'barcode');
            }
            
            //expiry
            if(isset($template_setting['expiry'])){
                $data['expiry'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['expiry']['field']['status'],'expiry');
            }
            
            //weight
            if(isset($template_setting['weight'])){
                $data['weight'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['weight']['field']['status'],'weight');
            }
            
            //weight
            if(isset($template_setting['dimensions'])){
                $data['dimensions'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['dimensions']['field']['status'],'dimensions');
            }
            
            //age
            if(isset($template_setting['age']['field']['status']) && $template_setting['age']['field']['status']){
                if($template_setting['age']['unit']){
                    $data['age']['value'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['age']['field']['status'],'age');
                    $data['age']['unit'] = $template_setting['age']['unit'];
                }
            }
            
            //typePrefix
            if(isset($template_setting['typePrefix']) && $template_setting['typePrefix']){
                $data['typePrefix'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['typePrefix']['field']['status'],'typePrefix');
            }
            
            //cpa
            if(isset($template_setting['cpa']) && $template_setting['cpa']){
                $data['cpa'] = '1';
            }
            
            //rec
            if(isset($template_setting['rec']) && $template_setting['rec'] && $product['rec']){
                $data['rec'] = implode(',', $product['rec']);
            }
            
            //adult
            if(isset($template_setting['adult']) && $template_setting['adult']){
                $data['adult'] = 'true';
            }
            
            //available
            $stock_status_id = $product['stock_status_id'];
            $quantity = (int)$product['quantity'];
            $minimum = (int)$product['minimum'];
            $data['available'] = 'false';
            
            
            if(isset($template_setting['available_by_quantity']) && $template_setting['available_by_quantity']){
                
                if(!$quantity || $quantity<$minimum){
                    $data['available'] = 'false';
                }elseif($quantity || $quantity>=$minimum){
                    $data['available'] = 'true';
                }
                
            }else{
                
                if(isset ($template_setting['available_true']) && $template_setting['available_true']==$stock_status_id){
                    $data['available'] = 'true';
                }elseif(isset ($template_setting['available_false'][$stock_status_id])){
                    $data['available'] = 'false';
                }
                
            }
            
            
            
            
            
            //fee в селекторе
            if(isset($template_setting['fee_select']['field']['status']) && $template_setting['fee_select']['field']['status']){
                $data['fee'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['fee_select']['field']['status'],'fee_select');
            }elseif(isset($template_setting['fee_input']) && $template_setting['fee_input']){
                $data['fee'] = $this->prepareField($template_setting['fee_input']);
            }
            
            if(!isset($template_setting['model']['field']['status']) || (isset($template_setting['model']['field']['status'])  && $template_setting['model']['field']['status']) ){
                
                //модель
                $data['model'] = $this->getNameAttribute($product,$template_setting,'model');
                
            }
            
            if(isset($template_setting['divide_on_option_add_to_model']) && $template_setting['divide_on_option_add_to_model'] && isset($data['model']) && isset($product['option_add_model_name']) && $product['option_add_model_name']){
                $data['model'] .= ' '.$this->prepareField($product['option_add_model_name']);
            }
            
            if(isset($template_setting['text_capitalize']) && $template_setting['text_capitalize'] && isset($data['model'])){
                $data['model'] = mb_convert_case($data['model'], MB_CASE_TITLE, "UTF-8");
            }
            
            if(isset($template_setting['dispublic_quantity']) && !$template_setting['dispublic_quantity'] && $data['available']=='false' ){
                $skip_this_offer = TRUE;
            }
            
            //sales_notes в селекторе
            if(isset($template_setting['sales_notes_select']['field']['status']) && $template_setting['sales_notes_select']['field']['status']){
                $data['sales_notes'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['sales_notes_select']['field']['status'],'sales_notes_select');
            }elseif(isset($template_setting['sales_notes']) && $template_setting['sales_notes']){
                $data['sales_notes'] = $this->prepareField($template_setting['sales_notes']);
            }
            
            if(isset($template_setting['sales_notes_select_on_available_true']['field']['status']) && $template_setting['sales_notes_select_on_available_true']['field']['status'] && $data['available'] == 'true'){
                $data['sales_notes'] = $this->getNameAttributeForType($product,$template_setting,$template_setting['sales_notes_select_on_available_true']['field']['status'],'sales_notes_select_on_available_true');
            }elseif(isset($template_setting['sales_notes_on_available_true']) && $template_setting['sales_notes_on_available_true'] && $data['available'] == 'true'){
                $data['sales_notes'] = $this->prepareField($template_setting['sales_notes_on_available_true']);
            }
            
            if(isset($template_setting['sales_notes_on_available_false']) && $template_setting['sales_notes_on_available_false'] && $data['available'] == 'false'){
                $data['sales_notes'] = $this->prepareField($template_setting['sales_notes']);
            }elseif(isset($template_setting['sales_notes_on_available_false']) && $template_setting['sales_notes_on_available_false'] && $data['available'] == 'true'){
                $data['sales_notes'] = '';
            }
            
            if(isset($template_setting['sales_note_by_rule'])){
                
                for($sni=0;$sni<count($template_setting['sales_note_by_rule']);$sni++){
                    
                    $sales_note_by_rule_status = $this->{$this->path_on_model}->getStatusByWhere($template_setting['sales_note_by_rule'][$sni],$product);
                    if($sales_note_by_rule_status){
                        $data['sales_notes'] = $this->prepareField($template_setting['sales_note_by_rule'][$sni]['sales_note']);
                    }
                    
                }
                
            }
            //param
            $param_atributes = array();
            if($product['ym_attributes']){
                $param_atributes = $this->getParamAttribute($product['ym_attributes'],$template_setting);
            }
            
            $param_options = array();
            if($product['ym_options']){
                $param_options = $this->getParamOption($product['ym_options']);
                
                if($param_options){
                    
                    $param_options_temp = $param_options;
                    
                    $param_options = array();
                    
                    foreach ($param_options_temp as $param_option_value) {
                        $param_options[$param_option_value['name'].'_'.$param_option_value['value']] = $param_option_value;
                    }
                    
                }
            }
            
            if($param_options || $param_atributes){
                $data['param'] = array_merge($param_options,$param_atributes);
            }
            
            if(isset($template_setting['text_capitalize']) && $template_setting['text_capitalize'] && isset($data['param'])){
                
                $param_name = $data['param'];
                
                $data['param'] = array();
                
                foreach ($param_name as $key_param => $value_param) {
                    $data['param'][ $key_param ]['name'] = mb_convert_case($value_param['name'], MB_CASE_TITLE, "UTF-8");
                    $data['param'][ $key_param ]['value'] = mb_convert_case($value_param['value'], MB_CASE_TITLE, "UTF-8");
                    if(isset($value_param['unit'])){
                        
                        $data['param'][ $key_param ]['unit'] = $value_param['unit'];
                        
                    }
                }
                
            }
            
            $param_to_url = array();
            
            //дополнительные элементы
            if(isset($this->general_setting['count_custom_elements'])){
                
                $count_custom_elements = (int)$this->general_setting['count_custom_elements'];
                
                if($count_custom_elements){
                    
                    for($i=0;$i<$count_custom_elements;$i++){
                        
                        $name_element_key = 'custom_elements_name_'.$i;
                        
                        $field_element_key = 'custom_elements_field_'.$i;
                        
                        if(isset($template_setting[$name_element_key]) && $template_setting[$name_element_key] && isset($template_setting[$field_element_key]) && $template_setting[$field_element_key]['field']['status']){
                            
                            $data['custom_elements'][$template_setting[$name_element_key]] = $this->getNameAttributeForType($product,$template_setting,$template_setting[$field_element_key]['field']['status'],$field_element_key);
                            
                        }
                        
                    }
                    
                    for($i=0;$i<$count_custom_elements;$i++){
                        
                        $name_element_key = 'param_to_url_name_'.$i;
                        
                        $field_element_key = 'param_to_url_value_'.$i;
                        
                        if(isset($template_setting[$name_element_key]) && $template_setting[$name_element_key]!=='' && isset($template_setting[$field_element_key]) && $template_setting[$field_element_key]['field']['status']){
                            
                            $param_to_url[] = $template_setting[$name_element_key].'='.$this->getNameAttributeForType($product,$template_setting,$template_setting[$field_element_key]['field']['status'],$field_element_key);
                            
                        }
                        
                    }
                    
                }
                
            }
            
            if($param_to_url){
                
                $data['url'] .= '&'.implode('&', $param_to_url);
                
            }
            
            $data['bid'] = '';
            
            for($i=0;$i<5;$i++){
                        
                $name_element_key = 'bid_field_to_db_'.$i;

                $field_element_key = 'bid_field_to_db_oper_'.($i-1);

                if($i==0 && isset($template_setting[$name_element_key]['field']['status']) && $template_setting[$name_element_key]['field']['status']){

                    $data['bid'] = $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;

                }
                
                if(isset($template_setting[$field_element_key]) && isset($template_setting[$name_element_key]['field']['status']) && $template_setting[$name_element_key]['field']['status']){
                    
                    if($template_setting[$field_element_key]=='+'){
                        
                        $data['bid'] = $data['bid'] + $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;
                        
                    }elseif($template_setting[$field_element_key]=='-'){
                        
                        $data['bid'] = $data['bid'] - $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;
                        
                    }elseif($template_setting[$field_element_key]=='*'){
                        
                        $data['bid'] = $data['bid'] * $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;
                        
                    }elseif($template_setting[$field_element_key]=='/'){
                        
                        $data['bid'] = $data['bid'] / $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;
                        
                    }
                    
                }
                
            }
            
            if($data['bid']>0){
                
                $data['bid'] = round($data['bid']*100);
                
            }
            
            if(isset($product['group_id'])){
                
                $data['group_id'] = $product['group_id'];
                
            }
            
            $data['cbid'] = '';
            
            for($i=0;$i<5;$i++){
                        
                $name_element_key = 'cbid_field_to_db_'.$i;

                $field_element_key = 'cbid_field_to_db_oper_'.($i-1);

                if($i==0 && isset($template_setting[$name_element_key]['field']['status']) && $template_setting[$name_element_key]['field']['status']){

                    $data['cbid'] = $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;

                }
                
                if(isset($template_setting[$field_element_key]) && isset($template_setting[$name_element_key]['field']['status']) && $template_setting[$name_element_key]['field']['status']){
                    
                    if($template_setting[$field_element_key]=='+'){
                        
                        $data['cbid'] = $data['cbid'] + $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;
                        
                    }elseif($template_setting[$field_element_key]=='-'){
                        
                        $data['cbid'] = $data['cbid'] - $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;
                        
                    }elseif($template_setting[$field_element_key]=='*'){
                        
                        $data['cbid'] = $data['cbid'] * $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;
                        
                    }elseif($template_setting[$field_element_key]=='/'){
                        
                        $data['cbid'] = $data['cbid'] / $this->getNameAttributeForType($product,$template_setting,$template_setting[$name_element_key]['field']['status'],$name_element_key);;
                        
                    }
                    
                }
                
            }
            
            if($data['cbid']>0){
                
                $data['cbid'] = round($data['cbid']*100);
                
            }
            
            if(isset($this->request->get['fb'])){
                
                $data['condition'] = 'new';
                
                if(isset($template_setting['fb_condition'])){
                    
                    $data['condition'] = $template_setting['fb_condition'];
                    
                }
                
            }
            
            if(isset($product['product_to_category']['main_category']) && $product['product_to_category']['main_category']){
                
                $data['categoryId'] = $product['product_to_category']['main_category'];
                
            }else{
                
                $data['categoryId'] = $product['category_id'];
                
            }
            
            //категория
            
            if(!$skip_this_offer && isset($this->general_setting['dall_categories_to_yml']) && $this->general_setting['dall_categories_to_yml']){
                
                
                $this->setProductCategories($data['categoryId']);
                
                
            }
            
            if(isset($this->general_setting['replace_cid_to_product_on_this']) && isset($product['product_to_category']['category_ids'])){
                
                $p_category_ids = $product['product_to_category']['category_ids'];
                
                $replace_cid = FALSE;
                
                foreach ($p_category_ids as $p_category_id) {
                    
                    if(in_array($p_category_id, $this->general_setting['replace_cid_to_product_on_this'])){
                        
                        $replace_cid = TRUE;
                        
                    }
                    
                }
                
                if($replace_cid){
                    
                    
                    foreach ($p_category_ids as $p_category_id_key => $p_category_id) {
                    
                        if(!in_array($p_category_id, $this->general_setting['replace_cid_to_product_on_this'])){

                            unset($p_category_ids[$p_category_id_key]);

                        }

                    }
                    
                    $product['product_to_category']['category_ids'] = $p_category_ids;
                    
                    $data['categoryId'] = current($p_category_ids);
                    
                }
                
            }
            
            if(isset($template_setting['all_product_category']) && $template_setting['all_product_category'] && isset($product['product_to_category']['category_ids'])){
                
                $main_category = $data['categoryId'];
				
                $data['categoryId'] = $product['product_to_category']['category_ids'];
				
                $data['categoryId'][$main_category] = $main_category;
                
            }
	    
	    if(isset($this->general_setting['promos'])){
		
		$this->checkPromosByOfferData($data);
		
	    }
	    
	    if(isset($data['categoryId']) && isset($this->general_setting['mapping_market_place_categories_replace'])){
		
		if(is_array($data['categoryId'])){
		    
		    foreach ($data['categoryId'] as $categoryId => $tmp) {

			if(isset($this->general_setting['mapping_market_place_categories_replace']) && isset($this->general_setting['mapping_market_place_categories_replace'][$categoryId])){

			    $data['categoryId'][$this->general_setting['mapping_market_place_categories_replace'][$categoryId]] = $this->general_setting['mapping_market_place_categories_replace'][$categoryId];

			}

		    }
		    
		}else{
		    
		    if(isset($this->general_setting['mapping_market_place_categories_replace']) && isset($this->general_setting['mapping_market_place_categories_replace'][$data['categoryId']])){

			$data['categoryId'] = $this->general_setting['mapping_market_place_categories_replace'][$data['categoryId']];

		    }
		    
		}
		
	    }
            
            $data['url'] = str_replace(' ', '%20', $data['url']); 
            
            if(isset($template_setting['replace_av_true']) && $template_setting['replace_av_true']!='true' && $data['available']=='true'){
                
                $data['available'] = $template_setting['replace_av_true'];
                
            }
            
            if(isset($template_setting['replace_av_false']) && $template_setting['replace_av_false']!='false' && $data['available']=='false'){
                
                $data['available'] = $template_setting['replace_av_false'];
                
            }
            
            if(!$skip_this_offer){
                
                $this->setOffer($data,$template_setting);
                
                $this->count_offers++;
                
            }else{
                
                $this->count_skips++;
            }
            
            return;
        }
	
	public function checkPromosByOfferData($offer){
	    
	    $offer_id = $offer['id'];
	    
	    $category_ids = array();
	    
	    if(isset($offer['categoryId']) && is_array($offer['categoryId'])){
		
		$category_ids = $offer['categoryId'];
		
	    }elseif(isset($offer['categoryId'])){
		
		$category_ids = array($offer['categoryId']=>$offer['categoryId']);
		
	    }
	    
	    foreach ($this->general_setting['promos'] as $promos_id => $promos) {
		
		if(!isset($promos['product_ids_checked'])){
		    
		    $product_ids_checked = $this->{$this->path_on_model}->cleanExplode(',',$promos['product_ids']);
		    
		    $promos['product_ids_checked'] = $product_ids_checked;
		    
		    $promos['product_ids_selected'] = array();
		    
		}
		
		if(!isset($promos['product_as_gift_ids_checked'])){
		    
		    $product_as_gift_ids_checked = $this->{$this->path_on_model}->cleanExplode(',',$promos['product_as_gift_ids']);
		    
		    $promos['product_as_gift_ids_checked'] = $product_as_gift_ids_checked;
		    
		    $promos['product_as_gift_ids_selected'] = array();
		    
		}
		
		if(in_array($offer_id,$promos['product_ids_checked'])){
		    
		    $promos['product_ids_selected'][$offer_id] = $offer_id;
		    
		}
		
		if(in_array($offer_id,$promos['product_as_gift_ids_checked'])){
		    
		    $promos['product_as_gift_ids_selected'][$offer_id] = $offer_id;
		    
		}
		
		if(!isset($promos['category_ids_checked'])){
		    
		    $promos['category_ids_checked'] = array();
		    
		    $promos['category_ids_selected'] = array();
		    
		}
		
		if(isset($promos['category_ids']) && $promos['category_ids']){
		    
		    $promos['category_ids_checked'] = $promos['category_ids'];
		    
		}
		
		foreach ($promos['category_ids_checked'] as $key => $category_id_checked) {
		    
		    if(isset($category_ids[$category_id_checked])){
			
			$promos['category_ids_selected'][$category_id_checked] = $category_id_checked;
			
			$promos['product_ids_selected'][$offer_id] = $offer_id;
			
			unset($promos['category_ids_checked'][$key]);
			
		    }
		    
		}
		
		$this->general_setting['promos'][$promos_id] = $promos;
		
	    }
	    
	}
        
        public function getParamOption($ym_options) {
            $result = array();
            foreach ($ym_options as $key => $value) {
                $name = $this->prepareField($value['name']);
                $value['unit'] = $this->prepareField($value['unit']);
                $unit = '';
                if($value['unit']){
                    $unit = $value['unit'];
                }
                if(isset($value['product_option_value']) && $value['product_option_value']){
                    foreach ($value['product_option_value'] as $key => $product_option_value) {
                        if(!$unit){
                            $result[] = array('name'=>  $name,'value'=>  $this->prepareField($product_option_value['name']));
                        }else{
                            $result[] = array('name'=>  $name,'value'=>  $this->prepareField($product_option_value['name']),'unit'=>$unit);
                        }
                    }
                }
            }
            return $result;
        }
        
        public function getParamAttribute($ym_attributes,$template_setting=array()) {
            $result = array();
            foreach ($ym_attributes as $key => $value) {
                $value['unit'] = $this->prepareField($value['unit']);
                $unit = '';
                if($value['unit']){
                    $unit = $value['unit'];
                }
                if(isset($value['attribute']) && $value['attribute']){
                    foreach ($value['attribute'] as $key => $attribute) {
                        
                        $unit_result = $unit;
                        
                        if(isset($attribute['unit']) && $attribute['unit']!==''){
                            
                            $unit_result = $attribute['unit'];
                            
                        }
                        
                        if(isset($template_setting['attribute_sintaxis']) && $template_setting['attribute_sintaxis']){
                    
                            $name_attribute = $this->prepareField($attribute['name']);
                            $value_attribute = $this->prepareField($attribute['text']);

                        }else{

                            $name_attribute = $this->prepareField($value['name']);
                            $value_attribute = $this->prepareField($attribute['name'].' '.$attribute['text']);

                        }
                        
                        
                        if(!$unit_result){
                            $result[] = array('name'=>  $name_attribute,'value'=>  $value_attribute);
                        }else{
                            $result[] = array('name'=>  $name_attribute,'value'=>  $value_attribute,'unit'=>$unit_result);
                        }
                    }
                }
            }
            return $result;
        }
        
        public function getNameAttributeForType($product,$template_setting,$composite_types,$field_name) {
            
            $result = '';
            switch ($composite_types){
                case 'attribute_id':
                    if(isset($template_setting[$field_name]['field'][$composite_types])){
                        $attributes_parts = explode('___', $template_setting[$field_name]['field'][$composite_types]);
                        $attribute_group_id = $attributes_parts[0];
                        $attribute_id = $attributes_parts[1];
                        if($product['all_attributes']){
                            foreach ($product['all_attributes'] as $group_attributes) {
                                if($group_attributes['attribute_group_id'] == $attribute_group_id && $group_attributes['attribute']){
                                    foreach ($group_attributes['attribute'] as $attribute_group_value) {
                                        if($attribute_group_value['attribute_id']==$attribute_id){
                                            $result = trim($this->prepareField($attribute_group_value['text']));
                                        }
                                    }

                                }
                            }
                        }
                    }
                    break;
                case 'option_id':
                    if(isset($template_setting[$field_name]['field'][$composite_types])){
                        $option_id = $template_setting[$field_name]['field'][$composite_types];
                        if($product['all_options']){
                            foreach ($product['all_options'] as $option) {
                                if($option['option_id'] == $option_id){

                                    $name_option = trim($this->prepareField($option['name']));
                                    $name_option_vields = array();
                                    foreach ($option['product_option_value'] as $product_option_value) {
                                        $name_option_vields[] = trim($this->prepareField($product_option_value['name']));
                                    }
                                    $result = implode(' ', $name_option_vields);
                                }
                            }
                        }
                    }
                    break;
                case 'manufacturer_id':
                    $product['manufacturer'] = $this->prepareField($product['manufacturer']);
                    if($product['manufacturer']){
                        $result = $product['manufacturer'];
                    }
                    break;

                case 'price':
                    if(isset($this->prices[$product['product_id']])){
                        $result = $this->prices[$product['product_id']];
                    }
                    break;

                case 'weight':
                    if((float)$product['weight']>0){
                        $result = (float)$this->weight->format($product['weight'],$product['weight_class_id']);
                    }
                    break;

                case 'length_width_height':
                    $length_width_height = array();
                    if((float)$product['length']>0){
                        $length_width_height[] = (float)$this->length->format($product['length'],$product['length_class_id']);
                    }
                    if((float)$product['width']>0){
                        $length_width_height[] = (float)$this->length->format($product['width'],$product['length_class_id']);
                    }
                    if((float)$product['height']>0){
                        $length_width_height[] = (float)$this->length->format($product['height'],$product['length_class_id']);
                    }
                    if($length_width_height){
                        $result = implode('/', $length_width_height);
                    }
                    break;
                case 'category_id':
                    if(isset($this->categories[$product['category_id']]['name'])){
                        $result = $this->categories[$product['category_id']]['name'];
                    }
                    break;
                case 'text_field':
                    if(isset($template_setting[$field_name]['field']['text_field'])){
                        $result = $this->prepareField($template_setting[$field_name]['field']['text_field']);
                    }
                    break;
                case 'keywords':
                    if(isset($product['tag'])){
                        $result = str_replace(', ',',', $this->prepareField($product['tag'])) ;
                    }
                    break;
                case 'description_whis_html':
                    if($product['description']){
                        $result = '<![CDATA['. html_entity_decode($product['description']).']]>';
                    }
                    break;
                case 'date_add':
                    if($product['date_added']){
                        $result = $product['date_added'];
                    }
                    break;
                case 'date_mod':
                    if($product['date_modified']){
                        $result = $product['date_modified'];
                    }
                    break;
                    
                    
                case 'product_meta_description':
                        if(isset($product['meta_description'])){
                            $result = $product['meta_description'];
                        }
                    break;
                case 'product_meta_title':
                        if(isset($product['meta_title'])){
                            $result = $product['meta_title'];
                        }
                    break;
                case 'product_meta_keyword':
                        if(isset($product['meta_keyword'])){
                            $result = $product['meta_keyword'];
                        }
                    break; 
                    
                default:
                if(isset($product[$composite_types])){
                    $product[$composite_types] = $this->prepareField($product[$composite_types]);
                    if($product[$composite_types]){
                        $result = $product[$composite_types];
                    }
                }
                break;
            }
            return $result;
        }

        public function getDescriptionAttribute($product,$template_setting){
            
            if(!isset($template_setting['offer_description']['field']) || !$template_setting['offer_description']['field']){
                $description = $this->prepareField($product['description'],TRUE);
                return $description;
            }
            else{
                
                $key = $template_setting['offer_description']['field'];
                
                switch ($key){
                    case 'option_id':
                    $description = '';
                    $option = $this->getParamOption($product['ym_options']);
                    if($option){
                        foreach ($option as $value) {
                            $description .= ' '.implode(' ', $value);
                        }
                    }
                    break;

                    case 'attribute_id':
                    $description = '';
                    $attributes = $this->getParamAttribute($product['ym_attributes']);
                    if($attributes){
                        foreach ($attributes as $value) {
                            $description .= ' '.implode(' ', $value);
                        }
                    }
                    break;

                    case 'meta_title':
                        if(isset($product['meta_title']))
                        $description = $this->prepareField($product['meta_title'],TRUE);
                    break;
                
                    case 'meta_keyword':
                        if(isset($product['meta_keyword']))
                        $description = $this->prepareField($product['meta_keyword'],TRUE);
                    break;

                    case 'meta_description':
                        if(isset($product['meta_description']))
                        $description = $this->prepareField($product['meta_description'],TRUE);
                    break;
                    
                    case 'description':
                        if(isset($product['description']))
                        $description = $this->prepareField($product['description'],TRUE);
                    break;
                    
                    default:
                        $description = '';
                    break;
                }
                return $description;
            }
            
            $result = $this->prepareField($product['name']);
            if(isset($template_setting['offer_name']['field']) && $template_setting['offer_name']['field']=='name'){
                return $result;
            }
            if(isset($template_setting['offer_name']['field']) && $template_setting['offer_name']['field']=='meta_title' && isset($product['meta_title'])){
                $result = $this->prepareField($product['meta_title']);
                return $result;
            }
            if(isset($template_setting['offer_name']['field']) && $template_setting['offer_name']['field']=='composite' && $template_setting['offer_name']['composite']){
                ksort($template_setting['offer_name']['composite']);
                $name = array();
                foreach ($template_setting['offer_name']['composite'] as $composite) {
                    //атрибут
                    if($composite['status']=='attribute_id'){
                        $attributes_parts = explode('___', $composite['attribute_id']);
                        $attribute_group_id = $attributes_parts[0];
                        $attribute_id = $attributes_parts[1];
                        if($product['all_attributes']){
                            foreach ($product['all_attributes'] as $group_attributes) {
                                if($group_attributes['attribute_group_id'] == $attribute_group_id && $group_attributes['attribute']){
                                    foreach ($group_attributes['attribute'] as $attribute_group_value) {
                                        if($attribute_group_value['attribute_id']==$attribute_id){
                                            $name[] = trim($this->prepareField($attribute_group_value['name'])).': '.trim($this->prepareField($attribute_group_value['text']));
                                        }
                                    }
                                    
                                }
                            }
                        }
                    }
                    //опция
                    elseif($composite['status']=='option_id'){
                        $option_id = $composite['option_id'];
                        if($product['all_options']){
                            foreach ($product['all_options'] as $option) {
                                if($option['option_id'] == $option_id){
                                    
                                    $name_option = trim($this->prepareField($option['name']));
                                    $name_option_vields = array();
                                    foreach ($option['product_option_value'] as $product_option_value) {
                                        $name_option_vields[] = trim($this->prepareField($product_option_value['name']));
                                    }
                                    if($name_option_vields){
                                        $name[] = $name_option.': '.  implode(', ', $name_option_vields);
                                    }else{
                                        $name[] = $name_option;
                                    }
                                }
                            }
                        }
                    }
                    //цена
                    elseif($composite['status']=='price'){
                        $name[] = $this->prices[$product['product_id']];
                    }
                    //вес
                    elseif($composite['status']=='weight'){
                        if((float)$product['weight']>0){
                            $name[] = $this->weight->format($product['weight'],$product['weight_class_id']);
                        }
                    }
                    //производитель
                    elseif($composite['status']=='manufacturer_id'){
                        $product['manufacturer'] = $this->prepareField($product['manufacturer']);
                        if($product['manufacturer']){
                            $name[] = $product['manufacturer'];
                        }
                    }
                    //категория
                    elseif($composite['status']=='category_id'){
                        $name[] = $this->categories[$product['category_id']]['name'];
                    }
                    //габариты
                    elseif($composite['status']=='length_width_height'){
                        $length_width_height = array();
                        if((float)$product['length']>0){
                            $length_width_height[] = $this->length->format($product['length'],$product['length_class_id']);
                        }
                        if((float)$product['width']>0){
                            $length_width_height[] = $this->length->format($product['width'],$product['length_class_id']);
                        }
                        if((float)$product['height']>0){
                            $length_width_height[] = $this->length->format($product['height'],$product['length_class_id']);
                        }
                        if($length_width_height){
                            $name[] = implode('/', $length_width_height);
                        }
                    }
                    //остальные
                    elseif (isset ($product[$composite['status']])) {
                        $product[$composite['status']] = $this->prepareField($product[$composite['status']]);
                        if($product[$composite['status']]){
                            $name[] = $product[$composite['status']];
                        }
                    }
                }
                $result = trim($this->prepareField(implode(' ', $name)));
                return $result;
            }
        }
        
        public function getNameAttribute($product,$template_setting,$field_name){
            
            $result = '';
            
            if(isset($template_setting[$field_name]['field']['status']) && $template_setting[$field_name]['field']['status']!='composite'){
                
                $result = $this->getNameAttributeForType($product,$template_setting,$template_setting[$field_name]['field']['status'],$field_name);
                
            }elseif(isset($template_setting[$field_name]['field']['status']) && $template_setting[$field_name]['field']['status']=='composite'){
                
                $field_type = 'composite';
                
                $count_composite_elements = 10;
                
                $result_parts = array();
                
                for($i=1;$i<$count_composite_elements;$i++){
                    
                    if(isset($template_setting[ $field_name.'_'.$field_type.'_'.$i ]) && $template_setting[ $field_name.'_'.$field_type.'_'.$i ]){
                        
                        $result_parts[] = $this->getNameAttributeForType($product,$template_setting,$template_setting[ $field_name.'_'.$field_type.'_'.$i ]['field']['status'],$field_name.'_'.$field_type.'_'.$i);
                        
                    }
                    
                }
                
                if($result_parts){
                    
                    $result = implode(' ', $result_parts);
                    
                }
                
                
            }
            return $result;
        }
        
        public function getTemplateSettingNameComposite() {
            $columns_product_description = $this->db->query('SHOW COLUMNS FROM '.DB_PREFIX.'product_description');
            $columns_product = $this->db->query('SHOW COLUMNS FROM '.DB_PREFIX.'product');

            $template_setting_name_composite['name'] = 'name';
            if($columns_product_description->rows){
                foreach($columns_product_description->rows as $column){
                    if($column['Field']=='meta_title'){
                        $template_setting_name_composite['meta_title'] = 'meta_title';
                    }
                }
            }
            $unset_product_fileds = array_flip(array('quantity','stock_status_id','image','shipping','points','tax_class_id','date_available','weight_class_id','length_class_id','subtract','minimum','sort_order','status','viewed','date_added','date_modified'));
            $product_fileds = array();
            if($columns_product->rows){
                foreach($columns_product->rows as $key=>$column){
                    if(!isset($unset_product_fileds[$column['Field']])){
                        $product_fileds[$column['Field']] = $column['Field'];
                    }
                }
            }
            if(isset($product_fileds['length']) && isset($product_fileds['width']) && isset($product_fileds['height'])){
                unset($product_fileds['length']);
                unset($product_fileds['width']);
                unset($product_fileds['height']);
                $product_fileds['length_width_height'] = 'length_width_height';
            }
            $template_setting_name_composite += $product_fileds;
            $template_setting_name_composite['category_id'] = 'category_id';
            $template_setting_name_composite['option_id'] = 'option_id';
            $template_setting_name_composite['attribute_id'] = 'attribute_id';
            return $template_setting_name_composite;
        }

        public function getDeliveryOption($tamplate_setting,$price='',$weight='',$stock_status_id=''){
            $result = array();
            if(isset($tamplate_setting['delivery-options']['status'])){
                unset($tamplate_setting['delivery-options']['status']);
            }
            foreach ($tamplate_setting['delivery-options'] as $delivery_options) {
                $delivery_options['days'] = trim($delivery_options['days']);
                $delivery_options['order-before'] = trim($delivery_options['order-before']);
                $delivery_options['cost'] = trim($delivery_options['cost']);
                
                $skip = FALSE;
                //var_dump($delivery_options['price_from']);exit();
                if(isset($delivery_options['price_to']) && $delivery_options['price_to']!='' && isset($delivery_options['price_from']) && $delivery_options['price_from']!='' && $price!=''){
                    
                    
                    if($price>=$delivery_options['price_to'] || $price<$delivery_options['price_from']){
                        
                        $skip = TRUE;
                        
                    }
                    
                }elseif(isset($delivery_options['weight_from']) && $delivery_options['weight_from']!='' && isset($delivery_options['weight_to']) && $delivery_options['weight_to']!='' && $weight!=''){
                    
                    if($weight>=$delivery_options['weight_to'] || $weight<$delivery_options['weight_from']){
                        
                        $skip = TRUE;
                        
                    }
                    
                }
                
                if(isset($delivery_options['stock_status_id']) && $stock_status_id!='' && !isset($delivery_options['stock_status_id'][$stock_status_id])){
                    
                    $skip = TRUE;
                    
                }
                if(!$skip && ($delivery_options['cost']!='' || $delivery_options['days']!='' || $delivery_options['order-before']!='')){
                    if($delivery_options['cost']!=''){
                        $option['cost'] = (int)$delivery_options['cost'];
                    }
                    if($delivery_options['days']!=''){
                        $option['days'] = $delivery_options['days'];
                    }
                    if($delivery_options['order-before']!=''){
                        $option['order-before'] = $delivery_options['order-before'];
                    }
                    $result[] = $option;
                    unset($option);
                }
            }
            return $result;
        }
        
        public function getPrice($price,$product,$tamplate_setting){
            
            $result_price = 0.0;
            $price = $this->tax->calculate($price, $product['tax_class_id']);
            $new_price = (float)$price;
            if(isset($tamplate_setting['ymlprice']) && $tamplate_setting['ymlprice']){
                $tamplate_setting['ymlprice'] = (float)$tamplate_setting['ymlprice'];
                $new_price = $new_price + $tamplate_setting['ymlprice']/100*$price;
            }
            
            if($new_price==0.0){
                $result_price =  $price;
            }else{
                $result_price = $new_price;
            }
            
            if(isset($tamplate_setting['price_currencies_from']) && $tamplate_setting['price_currencies_from'] && isset($tamplate_setting['price_currencies_to']) && $tamplate_setting['price_currencies_to']){
                
                $result_price = $this->currency->convert($result_price,$tamplate_setting['price_currencies_from'],$tamplate_setting['price_currencies_to']);
                
            }
            
            return $result_price;
        }
        
        public function getPictureAttributes($product,$tamplate_setting) {
            if(isset($tamplate_setting['count_pictures']) && !$tamplate_setting['count_pictures']){
                return array();
            }elseif(isset($tamplate_setting['count_pictures'])){
                $count_pictures = (int)$tamplate_setting['count_pictures'];
            }else{
                $count_pictures = 1;
            }
            
            $pictures_sizes = 500;
            $default_scale = '';
            $no_cache = FALSE;
            
            if(isset($tamplate_setting['pictures_sizes'])){
                $tamplate_setting['pictures_sizes'] = (int)$tamplate_setting['pictures_sizes'];
                if($tamplate_setting['pictures_sizes']>0){
                    $pictures_sizes = $tamplate_setting['pictures_sizes'];
                }
            }
            if(isset($tamplate_setting['rule_picture'])){
                if($tamplate_setting['rule_picture']=='by_w_side'){
                    $default_scale = 'w';
                }
                elseif($tamplate_setting['rule_picture']=='by_h_side'){
                    $default_scale = 'h';
                }
                elseif($tamplate_setting['rule_picture']=='no_cache'){
                    $no_cache = TRUE;
                }
            }
            $result = array();
            if ($product['image'] && $product['image']!='no_image.jpg' && $product['image']!='no_image.png' && $product['image']!='no-image.jpg' && $product['image']!='no-image.png' && file_exists(DIR_IMAGE.$product['image'])) {
                
                $this->load->model('tool/image');
                if($no_cache){
                    $result[] = $this->HTTP_SERVER.'image/'.$product['image'];
                }else{
                    $result[] = $this->resizeImage($product['image'],$pictures_sizes,$pictures_sizes,$default_scale,  $this->HTTP_SERVER);
                }
                
                if($product['images']){
                    for($i=0;($i<($count_pictures-1) && isset($product['images'][$i]));$i++){
                        if($no_cache && file_exists(DIR_IMAGE.$product['images'][$i]['image'])){
                            $result[] = $this->HTTP_SERVER.'image/'.$product['images'][$i]['image'];
                        }elseif($product['images'][$i]['image']!=$product['image'] && $product['images'][$i]['image'] && file_exists(DIR_IMAGE.$product['images'][$i]['image'])){
                            //$result[] = $this->model_tool_image->resize($product['images'][$i]['image'], $pictures_sizes, $pictures_sizes);
                            $result[] = $this->resizeImage($product['images'][$i]['image'],$pictures_sizes,$pictures_sizes,$default_scale,  $this->HTTP_SERVER);
                        }
                    }
                }
            }
            return $result;
        }
        
        public function resizeImage($file,$w,$h,$d,$HTTP_SERVER) {
            
            $image = $this->{$this->path_on_model}->resizeImage($file,$w,$h,$d,  $HTTP_SERVER);
            
            return $image;
        }

        public function getCategoriesAndOffers($filter_data_group_id,$content_language_id,$setting_yml=array()) {
            
            $ym_categories = array();
            $this->load->model($this->path_oc_version.'/ocext_feed_generator_yamarket');
            
            $all_yml_export_ocext_ym_filter_data_categories = $this->{$this->path_on_model}->getFilterData('ocext_feed_generator_yamarket_ym_filter_category',$filter_data_group_id);
            
	    /*
	    
            foreach ($all_yml_export_ocext_ym_filter_data_categories as $c_id => $crow) {
                
                if(FALSE && isset($crow['disable_parent_child_categories']) && $crow['disable_parent_child_categories']){
                    
                    $this->general_setting['replace_cid_to_product_on_this'][$c_id] = $c_id;
                    
                }
                
            }
	    
	    */
            
            if($all_yml_export_ocext_ym_filter_data_categories){
                $ym_categories = $all_yml_export_ocext_ym_filter_data_categories;
                if($ym_categories){
                    foreach ($ym_categories as $category_id=>$ym_category){
                        if(!isset($ym_category['category_id'])){
                            unset($ym_categories[$category_id]);
                        }
                    }
                    
                    if(!$ym_categories){
                        $ym_categories = $all_yml_export_ocext_ym_filter_data_categories;
                    }
                }
            }
            $ym_manufacturers = array();
            $all_yml_export_ocext_ym_filter_data_manufacturers = $this->{$this->path_on_model}->getFilterData('ocext_feed_generator_yamarket_ym_filter_manufacturers',$filter_data_group_id);
            if($all_yml_export_ocext_ym_filter_data_manufacturers){
                $ym_manufacturers = $all_yml_export_ocext_ym_filter_data_manufacturers;
                if($ym_manufacturers){
                    foreach ($ym_manufacturers as $manufacturer_id=>$ym_manufacturer){
                        if(!isset($ym_manufacturer['manufacturer_id'])){
                            unset($ym_manufacturers[$manufacturer_id]);
                        }
                    }
                    
                    if(!$ym_manufacturers){
                        $ym_manufacturers = $all_yml_export_ocext_ym_filter_data_manufacturers;
                        $ym_manufacturers[''] = array("setting_id"=>"0");
                        $ym_manufacturers[0] = array("setting_id"=>"0");
                    }
                }
            }
            
            
            $this->load->model($this->path_oc_version.'/ocext_feed_generator_yamarket');
            $categories_and_products = $this->{$this->path_on_model}->getCategoriesAndProducts($ym_categories,$ym_manufacturers,$filter_data_group_id,$content_language_id,  $this->general_setting);
            
            if(isset($this->general_setting['replace_cid_to_product_on_this']) && isset($categories_and_products['categories']) && $categories_and_products['categories']){
                
                foreach ($categories_and_products['categories'] as $key => $category_info) {
                    
                    if(in_array($category_info['category_id'], $this->general_setting['replace_cid_to_product_on_this'])){
                        
                        $category_info['replace_cid_to_product_on_this'] = TRUE;
                        
                        $categories_and_products['categories'][$key] = $category_info;
                        
                    }
                    
                }
                
            }
	    
	    $this->general_setting['mapping_market_place_categories_replace'] = array();
	    
	    if(isset($categories_and_products['mapping_market_place_categories'])){
		
		foreach ($categories_and_products['mapping_market_place_categories'] as $mapping_market_place_category) {
		    
		    $categories_and_products['categories'][] = $mapping_market_place_category;
		    
		    $this->general_setting['mapping_market_place_categories_replace'][$mapping_market_place_category['site_category_id']] = $mapping_market_place_category['category_id'];
		    
		}
		
	    }
	    
	    $this->general_setting['settings'] = array();
	    
	    if(isset($categories_and_products['settings'])){
		
		$this->general_setting['settings'] = $categories_and_products['settings'];
		
	    }
            
            if(!isset($setting_yml['products']) || !isset($setting_yml['catalog']) || ( !$categories_and_products[$setting_yml['products']] && !$categories_and_products['cache'] ) || !$categories_and_products[$setting_yml['catalog']]){
                return FALSE;
            }else{
                return $categories_and_products;
            }
        }
        
        private function prepareField($field,$description=FALSE) {
            if(is_string($field) && !$description){
                $field = strip_tags(htmlspecialchars_decode($field));
                $from = array('"', '&', '>', '<', '\'','`','&acute;','™','©');
                $to = array('&quot;', '&amp;', '&gt;', '&lt;', '&apos;','','','','');
                $field = str_replace($from, $to, $field);
                $field = trim($field);
            }elseif(is_string($field) && $description){
                $field = htmlspecialchars_decode($field);
                $from = array('<br>', '</br>','<br />', '<hr>', '\n', '\r','&nbsp;');
                $to = array($this->eol.' ');
                $field = str_replace($from, $to, $field);
                $field = strip_tags($field);
                $from = array('"', '&', '>', '<', '\'','`','&acute;','™','©');
                $to = array('&quot;', '&amp;', '&gt;', '&lt;', '&apos;','','','','');
                $field = str_replace($from, $to, $field);
                $field = trim($field);
            }
            return $field;
	}
        
        private function setShopAttributes($name, $value) {
            $attributes = array('name', 'company', 'url', 'platform', 'version');
            if (in_array($name, $attributes)) {
                    $this->shop[$name] = $this->prepareField($value);
            }
	}
        
        private function setCurrencyAttributes($currency, $rate = 'CBRF') {
            if($currency){
                if(!isset($this->currencies[0])){
                    $this->currencies[] = array(
                        'id'=>$currency,
                        'rate'=>1
                    );
                }else{
                    $this->currencies[] = array(
                        'id'=>$currency,
                        'rate'=>$rate
                    );
                }
                return TRUE;
            }else{
                return FALSE;
            }
	}
        
        private function setCategoryAttrubite($name, $category_id, $parent_id = 0, $category=array()) {
            $name = $this->prepareField($name);
            if(!$category_id || !$name) {
                return;
            }
            
            if($parent_id) {
                $this->categories[$category_id] = array(
                        'id'=>$category_id,
                        'parentId'=>$parent_id,
                        'name'=>$this->prepareField($name)
                );
            }else{
                $this->categories[$category_id] = array(
                    'id'=>$category_id,
                    'name'=>$this->prepareField($name)
                );
            }
            
            if(isset($this->general_setting['add_settings']) && isset($this->general_setting['add_settings']['add_ordering_to_category']) && $this->general_setting['add_settings']['add_ordering_to_category']){
                
                $this->categories[$category_id]['attributes']['ordering'] = (int)$category['sort_order'];
                
            }
            
            if(isset($this->general_setting['add_settings']) && isset($this->general_setting['add_settings']['add_url_to_category']) && $this->general_setting['add_settings']['add_url_to_category']){
                
                $this->categories[$category_id]['attributes']['url'] = $this->prepareField($this->url->link('product/category', 'category_id='.$category_id));
                
            }
            
	}
        
        protected function getPathWhisCategories($category_id,$old_path = '') {
            if (isset($this->categories[$category_id])) {
                if (!$old_path) {
                    $new_path = $this->categories[$category_id]['id'];
                } else {
                    $new_path = $this->categories[$category_id]['id'].'_' .$old_path;
                }	
                if (isset($this->categories[$category_id]['parentId'])) {
                    return $this->getPathWhisCategories($this->categories[$category_id]['parentId'], $new_path);
                } else {
                    return $new_path;
                }
            }
	}
        
        
        private function setOffer($data,$template_setting=array()) {
            
            $optimization_file_feed_write = 0;
            
            $memory_limit = 0;
            
            if(isset($this->general_setting['optimization_file_feed_write']) && $this->general_setting['optimization_file_feed_write']){
                
                $optimization_file_feed_write = $this->general_setting['optimization_file_feed_write'];
                
                $this->load->model($this->path_oc_version.'/ocext_feed_generator_yamarket');
            
                $memory_limit = $this->{$this->path_on_model}->getMemoryLimit($this->memory_limit_on_fwrite);
                
            }
            
            $custom_elements = array();
            
            if(isset($data['custom_elements'])){
                
                $custom_elements = $data['custom_elements'];
                
            }
            
            $offer = array();
            $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param', 'fee', 'group_id');
            $attributes = array_intersect_key($data, array_flip($attributes));
            
            foreach ($attributes as $key => $value) {
                switch ($key){
                    case 'id':
                    if ($value > 0) {
                            $offer[$key] = $value;
                    }
                    case 'cbid':
                    if ($value!='') {
                            $offer[$key] = $value;
                    }
                    case 'bid':
                    if ($value!='') {
                            $offer[$key] = $value;
                    }
                    break;
                    
                    case 'fee':
                    $value = (int)$value;
                    if ($value > 0) {
                            $offer[$key] = $value;
                    }
                    break;

                    case 'type':
                    if (in_array($value, array('vendor.model'))) {
                            $offer['type'] = $value;
                    }
                    break;

                    case 'available':
                    //$offer['available'] = (($value=='true') ? 'true' : 'false');
                    $offer['available'] = $value;
                    break;

                    case 'param':
                    if (is_array($value)) {
                        $offer['param'] = $value;
                    }
                    break;
                    
                    case 'group_id':
                    $offer['group_id'] = (int)$value;
                    break;
                
                    default:
                    break;
                }
            }
            $type = isset($offer['type']) ? $offer['type'] : '';
            $finded_tags = array('url'=>0, 'price'=>0);
            
            if(isset($data['oldprice']) && $data['oldprice']>0){
                $finded_tags['oldprice'] = 1;
            }
            
            $finded_tags = array_merge($finded_tags,array('currencyId'=>1, 'categoryId'=>1,'market_category'=>0, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0,'delivery-options'=>0));
            
            switch ($type) {
                case 'vendor.model':
                    $finded_tags = array_merge($finded_tags, array('name'=>0,'vendor'=>0, 'vendorCode'=>0, 'model'=>0));
                    break;
                default:
                    $finded_tags = array_merge($finded_tags, array('name'=>0, 'vendor'=>0, 'vendorCode'=>0, 'model'=>0));
                    break;
            }
            $finded_tags = array_merge($finded_tags, array('description'=>0, 'condition'=>0 , 'typePrefix'=>0, 'sales_notes'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'adult'=>0, 'barcode'=>0, 'weight'=>0,'description'=>0, 'dimensions'=>0, 'age'=>0, 'cpa'=>0, 'rec'=>0));
            $requiredes = array_filter($finded_tags);
            if (sizeof(array_intersect_key($data, $requiredes)) != sizeof($requiredes)) {
                    return;
            }
            $data = array_intersect_key($data, $finded_tags);
            $finded_tags = array_intersect_key($finded_tags, $data);
            $offer['data'] = array();
            foreach ($finded_tags as $key => $value) {
                    $offer['data'][$key] = $this->prepareField($data[$key]);
            }
            
            if($custom_elements){
                
                foreach ($custom_elements as $key => $value) {
                    $offer['data'][$key] = $value;
                }
            }
            
            if(isset($template_setting['replace_tags']) && $template_setting['replace_tags']!==''){
                
                $replace_tags_parts = explode('|', $template_setting['replace_tags']);
                
                $replace_tags = array();
                
                foreach ($replace_tags_parts as $replace_tags_part) {
                    
                    $replace_tags_this = explode('---', $replace_tags_part);
                    
                    if(isset($replace_tags_this[1]) && $replace_tags_this[1] && $replace_tags_this[0]){
                        
                        $replace_tags[$replace_tags_this[0]] = $replace_tags_this[1];
                        
                    }
                    
                }
                
                if($replace_tags){
                    
                    foreach ($offer['data'] as $tag_name => $tmp) {
                        
                        if(isset($replace_tags[$tag_name])){
                            
                            $offer['data'][$replace_tags[$tag_name]] = $tmp;
                            unset($offer['data'][$tag_name]);
                            
                        }
                        
                    }
                    
                }
                
            }
            
            if($optimization_file_feed_write){
             
                $memory_get_usage = memory_get_usage();
                
                $this->offers_fwrire['offers'][] = $offer;
                
                if($memory_get_usage >= $memory_limit){

                    $fname = $this->cfiles['offers_cache'].$this->request->get['token'].'-'.  count($this->offers_fwrire['cache_files']).'.txt';
                    
                    $this->{$this->path_on_model}->writeCache($fname, $this->offers_fwrire['offers']);
                    
                    $this->offers_fwrire['offers'] = array();

                    $this->offers_fwrire['cache_files'][$fname] = $fname;

                }
                
            }else{
                
                $this->offers[] = $offer;
                
            }
	}
        
        
        private function getYml() {
            
            if($this->offers_fwrire['offers'] || $this->offers_fwrire['cache_files']){
                
                $xml_parts = array();
                
                $result = '';
                
                if($this->offers_fwrire['offers']){
                    
                    $fname = $this->cfiles['offers_cache'].$this->request->get['token'].'-'.  count($this->offers_fwrire['cache_files']).'.txt';
                    
                    $this->{$this->path_on_model}->writeCache($fname, $this->offers_fwrire['offers']);

                    $this->offers_fwrire['offers'] = array();

                    $this->offers_fwrire['cache_files'][$fname] = $fname;
                    
                }
                
                //$this->offers_fwrire['offers']
                
                if(isset($this->request->get['fb'])){
                    
                    $fb  = '<?xml version="1.0"?>' . $this->eol;
                    $fb .= '<feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">' . $this->eol;
                    $fb .= '<title>'.$this->shop['name'].'</title>'. $this->eol;
                    $fb .= $this->createFBTag(array('link'=>''),array('link'=>array('rel'=>'self','href'=>$this->shop['url'])));
                    
                    $fb_parts_cache = $this->cfiles['fb_parts_cache'].$this->request->get['token'].'-'.  count($xml_parts);
                    
                    $fb = $this->replaceTags($fb);
                    
                    $this->{$this->path_on_model}->writeCache($fb_parts_cache,array(), $fb);
                    
                    $xml_parts[$fb_parts_cache] = $fb_parts_cache;
                    
                    $fb = '';
                    
                    if($this->offers_fwrire['cache_files']){
                        
                        foreach ($this->offers_fwrire['cache_files'] as $cache_file) {
                            
                            $offers = $this->getCache($cache_file);
                            
                            foreach ($offers as $num_offer=>$offer) {
                                
                                if(isset($offer['id']) && $offer['id'] && isset($offer['available']) && $offer['available'] && isset($offer['data']['description']) && $offer['data']['description'] && isset($offer['data']['vendor']) && $offer['data']['vendor'] && isset($offer['data']['picture']) && $offer['data']['picture'] && isset($offer['data']['price']) && $offer['data']['price'] && isset($offer['data']['name']) && $offer['data']['name']){

                                    $fb_data = array();

                                    $fb_data['id'] = $offer['id'];

                                    $fb_data['availability'] = 'out of stock';

                                    if($offer['available']=='true'){

                                        $fb_data['availability'] = 'in stock';

                                    }

                                    $fb_data['condition'] = $offer['data']['condition'];

                                    $fb_data['description'] = $offer['data']['description'];

                                    foreach ($offer['data']['picture'] as $picture) {

                                        if(!isset($fb_data['image_link'])){

                                            $fb_data['image_link'] = $picture;

                                        }else{

                                            $fb_data['additional_image_link'] = $picture;

                                        }

                                    }
                                    
                                    if(isset($offer['data']['google_product_category'])){

                                        $fb_data['google_product_category'] = $offer['data']['google_product_category'];

                                    }else{
                                        
                                        unset($fb_data['google_product_category']);
                                        
                                    }

                                    $fb_data['link'] = $offer['data']['url'];

                                    $fb_data['title'] = $offer['data']['name'];

                                    $fb_data['price'] = number_format(round($offer['data']['price'],2),2, '.', '').' '.$offer['data']['currencyId'];

                                    $fb_data['brand'] = $offer['data']['vendor'];

                                    for($i=0;$i<5;$i++){

                                        if(isset($offer['data']['custom_label_'.$i])){

                                            $fb_data['custom_label_'.$i] = $offer['data']['custom_label_'.$i];

                                        }

                                    }

                                    $rows = $this->createFBTag($fb_data,array(),'g:');

                                    $fb .= $this->getFBElement(array(), 'entry', $rows);

                                }
                            }
                            
                            if($fb){
                                
                                $fb_parts_cache = $this->cfiles['fb_parts_cache'].$this->request->get['token'].'-'.  count($xml_parts);
                            
                                $fb = $this->replaceTags($fb);
                                
                                $this->{$this->path_on_model}->writeCache($fb_parts_cache,array(), $fb);

                                $xml_parts[$fb_parts_cache] = $fb_parts_cache;

                                $fb = '';
                                
                            }
                            
                        }
                        
                    }
                    
                    $fb .= '</feed>';
                
                    $fb = $this->replaceTags($fb);
                    
                    $fb_parts_cache = $this->cfiles['fb_parts_cache'].$this->request->get['token'].'-'.  count($xml_parts);

                    $this->{$this->path_on_model}->writeCache($fb_parts_cache,array(), $fb);

                    $xml_parts[$fb_parts_cache] = $fb_parts_cache;

                    $rootPath = realpath(DIR_APPLICATION . '..'); 

                    if($xml_parts && isset($this->general_setting['fb_filename_export']) && $this->general_setting['fb_filename_export']){

                        $file_name_and_path = $rootPath.'/'.$this->general_setting['fb_filename_export'].'.xml';

                        if(file_exists($file_name_and_path)){
                            
                            $handle = fopen($file_name_and_path, 'w+');

                            fclose($handle);
                            
                        }

                        foreach ($xml_parts as $xml_part) {

                            if(file_exists(DIR_CACHE.$xml_part) && is_writable($file_name_and_path)){

                                $cache_offers = file_get_contents(DIR_CACHE.$xml_part);

                                $handle = fopen($file_name_and_path, 'a');

                                fwrite($handle, $cache_offers . $this->eol);

                                fclose($handle);

                            }else{

                                $this->sendErrorXML(array('Файл не может быть записан. Выключите "Оптимизацию при формировании итогового YML (запись файла частями). Если is_writable = 0 (см. далее), то установите права на запись 755 для папки: '.$this->eol. dirname($file_name_and_path).$this->eol.' is_writable: '.is_writable($file_name_and_path).', cache file_exists: '.file_exists(DIR_CACHE.$xml_part)));

                            }

                        }

                    }
                    
                }else{
                    
                    $yml  = '<?xml version="1.0" encoding="UTF-8"?>' . $this->eol;
                    $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol;
                    $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol;
                    $yml .= '<shop>' . $this->eol;
                    $yml .= $this->createTag($this->shop);
                    $yml .= '<currencies>' . $this->eol;
                    foreach ($this->currencies as $currency) {
                            $yml .= $this->getElement($currency, 'currency');
                    }
                    $yml .= '</currencies>' . $this->eol;
                    $yml .= '<categories>' . $this->eol;
                    foreach ($this->categories as $category) {
                            $category_name = $category['name'];
                            
                            if(isset($category['attributes'])){
                                
                                $category = array_merge($category,$category['attributes']);
                                unset($category['attributes']);
                                
                            }
                            
                            unset($category['name'], $category['export']);
                            $yml .= $this->getElement($category, 'category', $category_name);
                    }
                    $yml .= '</categories>' . $this->eol;
                    if($this->delivery_option){
                        $yml .= $this->createTag($this->delivery_option);
                    }
                    $yml .= '<offers>' . $this->eol;
                    
                    $yml_parts_cache = $this->cfiles['yml_parts_cache'].$this->request->get['token'].'-'.  count($xml_parts);
                    
                    $yml = $this->replaceTags($yml);
                    
                    $this->{$this->path_on_model}->writeCache($yml_parts_cache,array(), $yml);
                    
                    $xml_parts[$yml_parts_cache] = $yml_parts_cache;
                    
                    $yml = '';
                    
                    if($this->offers_fwrire['cache_files']){
                        
                        foreach ($this->offers_fwrire['cache_files'] as $cache_file) {
                            
                            $offers = $this->getCache($cache_file);
                            
                            foreach ($offers as $num_offer=>$offer) {
                                
                                $rows = $this->createTag($offer['data']);
                                unset($offer['data']);
                                if (isset($offer['param'])) {
                                    $rows .= $this->createParam($offer['param']);
                                    unset($offer['param']);
                                }
                                $yml .= $this->getElement($offer, 'offer', $rows);
                                unset($this->offers[$num_offer]);
                                
                            }
                            
                            if($yml){
                                
                                $yml = $this->replaceTags($yml);
                                
                                $yml_parts_cache = $this->cfiles['yml_parts_cache'].$this->request->get['token'].'-'.  count($xml_parts);
                            
                                $this->{$this->path_on_model}->writeCache($yml_parts_cache,array(), $yml);

                                $xml_parts[$yml_parts_cache] = $yml_parts_cache;

                                $yml = '';
                                
                            }
                            
                        }
                        
                    }
                    
                    $yml .= '</offers>' . $this->eol;
			    
		    if(isset($this->general_setting['gifts_result'])){
			
			$yml .= $this->general_setting['gifts_result'];
			
		    }
		    
		    if(isset($this->general_setting['promos_result'])){
			
			$yml .= '<promos>' . $this->eol;
			
			foreach ($this->general_setting['promos_result'] as $promos_result) {
			    
			    $yml .= $promos_result;
			    
			}
			
			$yml .= '</promos>' . $this->eol;
			
		    }
                    
                    $yml .= '</shop>';
                    
                    $yml .= '</yml_catalog>';
                    
                    $yml = $this->replaceTags($yml);
                    
                    $yml_parts_cache = $this->cfiles['yml_parts_cache'].$this->request->get['token'].'-'.  count($xml_parts);
                    
                    $this->{$this->path_on_model}->writeCache($yml_parts_cache,array(), $yml);
                    
                    $xml_parts[$yml_parts_cache] = $yml_parts_cache;
                    
                    $rootPath = realpath(DIR_APPLICATION . '..'); 

                    if($xml_parts && isset($this->general_setting[$this->parse_yml['export_filename']]) && $this->general_setting[$this->parse_yml['export_filename']]){

                        $file_name_and_path = $rootPath.'/'.$this->general_setting['filename_export'].'.xml';
                        
                        if(file_exists($file_name_and_path)){
                            
                            $handle = fopen($file_name_and_path, 'w+');

                            fclose($handle);
                            
                        }

                        foreach ($xml_parts as $xml_part) {

                            if(file_exists(DIR_CACHE.$xml_part) && is_writable($file_name_and_path)){

                                $cache_offers = file_get_contents(DIR_CACHE.$xml_part);

                                $handle = fopen($file_name_and_path, 'a');

                                fwrite($handle, $cache_offers . $this->eol);

                                fclose($handle);

                            }else{

                                $this->sendErrorXML(array('Файл не может быть записан. Выключите "Оптимизацию при формировании итогового YML (запись файла частями). Если is_writable = 0 (см. далее), то установите права на запись 755 для папки: '.$this->eol. dirname($file_name_and_path).$this->eol.' is_writable: '.is_writable($file_name_and_path).', cache file_exists: '.file_exists(DIR_CACHE.$xml_part)));

                            }

                        }

                    }
                    
                }
                
                if(file_exists($file_name_and_path) && is_writable($file_name_and_path)){
                        
                    $result = file_get_contents($file_name_and_path);

                }else{
                    
                    $this->sendErrorXML(array('Файл не записан, is_writable: '.is_writable($file_name_and_path).', cache file_exists: '.file_exists(DIR_CACHE.$xml_part)));
                    
                }
                
                return $result;
                
            }elseif(isset($this->request->get['fb'])){
                
                $fb  = '<?xml version="1.0"?>' . $this->eol;
		$fb .= '<feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">' . $this->eol;
                $fb .= '<title>'.$this->shop['name'].'</title>'. $this->eol;
		$fb .= $this->createFBTag(array('link'=>''),array('link'=>array('rel'=>'self','href'=>$this->shop['url'])));
                
		foreach ($this->offers as $num_offer=>$offer) {
                    
                        if(isset($offer['id']) && $offer['id'] && isset($offer['available']) && $offer['available'] && isset($offer['data']['description']) && $offer['data']['description'] && isset($offer['data']['vendor']) && $offer['data']['vendor'] && isset($offer['data']['picture']) && $offer['data']['picture'] && isset($offer['data']['price']) && $offer['data']['price'] && isset($offer['data']['name']) && $offer['data']['name']){
                            
                            $fb_data = array();
                            
                            $fb_data['id'] = $offer['id'];
                            
                            $fb_data['availability'] = 'out of stock';
                            
                            if($offer['available']=='true'){
                                
                                $fb_data['availability'] = 'in stock';
                                
                            }
                            
                            $fb_data['condition'] = $offer['data']['condition'];
                            
                            $fb_data['description'] = $offer['data']['description'];
                            
                            foreach ($offer['data']['picture'] as $picture) {
                                
                                if(!isset($fb_data['image_link'])){
                                    
                                    $fb_data['image_link'] = $picture;
                                    
                                }else{
                                    
                                    $fb_data['additional_image_link'] = $picture;
                                    
                                }
                                
                            }
                            
                            if(isset($offer['data']['google_product_category'])){

                                $fb_data['google_product_category'] = $offer['data']['google_product_category'];

                            }else{

                                unset($fb_data['google_product_category']);

                            }
                            
                            $fb_data['link'] = $offer['data']['url'];
                            
                            $fb_data['title'] = $offer['data']['name'];
                            
                            $fb_data['price'] = number_format(round($offer['data']['price'],2),2, '.', '').' '.$offer['data']['currencyId'];
                            
                            $fb_data['brand'] = $offer['data']['vendor'];
                            
                            for($i=0;$i<5;$i++){
                                
                                if(isset($offer['data']['custom_label_'.$i])){
                                    
                                    $fb_data['custom_label_'.$i] = $offer['data']['custom_label_'.$i];
                                    
                                }
                                
                            }
                            
                            $rows = $this->createFBTag($fb_data,array(),'g:');
                            
                            $fb .= $this->getFBElement(array(), 'entry', $rows);
                            
                        }
                        
                        unset($this->offers[$num_offer]);
                        
		}
		$fb .= '</feed>';
                
                $fb = $this->replaceTags($fb);
                
                $rootPath = realpath(DIR_APPLICATION . '..'); 
                
                if(isset($this->general_setting['fb_filename_export']) && $this->general_setting['fb_filename_export']){
                    
                    $file_name_and_path = $rootPath.'/'.$this->general_setting['fb_filename_export'].'.xml';
                    
                    $dirname = dirname($file_name_and_path);

                    $handle = FALSE;

                    if($file_name_and_path && !file_exists($file_name_and_path)){

                        if(!is_dir($dirname)){

                            mkdir($dirname,0777,TRUE);

                        }

                        $handle = fopen($file_name_and_path, "w");

                    }elseif(file_exists($file_name_and_path)){

                        $handle = fopen($file_name_and_path, "w");

                    }

                    if($handle){
                        fwrite($handle, $fb);
                        fclose($handle);
                    }
                    
                }
		return $fb;
                
            }else{
                
                $yml  = '<?xml version="1.0" encoding="UTF-8"?>' . $this->eol;
		$yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol;
		$yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol;
		$yml .= '<shop>' . $this->eol;
		$yml .= $this->createTag($this->shop);
		$yml .= '<currencies>' . $this->eol;
		foreach ($this->currencies as $currency) {
			$yml .= $this->getElement($currency, 'currency');
		}
		$yml .= '</currencies>' . $this->eol;
		$yml .= '<categories>' . $this->eol;
		foreach ($this->categories as $category) {
			$category_name = $category['name'];
			
			if(isset($category['attributes'])){

			    $category = array_merge($category,$category['attributes']);
			    unset($category['attributes']);

			}
			
			unset($category['name'], $category['export']);
			$yml .= $this->getElement($category, 'category', $category_name);
		}
		$yml .= '</categories>' . $this->eol;
                if($this->delivery_option){
                    $yml .= $this->createTag($this->delivery_option);
                }
		$yml .= '<offers>' . $this->eol;
		foreach ($this->offers as $num_offer=>$offer) {
			$rows = $this->createTag($offer['data']);
			unset($offer['data']);
			if (isset($offer['param'])) {
                            $rows .= $this->createParam($offer['param']);
                            unset($offer['param']);
			}
			$yml .= $this->getElement($offer, 'offer', $rows);
                        unset($this->offers[$num_offer]);
		}
		$yml .= '</offers>' . $this->eol;
		$yml .= '</shop>';
		$yml .= '</yml_catalog>';
                
                $yml = $this->replaceTags($yml);
                
                //пишем файл
                $rootPath = realpath(DIR_APPLICATION . '..'); 
                
                if(isset($this->general_setting[$this->parse_yml['export_filename']]) && $this->general_setting[$this->parse_yml['export_filename']]){
                    
                    
                    $file_name_and_path = $rootPath.'/'.$this->general_setting['filename_export'].'.xml';
                
                    $dirname = dirname($file_name_and_path);

                    $handle = FALSE;

                    if($file_name_and_path && !file_exists($file_name_and_path)){

                        if(!is_dir($dirname)){

                            mkdir($dirname,0777,TRUE);

                        }

                        $handle = fopen($file_name_and_path, "w");

                    }elseif(file_exists($file_name_and_path)){

                        $handle = fopen($file_name_and_path, "w");

                    }

                    if($handle){
                        fwrite($handle, $yml);
                        fclose($handle);
                    }
                    
                }
		return $yml;
                
            }
	}
        
        
        public function replaceTags($string){
            
            if(isset($this->general_setting['filter_and_raplace_tags']['replace_tags']) && $this->general_setting['filter_and_raplace_tags']['replace_tags']!==''){
                
                $replace_tags_parts = explode('|', $this->general_setting['filter_and_raplace_tags']['replace_tags']);
                
                $find_tags = array();
                
                $replace_tags = array();
                
                $num_replace = 0;
                
                foreach ($replace_tags_parts as $replace_tags_part) {
                    
                    $replace_tags_this = explode('---', $replace_tags_part);
                    
                    if(isset($replace_tags_this[1]) && $replace_tags_this[1] && $replace_tags_this[0]){
                        
                        $find_tags[] = '<'.$replace_tags_this[0].' ';
                        
                        $replace_tags[] = '<'.$replace_tags_this[1].' ';
                        
                        $find_tags[] = '</'.$replace_tags_this[0].'>';
                        
                        $replace_tags[] = '</'.$replace_tags_this[1].'>';
                        
                        $find_tags[] = '<'.$replace_tags_this[0].'>';
                        
                        $replace_tags[] = '<'.$replace_tags_this[1].'>';
                        
                    }
                    
                }
                
                if($replace_tags){
                    
                    $string = str_replace($find_tags, $replace_tags, $string);
                    
                }
                
            }
            
            return $string;
            
        }
        
        private function getFBElement($attributes, $element_name, $element_value = '') {
            $retval = '<'.$element_name.' ';
            foreach ($attributes as $key => $value) {
                $retval .= $key .'="'.$value.'" ';
            }
            $retval .= $element_value ? '>' .$this->eol. $element_value.'</'.$element_name.'>' : '/>';
            $retval .= $this->eol;
            return $retval;
	}
        
	private function createFBTag($tags,$attributes=array(),$tag_add='') {
            
            $retval = '';
            foreach ($tags as $key => $value) {
                
                $attribute = '';
                
                if(isset($attributes[$key])){
                    
                    foreach ($attributes[$key] as $attribute_name => $attribute_value) {
                        
                        $attribute .= ' '.  $attribute_name.'="'.  $attribute_value.'"';
                        
                    }
                    
                }
                
                if($tag_add){
                    $key = $tag_add.$key;
                }
                
                
                if(!is_array($value) && $value){
                    $retval .= '<'.$key.$attribute.'>'.$value.'</'.$key .'>'.$this->eol;
                }elseif (is_array($value) && $key == $tag_add.'shipping') {
                    $retval .= $this->createDeliveryOptions($value); 
                }elseif (is_array($value)) {
                    foreach ($value as $key_two=>$value_two) {
                        $retval .= '<'.$key.$attribute.'>'.$value_two.'</'.$key.'>' . $this->eol;
                    }
                }elseif(!is_array($value) && !$value){
                    $retval .= '<'.$key.$attribute.'/>'. $this->eol;
                }
            }
            return $retval;
	}
        
        public function checklicense() {
            //asju
            eval(base64_decode('JGdlbmVyYWxfc2V0dGluZyA9ICR0aGlzLT5jb25maWctPmdldCgnb2NleHRfZmVlZF9nZW5lcmF0b3JfeWFtYXJrZXRfZ2VuZXJhbF9zZXR0aW5nJyk7DQogICAgICAgICAgICBpZihpc3NldCgkZ2VuZXJhbF9zZXR0aW5nWyd1c2VyX2tleSddKSAmJiBpc3NldCgkZ2VuZXJhbF9zZXR0aW5nWyd1c2VyX2VtYWlsJ10pKXsNCiAgICAgICAgICAgICAgICAkdGhpcy0+bF9kYXRhWyd1J10gPSAkZ2VuZXJhbF9zZXR0aW5nWyd1c2VyX2tleSddOw0KICAgICAgICAgICAgICAgICR0aGlzLT5sX2RhdGFbJ2UnXSA9ICRnZW5lcmFsX3NldHRpbmdbJ3VzZXJfZW1haWwnXTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICR0aGlzLT5sX2RhdGFbJ3UnXSA9IG1kNSh0aW1lKCkpOw0KICAgICAgICAgICAgICAgICR0aGlzLT5sX2RhdGFbJ2UnXSA9IHRpbWUoKTsNCiAgICAgICAgICAgIH0='));//OCext.com: do not delete this line | не удаляйте эту строку
            //indjds
            eval(base64_decode('aWYoZmlsZV9leGlzdHMoJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4nL3N5c3RlbS9saWJyYXJ5L3ZlbmRvci9vY2V4dC9vY2V4dF9mZWVkX2dlbmVyYXRvcl95YW1hcmtldF9saWNlbnNlLnBocCcpKXsNCiAgICAgICAgICAgICAgICBpbmNsdWRlX29uY2UgJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4nL3N5c3RlbS9saWJyYXJ5L3ZlbmRvci9vY2V4dC9vY2V4dF9mZWVkX2dlbmVyYXRvcl95YW1hcmtldF9saWNlbnNlLnBocCc7DQogICAgICAgICAgICB9'));//OCext.com: do not delete this line | не удаляйте эту строку
        }

	private function getElement($attributes, $element_name, $element_value = '') {
            $retval = '<'.$element_name.' ';
            foreach ($attributes as $key => $value) {
                $retval .= $key .'="'.$value.'" ';
            }
            $retval .= $element_value ? '>' .$element_value.'</'.$element_name.'>' : '/>'.$this->eol;
            return $retval;
	}
	
	private function getXMLFromArray($value,$result) {
	    
	    $result = '';
	    
	    if(is_array($value)){
		
		foreach ($value as $tag_name => $value2) {
		    
		    foreach ($attributes as $key => $value) {
			
			$result .= $key .'="'.$value.'" ';
			
		    }
		    
		}
		
	    }
	    
	    
	    
            $retval = '<'.$element_name.' ';
            foreach ($attributes as $key => $value) {
                $retval .= $key .'="'.$value.'" ';
            }
            $retval .= $element_value ? '>' .$element_value.'</'.$element_name.'>' : '/>'.$this->eol;
            return $retval;
	}
        
	private function createTag($tags) {
            $retval = '';
            foreach ($tags as $key => $value) {
                
                if(!is_array($value) && $value!==''){
                    
                    $key_parts = explode(' ', $key);
                    
                    $key_attr = '';
                    
                    if(isset($key_parts[1])){
                        
                        $key = trim($key_parts[0]);
                        
                        for($kp=1;$kp<=count($key_parts);$kp++){
                            
                            if(isset($key_parts[$kp])){
                                
                                $key_parts[$kp] = trim($key_parts[$kp]);
                        
                                if($key_parts[$kp]){
                                    $key_attr .= ' '.  str_replace("&quot;", '"', $key_parts[$kp]);
                                }
                                
                            }
                            
                        }
                        
                    }
                    
                    $retval .= '<'.$key.$key_attr.'>'.$value.'</'.$key .'>'.$this->eol;
                    
                }elseif (is_array($value) && $key == 'delivery-options') {
                    $retval .= $this->createDeliveryOptions($value); 
                }elseif (is_array($value) && $key == 'age') {
                    $retval .= '<'.$key.' unit="'.$value['unit'].'">'.$value['value'].'</'.$key.'>' . $this->eol;
                }elseif (is_array($value)) {
                    foreach ($value as $key_two=>$value_two) {
                        $retval .= '<'.$key.'>'.$value_two.'</'.$key.'>' . $this->eol;
                    }
                }elseif (!is_array($value) && $value==='') {
                    
                    $key_parts = explode(' ', $key);
                    
                    $key_attr = '';
                    
                    if(isset($key_parts[1])){
                        
                        $key = trim($key_parts[0]);
                        
                        for($kp=1;$kp<=count($key_parts);$kp++){
                            
                            if(isset($key_parts[$kp])){
                                
                                $key_parts[$kp] = trim($key_parts[$kp]);
                        
                                if($key_parts[$kp]){
                                    $key_attr = ' '.  str_replace("&quot;", '"', $key_parts[$kp]);
                                }
                                
                            }
                            
                        }
                        
                    }
                    
                    if($key_attr){
                        $retval .= '<'.$key.$key_attr.'></'.$key.'>'.$this->eol;
                    }
                    
                }
            }
            return $retval;
	}
        
	private function createParam($params) {
            $retval = '';
            foreach ($params as $param) {
                $retval .= '<param name="'.$this->prepareField($param['name']);
                if (isset($param['unit'])) {
                        $retval .= '" unit="'.$this->prepareField($param['unit']);
                }
                $retval .= '">'.$this->prepareField($param['value']) . '</param>'.$this->eol;
            }
            return $retval;
	}
        
        private function createDeliveryOptions($delivery_options) {
            $retval = '';
            if($delivery_options){
                foreach ($delivery_options as $option) {
                    if(isset($option['cost']) && isset($option['days'])){
                        $retval .= '<option cost="' . trim($option['cost']).'" days="'.trim($option['days']).'';
                        if (isset($option['order-before']) && $option['order-before']) {
                                $retval .= '" order-before="' . trim($option['order-before']);
                                unset($option['order-before']);
                        }
                        $retval .= '"/>'.$this->eol;
                    }
                }
            }
            if($retval){
                $retval = '<delivery-options>'.$this->eol.$retval.'</delivery-options>'.$this->eol;
            }
            
            return $retval;
	}
        
        public function sendErrorXML($errors) {
            $yml  = '<?xml version="1.0" encoding="UTF-8"?>' . $this->eol;
            $yml .= '<msgs date="' . date('Y-m-d H:i') . '">' . $this->eol;
            foreach ($errors as $error) {
                $yml .= $this->createTag(array('msg'=>$error)) . $this->eol;
            }
            $yml .= '</msgs>';
            $this->response->addHeader('Content-Type: application/xml');
            $this->response->setOutput($yml);
        }
}
?>

 

Модель:

Спойлер
<?php
class ModelExtensionFeedOcextFeedGeneratorYaMarket extends Model {
    
    public function __construct($registry) {
        
        $this->registry = $registry;
        $this->setSettingVersion();
        
    }
    
    public function setSettingVersion(){
        
        require_once(DIR_SYSTEM . 'library/vendor/ocext/multiyml_setting_version.php');
        $this->registry->set('setting_version',new multiYMLSettingVersion($this->registry,  $this->path_oc_version, $this->language,$this->load,$this->db));
        
    }

    public function getFilterData($key,$filter_data_group_id) {
        
        $sql = "SELECT * FROM `" . DB_PREFIX . "ocext_feed_generator_yamarket_filter_data` WHERE `key` = '".$key."' AND filter_data_group_id = '".$filter_data_group_id."' ";
        $query = $this->db->query($sql);
        $result = array();
        if($query->row){
            $result = json_decode($query->row['filter_data'], true);
        }
        
        return $result;
    }
    
    private function replaceOperator($operator){

        $find = array('&lt;','≤','=','≥','&gt;','≠');

        $replace = array('<','<=','=','>=','>','!=');

        $operator = str_replace($find, $replace, $operator);

        return $operator;

    }
    
    public function getStatusByWhere($product_data_where,$product) {

        $result = FALSE;
            
        if($product_data_where['product_field'] && $product_data_where['operator']){

            $operator = $this->replaceOperator($product_data_where['operator']);

            $product_field = $product_data_where['product_field'];

            $value = trim($product_data_where['value']);

            if($operator && $product_field){

                if($operator=='like' && isset($product[$product_field]) && strstr($product[$product_field], $value)){

                    $result = TRUE;

                }elseif($operator=='not_like' && isset($product[$product_field]) && !strstr($product[$product_field], $value)){

                    $result = TRUE;

                }else{

                    if($operator=='<' && isset($product[$product_field]) && $product[$product_field] < $value){

                        $result = TRUE;

                    }elseif($operator=='<=' && isset($product[$product_field]) && $product[$product_field] <= $value){

                        $result = TRUE;

                    }elseif($operator=='=' && isset($product[$product_field]) && $product[$product_field] == $value){

                        $result = TRUE;

                    }elseif($operator=='>=' && isset($product[$product_field]) && $product[$product_field] >= $value){

                        $result = TRUE;

                    }elseif($operator=='>' && isset($product[$product_field]) && $product[$product_field] > $value){

                        $result = TRUE;

                    }elseif($operator=='!=' && isset($product[$product_field]) && $product[$product_field] != $value){

                        $result = TRUE;

                    }

                }

            }

        }
        
        return $result;

    }
    
    public function resizeImage($file,$w,$h,$d,$HTTP_SERVER) {
            
        $image = $this->setting_version->resizeImage($file,$w,$h,$d,  $HTTP_SERVER);

        return $image;
    }
    
    public function getWhere($product_data) {

        $where = array();
        
        foreach ($product_data as $product_data_where){

            if($product_data_where['product_field'] && $product_data_where['operator']){

                $operator = $this->replaceOperator($product_data_where['operator']);

                $product_field = $product_data_where['product_field'];

                $value = trim($product_data_where['value']);
                
                $sql_operator = $product_data_where['logic'];

                if($operator && $product_field){
                    
                    $sql = '';

                    if($operator=='like_right'){

                        $sql = ' p.'.$product_field.' LIKE  "%'.$this->db->escape($value).'" ';

                    }elseif($operator=='like_left'){

                        $sql = ' p.'.$product_field.' LIKE  "'.$this->db->escape($value).'%" ';

                    }elseif($operator=='like'){

                        $sql = ' p.'.$product_field.' LIKE  "%'.$this->db->escape($value).'%" ';

                    }elseif($operator=='not_like_right'){

                        $sql = ' p.'.$product_field.' NOT LIKE  "%'.$this->db->escape($value).'" ';

                    }elseif($operator=='not_like_left'){

                        $sql = ' p.'.$product_field.' NOT LIKE  "'.$this->db->escape($value).'%" ';

                    }elseif($operator=='not_like'){

                        $sql = ' p.'.$product_field.' NOT LIKE  "%'.$this->db->escape($value).'%" ';

                    }else{

                        $sql = ' p.'.$product_field.' '.$operator.' "'.$this->db->escape($value).'" ';

                    }

                    $where[][$sql_operator] = $sql;
                    
                }
                
            }

        }
        
        $where_result = '';
        
        if($where){
            
            $count = 1;
            
            foreach ($where as $sql_where) {
                
                $sql_operator = key($sql_where);
                
                $sql_where = current($sql_where);
                
                if($count<count($where)){
                    
                    $where_result .= $sql_where.$sql_operator;
                    
                }else{
                    
                    $where_result .= $sql_where;
                    
                }
                
                $count++;
                
            }
            
        }
        
        return $where_result;

    }
    
    
    
    
    
    public function getSettings($setting_type=0,$setting_id=FALSE,$setting_product_id=0) {
        
        $sql = "SELECT * FROM `" .   DB_PREFIX   . 'ocext_feed_generator_yamarket_setting` ';
        
        $where = array();
        
        if($setting_type){
            $where[] = " setting_type = '".$setting_type."' ";
        }
        //$setting_id===0 - иначе придут все настройки, когда вызван новый фид, т.к. на $where[] = " setting_type = '".$setting_type."' "; много результатов
        if($setting_id || $setting_id===0){
            $where[] = " setting_id = ".$setting_id." ";
        }
        
        if($setting_product_id){
            
            $where[] = " setting LIKE '%\"setting_product_id\":\"".$setting_product_id."\"%' "; //"setting_product_id":"0"
            
        }
        
        if($where){
            $sql .= 'WHERE '.implode(' AND ', $where);
        }
        
        $result = $this->db->query($sql);
        
        return $result->rows;
        
    }
    
    public function getMemoryLimit($level=0.3){
        
        $memory_limit = ini_get('memory_limit');
        
        if(strstr($memory_limit, 'M')){
			
			$memory_limit = (int)str_replace('M','',$memory_limit);
            
            $memory_limit *= (1024*1024*$level); 
            
        }elseif(strstr($memory_limit, 'G')){
			
			$memory_limit = (int)str_replace('G','',$memory_limit);
            
            $memory_limit *= (1024*1024*1024*$level); 
            
        }else{
			
            $memory_limit = (int)$memory_limit;
            
            $memory_limit *= $level;
            
        }
        
        return $memory_limit;
        
    }
    
    public function getProductCategories($product_id) {
        
        $mcat = '';
        
        if($this->checkColumnTable('product_to_category', 'main_category')){
            
            $mcat .= " p2c.main_category, ";
            
        }
        
        $result = array('main_category'=>0,'category_ids'=>array());
        
        $categories = $this->db->query("SELECT ".$mcat." p2c.category_id FROM " . DB_PREFIX . "product_to_category p2c LEFT JOIN " . DB_PREFIX . "category ctg ON (p2c.category_id = ctg.category_id)  WHERE p2c.product_id = '" . (int)$product_id."' AND ctg.status = '1' ");
        
        if($categories->rows){
            
            foreach ($categories->rows as $category) {
                
                if(isset($category['main_category']) && $category['main_category']){
                    
                    $result['main_category'] = $category['category_id'];
                    
                }else{
                    
                    $result['category_ids'][$category['category_id']] = $category['category_id'];
                    
                }
                
            }
            
        }
        
        return $result;
        
    }
    
    private function checkColumnTable($table,$column) {

        if($this->showTable($table, DB_PREFIX)){
            
            $check = $this->db->query(" SHOW columns FROM `".DB_PREFIX.$table."` WHERE `Field` = '".$column."'  ");
            
            if(!$check->num_rows){
                return FALSE;
            }else{
                return TRUE;
            }
            
        }else{
            
            return FALSE;
            
        }

    }

    
    public function getCategoriesAndProducts($ym_categories,$ym_manufacturers,$filter_data_group_id,$content_language_id,$general_setting) {
        
            $cache_status = 0;
            
            $memory_limit = $this->getMemoryLimit();
            
        if(isset($general_setting['yml_cache_enable']) && $general_setting['yml_cache_enable']){
            
            $cache_status = 1;
            
            $memory_limit = $this->getMemoryLimit((float)$general_setting['yml_cache_level']);
            
        }
        
        $cache_file_name = 'yml_cache_'.$this->request->get['token'];
        
        $add_settings = array();
        
        $p2c = '';
        $ym_attributes = array();
        $all_yml_export_ocext_ym_filter_data_attributes = $this->getFilterData('ocext_feed_generator_yamarket_ym_filter_attributes',$filter_data_group_id,$content_language_id);
        if($all_yml_export_ocext_ym_filter_data_attributes){
            $ym_attributes = $all_yml_export_ocext_ym_filter_data_attributes;
        }
        $ym_options = array();
        $all_yml_export_ocext_ym_filter_data_options = $this->getFilterData('ocext_feed_generator_yamarket_ym_filter_options',$filter_data_group_id,$content_language_id);
        if($all_yml_export_ocext_ym_filter_data_options){
            $ym_options = $all_yml_export_ocext_ym_filter_data_options;
        }
        
        $delivery_option_by_manufacturer = $this->getFilterData('ocext_feed_generator_yamarket_ym_filter_delivery_option_by_manufacturer',$filter_data_group_id,$content_language_id);
	
	$mapping_market_place_categories = $this->getFilterData('ocext_feed_generator_yamarket_ym_filter_mapping_market_place_categories',$filter_data_group_id,$content_language_id);
        
	if($ym_categories){
            $sql_cats = array();
            foreach ($ym_categories as $category_id => $ym_category) {
                $sql_cats[] = " p2c.category_id = '".(int)$category_id."' ";
            }
            if($sql_cats){
                $p2c = ' AND ( '.implode(' OR ', $sql_cats).' ) ';
            }
        }
        /*$mcat = '';
        
        if($this->checkColumnTable('product_to_category', 'main_category')){
            
            $mcat .= " AND p2c.main_category = '1' ";
            
        }
        
        $sql = "SELECT p.*, pd.name, pd.*, m.name AS manufacturer, p2c.category_id, ps.price AS special_price, pds.price AS discount_special_price FROM " . DB_PREFIX . "product p JOIN " . DB_PREFIX . "product_to_category AS p2c ON (p.product_id = p2c.product_id) LEFT JOIN " . DB_PREFIX . "category ctg ON (p2c.category_id = ctg.category_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ps.date_start < NOW() AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()) LEFT JOIN " . DB_PREFIX . "product_discount pds ON (p.product_id = pds.product_id)  AND pds.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pds.date_start < NOW() AND (pds.date_end = '0000-00-00' OR pds.date_end > NOW())   WHERE p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND pd.language_id = '" . (int)$content_language_id . "' AND p.date_available <= NOW() AND ctg.status = '1' AND p.status = '1' ".$mcat.$p2c." GROUP BY p.product_id";*/
        
        $sql_columns = '';
        
        $columns_where = $this->getFilterData('ocext_feed_generator_yamarket_ym_filter_columns',$filter_data_group_id,$content_language_id);
        
        if(isset($columns_where['product'])){
            
            $sql_columns = $this->getWhere($columns_where['product']);
            
            if($sql_columns){
                
                $sql_columns = " AND ( ".$sql_columns." ) ";
                
            }
            
        }
        
        $sql = "SELECT p.*, pd.name, pd.*, m.name AS manufacturer, p2c.category_id, ps.price AS special_price, pds.price AS discount_special_price FROM " . DB_PREFIX . "product p JOIN " . DB_PREFIX . "product_to_category AS p2c ON (p.product_id = p2c.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ps.date_start <= NOW() AND ( ps.date_end = '0000-00-00' OR ps.date_end >= NOW() ) AND ps.priority in ( SELECT min(ps.priority) ) LEFT JOIN " . DB_PREFIX . "product_discount pds ON (p.product_id = pds.product_id)  AND pds.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pds.date_start < NOW() AND (pds.date_end = '0000-00-00' OR pds.date_end > NOW())   WHERE p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND pd.language_id = '" . (int)$content_language_id . "' AND p.date_available <= NOW() AND p.status = '1' ".$sql_columns.$p2c." GROUP BY p.product_id";
        $count_sql = "SELECT p.status FROM " . DB_PREFIX . "product p JOIN " . DB_PREFIX . "product_to_category AS p2c ON (p.product_id = p2c.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ps.date_start <= NOW() AND ( ps.date_end = '0000-00-00' OR ps.date_end >= NOW() ) AND ps.priority in ( SELECT min(ps.priority) ) LEFT JOIN " . DB_PREFIX . "product_discount pds ON (p.product_id = pds.product_id)  AND pds.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pds.date_start < NOW() AND (pds.date_end = '0000-00-00' OR pds.date_end > NOW())   WHERE p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND pd.language_id = '" . (int)$content_language_id . "' AND p.date_available <= NOW() AND p.status = '1' ".$sql_columns.$p2c." GROUP BY p.product_id";
        if($this->config->get('ocext_feed_generator_yamarket_ym_filter_prioritet')){
            $prioritet = $this->config->get('ocext_feed_generator_yamarket_ym_filter_prioritet');
        }else{
            $prioritet['categories'] = 1;
            $prioritet['manufacturers'] = 2;
        }
        
        $parts_select = array($sql);
        
        if(isset($general_setting['optimization_feed_limit_products'])){
            
            $parts_select = $this->setting_version->getPartsSelect($sql,$count_sql,$general_setting['optimization_feed_limit_products'],$parts_select);
            
        }
        
        $ym_categories_whis_categories = $this->getYmCategoriesFromDb();
        $result['categories'] = array();
        $result['cache'] = array();
        $result['offers'] = array();
	$result['settings'] = array();
	$result['mapping_market_place_categories'] = $this->getMappingMarketPlaceCategories($mapping_market_place_categories);
	
        $products_filtered = array();
        
        foreach ($parts_select as $sql) {
            
            $query = $this->db->query($sql);
            
            $result['log_errors'][] =  'total offers selected to db: '.$query->num_rows;

            if($query->rows){

                foreach ($query->rows as $i_product => $product) {

                    if($ym_categories){
                        foreach ($ym_categories as $category_id => $ym_category) {
                            if($category_id==$product['category_id'] && (!$ym_manufacturers || ($ym_manufacturers && isset($ym_manufacturers[$product['manufacturer_id']])))){
                                $products_filtered[$product['product_id']] = $product;
                                if(isset($ym_manufacturers[$product['manufacturer_id']]['setting_id']) && $ym_manufacturers[$product['manufacturer_id']]['setting_id']){
                                    $products_filtered[$product['product_id']]['manufacturer_setting_id'] = $ym_manufacturers[$product['manufacturer_id']]['setting_id'];
                                }else{
                                    $products_filtered[$product['product_id']]['manufacturer_setting_id'] = 0;
                                }
                                if(isset($ym_categories[$product['category_id']]['setting_id']) && $ym_categories[$product['category_id']]['setting_id']){
                                    $products_filtered[$product['product_id']]['category_setting_id'] = $ym_categories[$product['category_id']]['setting_id'];
                                }else{
                                    $products_filtered[$product['product_id']]['category_setting_id'] = 0;
                                }
                            }
                        }
                    }elseif ($ym_manufacturers) {
                        foreach ($ym_manufacturers as $manufacturer_id => $ym_manufacturer) {
                            if($manufacturer_id==$product['manufacturer_id']  && (!$ym_categories || ($ym_categories && isset($ym_categories[$product['category_id']]))) ){

                                $products_filtered[$product['product_id']] = $product;
                                if(isset($ym_manufacturers[$product['manufacturer_id']]['setting_id']) && $ym_manufacturers[$product['manufacturer_id']]['setting_id']){
                                    $products_filtered[$product['product_id']]['manufacturer_setting_id'] = $ym_manufacturers[$product['manufacturer_id']]['setting_id'];
                                }else{
                                    $products_filtered[$product['product_id']]['manufacturer_setting_id'] = 0;
                                }
                                if(isset($ym_categories[$product['category_id']]['setting_id']) && $ym_categories[$product['category_id']]['setting_id']){
                                    $products_filtered[$product['product_id']]['category_setting_id'] = $ym_categories[$product['category_id']]['setting_id'];
                                }else{
                                    $products_filtered[$product['product_id']]['category_setting_id'] = 0;
                                }

                            }
                        }
                    }

                    unset($query->rows[$i_product]);

                }

                $result['log_errors'][] =  'total offers after cat/manuf filter: '.count($products_filtered);

                if($products_filtered){

                    foreach ($products_filtered as $i_product => $product) {

                        $memory_get_usage = memory_get_usage();

                        $set = array();
                        $setting = array();
                        if($prioritet['manufacturers']<$prioritet['categories']){

                            $set[$product['manufacturer_setting_id']] = $product['manufacturer_setting_id'];

                        }else{

                            $set[$product['category_setting_id']] = $product['category_setting_id'];

                        }

                        if($set){
                            $setting_row = $this->getSettings(0, end($set));
                            if($setting_row){
                                $setting = json_decode($setting_row[0]['setting'],TRUE);
				$setting['setting_id'] = $setting_row[0]['setting_id'];
                            }
                            if(!isset($setting['status']) || !$setting['status']){
                                $setting = array();
                            }
                        }

                        //получаем настройку продукта, если есть и меняем на неё шаблон продукта
                        $product_setting = $this->getSettings('product_setting', FALSE, $product['product_id']);
                        if($product_setting){
                            $set = array();
                            $set[$product_setting[0]['setting_id']] = $product_setting[0]['setting_id'];
                            $setting_update = json_decode($product_setting[0]['setting'],TRUE);

                            //если выключен и нет более верхнего шаблона, то обнуляем шаблон, иначе делаем более верхний
                            if(!$setting_update['status'] && !$setting){
                                $setting = array();
                            }elseif($setting_update['status']){
                                $setting = $setting_update;
                            }
                        }

                        $dis_product_ids = array();

                        if(isset($setting['dis_product_ids']) && $setting['dis_product_ids']){

                            $dis_product_ids_ids = explode(',', $setting['dis_product_ids']);

                            foreach ($dis_product_ids_ids as $dis_product_ids_id) {

                                $dis_product_ids_id = trim((int)$dis_product_ids_id);

                                $dis_product_ids[$dis_product_ids_id] = $dis_product_ids_id;

                            }

                        }

                        $enb_product_ids = array();

                        if(isset($setting['enb_product_ids']) && $setting['enb_product_ids']){

                            $enb_product_ids_ids = explode(',', $setting['enb_product_ids']);

                            foreach ($enb_product_ids_ids as $enb_product_ids_id) {

                                $enb_product_ids_id = trim((int)$enb_product_ids_id);

                                $enb_product_ids[$enb_product_ids_id] = $enb_product_ids_id;

                            }

                        }

                        if(isset($dis_product_ids[$product['product_id']])){

                            $set = array();

                        }

                        if($enb_product_ids && !isset($enb_product_ids[$product['product_id']])){

                            $set = array();

                        }

                        if($set){
                            
                            if(isset($setting['add_ordering_to_category']) && $setting['add_ordering_to_category']){
                                
                                $add_settings['add_ordering_to_category'] = $setting['add_ordering_to_category'];
                                
                            }
                            
                            if(isset($setting['add_url_to_category']) && $setting['add_url_to_category']){
                                
                                $add_settings['add_url_to_category'] = $setting['add_url_to_category'];
                                
                            }
                            
                            $result['offers'][$product['product_id']] = $product;
                            //добавлемя набор параметров по категории, если нет - нулевой шаблон
                            $result['offers'][$product['product_id']]['setting_id'] = $set;
                            $result['offers'][$product['product_id']]['ym_attributes'] = $this->getProductAttributes($product['product_id'], $ym_attributes,$content_language_id);
                            $result['offers'][$product['product_id']]['all_attributes'] = $this->getProductAttributes($product['product_id'],array(),$content_language_id);
                            $result['offers'][$product['product_id']]['ym_options'] = $this->getProductOptions($product['product_id'], $ym_options,$content_language_id);
                            $result['offers'][$product['product_id']]['all_options'] = $this->getProductOptions($product['product_id'],array(),$content_language_id);
                            $result['offers'][$product['product_id']]['images'] = $this->getProductImages($product['product_id']);
                            $result['offers'][$product['product_id']]['rec'] = $this->getProductRelated($product['product_id']);
                            $result['offers'][$product['product_id']]['product_to_category'] = $this->getProductCategories($product['product_id']);
                            $result['offers'][$product['product_id']]['option_url_param'] = '';
                            $result['offers'][$product['product_id']]['product_id_by_option_id'] = '';
                            $product_spec_or_disc_prices = $this->getSpecialAndDiscontPrices($product['product_id']);
                            $result['offers'][$product['product_id']]['discount_special_price'] = $product_spec_or_disc_prices['discount_special_price'];
                            $result['offers'][$product['product_id']]['special_price'] = $product_spec_or_disc_prices['special_price'];

                            if($delivery_option_by_manufacturer && isset( $delivery_option_by_manufacturer[$product['manufacturer_id']] )){
                                
                                $result['offers'][$product['product_id']]['delivery_option_by_manufacturer'] = $this->getDeliveryOptionByManufacturer($delivery_option_by_manufacturer[$product['manufacturer_id']],$product);
                                
                            }
			    
			    $set_setting_id = 0;
			    
			    if(isset($setting['setting_id'])){
				
				$set_setting_id = $setting['setting_id'];
				
			    }

                            $result['offers'][$product['product_id']]['settings_id'] = $set_setting_id;

			    $result['settings'][$set_setting_id] = $setting;

                            $market_category = '';

                            if(isset($setting['market_category'])){

                                $market_category = trim($setting['market_category']);

                            }

                            if(!$market_category && isset($ym_categories_whis_categories[$product['category_id']])){
                                $result['offers'][$product['product_id']]['market_category'] = $ym_categories_whis_categories[$product['category_id']];
                            }else{
                                $result['offers'][$product['product_id']]['market_category'] = $market_category;
                            }
                            
                            if(isset($setting['divide_by_options']) && $setting['divide_by_options']['option_value_sku']!=='' && $result['offers'][$product['product_id']]['all_options']){
                                
                                $divide_on_options_selected = $setting['divide_on_options_selected'];
                                
                                $all_option = $result['offers'][$product['product_id']]['all_options'];
                                
                                $option_value_sku = $setting['divide_by_options']['option_value_sku'];
                                
                                $sub_offers = array();
                                
                                foreach ($divide_on_options_selected as $num_sel_option => $option_selected) {
                                    
                                    if($option_selected){
                                        
                                        $option_id_this = 0;
                                            
                                        if(isset($setting['divide_on_options_option_id'.$num_sel_option]['field']['option_id']) && $setting['divide_on_options_option_id'.$num_sel_option]['field']['option_id']){

                                            $option_id_this = $setting['divide_on_options_option_id'.$num_sel_option]['field']['option_id'];

                                        }
                                        
                                        foreach ($all_option as $all_option_row) {
                                            
                                            foreach ($all_option_row['product_option_value'] as $product_option_value) {
                                                
                                                if(isset($product_option_value[$option_value_sku]) && $option_id_this==$all_option_row['option_id']){
                                                    
                                                    $on_option_prefix = 'OPTION'.$num_sel_option;
                                                    
                                                    $option_value_id_this = $product_option_value['option_value_id'];

                                                    if(isset($setting['divide_on_options_prefix'][$num_sel_option]) && $setting['divide_on_options_prefix'][$num_sel_option]!==''){

                                                        $on_option_prefix = $setting['divide_on_options_prefix'][$num_sel_option];

                                                    }
                                                    
                                                    $new_offer_key = $product['product_id'].'__'.$product_option_value[$option_value_sku];
                                                    
                                                    if(!isset($sub_offers[$new_offer_key])){
                                                        
                                                        $sub_offers[$new_offer_key]['product'] = $result['offers'][$product['product_id']];
                                                        
                                                    }
                                                    
                                                    if(!isset($sub_offers[$new_offer_key]['options'][$option_value_id_this])){
                                                        
                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['price'] = '';
                                                        
                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['quantity'] = '';
                                                        
                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['option_url_param'] = '';
                                                        
                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['option_add_model_name'] = '';
                                                        
                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['divide_on_option_add_to_name'] = '';
                                                        
                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['product_id_by_option_id'] = '';
                                                        
                                                    }
                                                    
                                                    
                                                    if(isset($product_option_value['price']) && isset($product_option_value['price_prefix']) && $product_option_value['price_prefix']=='+'){

                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['price'] = $product_option_value['price'];

                                                    }elseif (isset($product_option_value['price']) && isset($product_option_value['price_prefix']) && $product_option_value['price_prefix']=='-') {

                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['price'] = (0-$product_option_value['price']);

                                                        if($sub_offers[$new_offer_key]['options'][$option_value_id_this]['price']<0){

                                                            $sub_offers[$new_offer_key]['options'][$option_value_id_this]['price'] = 0.0;

                                                        }

                                                    }elseif (isset($product_option_value['price']) && isset($product_option_value['price_prefix']) && $product_option_value['price_prefix']=='=') {

                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['price'] = $product_option_value['price'];

                                                    }
                                                    
                                                    $sub_offers[$new_offer_key]['options'][$option_value_id_this]['option_url_param'] = '&option_id[]='.$product_option_value['product_option_value_id'];

                                                    if(isset($setting['divide_on_options_add_to_model'][$num_sel_option]) && $setting['divide_on_options_add_to_model'][$num_sel_option]){

                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['option_add_model_name'] = $product_option_value['name'];

                                                    }
                                                    
                                                    if(isset($setting['divide_on_options_add_to_name'][$num_sel_option]) && $setting['divide_on_options_add_to_name'][$num_sel_option]){

                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['divide_on_option_add_to_name'] = $product_option_value['name'];
                                                        
                                                    }

                                                    $sub_offers[$new_offer_key]['options'][$option_value_id_this]['product_id_by_option_id'] = $on_option_prefix.$product_option_value['product_option_value_id'];

                                                    $sub_offers[$new_offer_key]['product']['group_id'] = $product['product_id'].'-'.$product_option_value[$option_value_sku];

                                                    if(isset($setting['divide_on_options_available_by_option_quantity'][$num_sel_option]) && $setting['divide_on_options_available_by_option_quantity'][$num_sel_option]){

                                                        $sub_offers[$new_offer_key]['options'][$option_value_id_this]['quantity'] = $product_option_value['quantity'];

                                                    }

                                                    foreach ($sub_offers[$new_offer_key]['product']['all_options'] as $key => $all_option_row3) {

                                                        if($all_option_row3['option_id']==$option_id_this && isset($sub_offers[$new_offer_key]['product']['all_options']) && isset($sub_offers[$new_offer_key]['product']['all_options'][$key])){

                                                            unset($sub_offers[$new_offer_key]['product']['all_options'][$key]);

                                                        }
                                                        
                                                        if($all_option_row3['option_id']==$option_id_this && isset($sub_offers[$new_offer_key]['product']['ym_options']) && isset($sub_offers[$new_offer_key]['product']['ym_options'][$key])){

                                                            unset($sub_offers[$new_offer_key]['product']['ym_options'][$key]);

                                                        }

                                                    }
                                                    
                                                }
                                                
                                            }
                                            
                                        }
                                        
                                    }
                                    
                                }
                                
                                $sub_offers_result = array();
                                
                                foreach ($sub_offers as $new_offer_key => $sub_offer) {
                                    
                                    $sub_offer_result_product = $sub_offer['product'];
                                    
                                    $sub_offers_result[$new_offer_key] = $sub_offer_result_product;
                                    
                                    foreach ($sub_offer['options'] as $sub_offer_option) {
                                        
                                        if(!isset($sub_offers_result[$new_offer_key]['option_add_model_name'])){
                                            
                                            $sub_offers_result[$new_offer_key]['option_url_param'] = '';
                                            
                                            $sub_offers_result[$new_offer_key]['option_add_model_name'] = '';
                                            
                                            $sub_offers_result[$new_offer_key]['divide_on_option_add_to_name'] = '';
                                            
                                            $sub_offers_result[$new_offer_key]['product_id_by_option_id'] = $sub_offer_result_product['product_id'];
                                            
                                        }
                                        
                                        $sub_offers_result[$new_offer_key]['price'] += $sub_offer_option['price'];
                                        
                                        $sub_offers_result[$new_offer_key]['quantity'] += $sub_offer_option['quantity'];
                                        
                                        $sub_offers_result[$new_offer_key]['option_url_param'] .= $sub_offer_option['option_url_param'];
                                        
                                        if($sub_offer_option['option_add_model_name']){
                                            
                                            $sub_offers_result[$new_offer_key]['option_add_model_name'] .= ' '.$sub_offer_option['option_add_model_name'];
                                            
                                        }
                                        
                                        if($sub_offer_option['divide_on_option_add_to_name']){
                                            
                                            $sub_offers_result[$new_offer_key]['divide_on_option_add_to_name'] .= ' '.$sub_offer_option['divide_on_option_add_to_name'];
                                            
                                        }
                                        
                                        $sub_offers_result[$new_offer_key]['product_id_by_option_id'] .= '_'.$sub_offer_option['product_id_by_option_id'];
                                        
                                    }
                                    
                                }
                                
                                if($sub_offers_result){
                                    
                                    unset($result['offers'][$product['product_id']]);
                                    
                                    $result['offers'] = array_merge($result['offers'],$sub_offers_result);
                                    
                                }
                                
                            }
                            

                            if(isset($setting['divide_on_option']) && $setting['divide_on_option'] && isset($result['offers'][$product['product_id']]['all_options']) && $result['offers'][$product['product_id']]['all_options']){

                                $option_id = 0;
                                if(isset($setting['divide_on_option_option_id']['field']['status']) && $setting['divide_on_option_option_id']['field']['status']){
                                    $option_id = $setting['divide_on_option_option_id']['field']['option_id'];
                                }

                                $all_option = $result['offers'][$product['product_id']]['all_options'];

                                if($option_id){
                                    foreach ($all_option as $key => $option) {

                                        if($option['option_id']!=$option_id){

                                            unset($all_option[$key]);

                                        }

                                    }
                                }
                                if($all_option){

                                    $on_option_prefix = 'OPTION';

                                    if(isset($setting['divide_on_option_prefix'])){

                                        $setting['divide_on_option_prefix'] = trim($setting['divide_on_option_prefix']);

                                        if($setting['divide_on_option_prefix']){

                                            $on_option_prefix = $setting['divide_on_option_prefix'];

                                        }

                                    }

                                    foreach ($all_option as $key => $option) {

                                        foreach ($option['product_option_value'] as $product_option_value) {

                                            $option_value_id_this = $product_option_value['option_value_id'];

                                            $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']] = $result['offers'][$product['product_id']];

                                            if(isset($product_option_value['price']) && isset($product_option_value['price_prefix']) && $product_option_value['price_prefix']=='+'){

                                                $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['price'] += $product_option_value['price'];

                                            }elseif (isset($product_option_value['price']) && isset($product_option_value['price_prefix']) && $product_option_value['price_prefix']=='-') {

                                                $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['price'] -= $product_option_value['price'];

                                                if($result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['price']<0){

                                                    $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['price'] = 0.0;

                                                }

                                            }elseif (isset($product_option_value['price']) && isset($product_option_value['price_prefix']) && $product_option_value['price_prefix']=='=') {

                                                $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['price'] = $product_option_value['price'];

                                            }

                                            $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['option_url_param'] = '&option_id='.$product_option_value['product_option_value_id'];

                                            $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['option_add_model_name'] = $product_option_value['name'];

                                            $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['product_id_by_option_id'] = $product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id'];

                                            $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['group_id'] = $product['product_id'];

                                            if(isset($setting['divide_on_option_available_by_option_quantity']) && $setting['divide_on_option_available_by_option_quantity']){

                                                $result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['quantity'] = $product_option_value['quantity'];

                                            }

                                            foreach ($result['offers'][$product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id']]['all_options'] as $key => $all_option_row) {

                                                if($all_option_row['option_id']==$option_id){
                                                    
                                                    if(isset($result['offers'][ $product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id'] ]['all_options'][$key])){
                                                        
                                                        foreach ($result['offers'][ $product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id'] ]['all_options'][$key]['product_option_value'] as $key2 => $all_option_row2) {

                                                            if($all_option_row2['option_value_id']!=$option_value_id_this){

                                                                unset($result['offers'][ $product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id'] ]['all_options'][$key]['product_option_value'][$key2]);

                                                            }
                                                        }
                                                        
                                                    }
                                                    
                                                    if(isset($result['offers'][ $product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id'] ]['ym_options'][$key])){
                                                        
                                                        foreach ($result['offers'][ $product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id'] ]['ym_options'][$key]['product_option_value'] as $key2 => $all_option_row2) {
                                                            
                                                            if($all_option_row2['option_value_id']!=$option_value_id_this){

                                                                unset($result['offers'][ $product['product_id'].$on_option_prefix.$product_option_value['product_option_value_id'] ]['ym_options'][$key]['product_option_value'][$key2]);

                                                            }
                                                        }
                                                        
                                                    }

                                                }

                                            }

                                        }

                                    }

                                    unset($result['offers'][$product['product_id']]);

                                }

                            }

                        }

                        unset($products_filtered[$i_product]);

                        if($memory_get_usage >= $memory_limit && $cache_status){

                            $this->writeCache($cache_file_name.'_'.count($result['cache']).'.txt', $result['offers']);

                            $result['cache'][$cache_file_name.'_'.count($result['cache']).'.txt'] = $cache_file_name.'_'.count($result['cache']).'.txt';

                            $result['offers'] = array();

                        }

                    }

                }

            }
        
            if($cache_status){

                $this->writeCache($cache_file_name.'_'.count($result['cache']).'.txt', $result['offers']);

                $result['cache'][$cache_file_name.'_'.count($result['cache']).'.txt'] = $cache_file_name.'_'.count($result['cache']).'.txt';

                $result['offers'] = array();

            }
            
        }
        
        //Если товары есть, соберем данные про категории
        if($result['offers'] || $result['cache']){
            $sql = "SELECT cd.name, c.sort_order, c.category_id, c.parent_id FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE cd.language_id = '" . (int)$content_language_id . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'  AND c.status = '1' AND c.sort_order <> '-1'";
            $query = $this->db->query($sql);
            $result['categories'] = $query->rows;
        }
        
        $result['add_settings'] = $add_settings;
        
        return $result;
    }
    
    public function getMappingMarketPlaceCategories($mapping_market_place_categories) {
	
	$result = array();
	
	$category = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "category WHERE category_id = ( SELECT max(category_id) FROM " . DB_PREFIX . "category ) ");
	
	$category_id_start = 0;
	
	if($category->row){
	    
	    $category_id_start = $category->row['category_id']+1;
	    
	}
	
	$new_category_ids = array();
	
	if($mapping_market_place_categories){
	    
	    foreach ($mapping_market_place_categories as $site_category_id => $mapping_market_place_category) {
		
		$mapping_market_place_category = html_entity_decode($mapping_market_place_category);
		
		$mapping_market_place_category = $this->cleanExplode('|', $mapping_market_place_category);
		
		foreach ($mapping_market_place_category as $mapping_market_place_category_path) {
		    
		    $mapping_market_place_category_path = $this->cleanExplode('>',$mapping_market_place_category_path);
		    
		    $parent_id = 0;
		    
		    foreach ($mapping_market_place_category_path as $level => $category_name) {
			
			$category_md5 = md5($parent_id.'-'.$this->transliterate(preg_replace('/[^a-zA-Zа-яА-Я0-9]/ui', '',  mb_strtoupper($category_name) ))); 
			
			if(!isset($new_category_ids[$category_md5])){
			    
			    $category_id = $category_id_start;
			    
			    $new_category_ids[$category_md5] = $category_id;
			    
			    $category_id_start++;
			    
			}else{
			    
			    $category_id = $new_category_ids[$category_md5];
			    
			}
			
			if($category_id && $category_name!==''){
			    
			    $result[$category_id] = array(
				'category_id'=>$category_id,
				'parent_id'=>$parent_id,
				'name'=>$category_name,
				'sort_order'=>0,
				'site_category_id'=>$site_category_id
			    );
			    
			    $parent_id = $category_id;
			    
			}
			
		    }
		    
		}
		
	    }
	    
	}
	
	return $result;
	
    }
    
    public function transliterate($textcyr) {
	$cyr = array(
	'ж',  'ч',  'щ',   'ш',  'ю',  'а', 'б', 'в', 'г', 'д', 'е', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ъ', 'ь', 'я',
	'Ж',  'Ч',  'Щ',   'Ш',  'Ю',  'А', 'Б', 'В', 'Г', 'Д', 'Е', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ъ', 'Ь', 'Я');
	$lat = array(
	'zh', 'ch', 'sht', 'sh', 'yu', 'a', 'b', 'v', 'g', 'd', 'e', 'z', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'y', 'x', 'q',
	'Zh', 'Ch', 'Sht', 'Sh', 'Yu', 'A', 'B', 'V', 'G', 'D', 'E', 'Z', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'c', 'Y', 'X', 'Q');
	return mb_strtoupper(str_replace($cyr, $lat, $textcyr));
    }
    
    public function cleanExplode($delimiter,$string) {
	
	$explode = explode($delimiter, $string);
	
	foreach ($explode as $key => $value) {
	    
	    $value = trim($value);
	    
	    if($value===''){
		
		unset($explode[$key]);
		
	    }else{
		
		$explode[$key] = $value;
		
	    }
	    
	}
	
	if(!$explode){
	    
	    $explode = array();
	    
	}
	
	return $explode;
	
    }
    
    public function getPromoGift($promos_id=NULL) {
        
        $sql = "SELECT * FROM `" .   DB_PREFIX   . 'ocext_feed_generator_yamarket_promo_gift` ';
        
        $where = array();
	
	$where[] = " status = 1 ";
	
	if(!is_null($promos_id)){
	    
	    $where[] = " promos_id = ".$promos_id." ";
	    
	}
        
        if($where){
            $sql .= 'WHERE '.implode(' AND ', $where);
        }
        
        $result = $this->db->query($sql);
	
	if($result->row){
	    
	    $result = json_decode($result->row['promos'],TRUE);
	    
	}else{
	    
	    $result = array();
	    
	}
        
        return $result;
        
    }
    
    public function getDeliveryOptionByManufacturer($delivery_option_by_manufacturer,$product) {
        
        $weight = (float)$product['weight'];
        
        $result = array();
        
        foreach ($delivery_option_by_manufacturer as $rule) {
            
            if($rule['w_from'] !== '' && $weight > $rule['w_from'] && ($rule['w_to']==='' ||  $weight <=  $rule['w_to']) ){
                
                $result = array(
                    'cost' => $rule['cost'],
                    'days' => $rule['days'],
                );
                
            }
            
        }
        
        return $result;
        
    }
    
    public function writeCache($filename,$array,$string='') {
        
        $handle = fopen(DIR_CACHE. $filename, 'w+');
        
        if(!$handle){
            
            $log_errors = new ControllerFeedOcextFeedGeneratorYaMarket($this->registry);
            
            $log_errors->setLogErrors('cache write error to file: '.DIR_CACHE. $filename);
            
        }
        
        if($string){
            fwrite($handle, $string);
        }else{
            fwrite($handle, json_encode($array));
        }
        
        fclose($handle);
        
    }
    
    public function unlinkAllCache($cache_files) {

        $files = scandir(DIR_CACHE);

        foreach($files as $file_name){

            foreach($cache_files as $cache_file){

                if(strstr($file_name, $cache_file)){

                    unlink(DIR_CACHE.$file_name);

                }

            }

        }

    }
    
    
    public function getYmCategoriesFromDb($data=array('category_id'=>1,'status'=>0)) {
        $sql = "SELECT * FROM `" . DB_PREFIX . "ocext_feed_generator_yamarket_ym_categories` ";
        $where = array();
        if ($data['category_id']==1) {
            $where[] = " category_id != '0' ";
        }
        
        if (!empty($data['ym_category_last_child'])) {
            $where[] = " ym_category_last_child LIKE '" . $this->db->escape($data['ym_category_last_child']) . "%' ";
        }
        
        if ($data['status']!='') {
            $where[] = " status = '" . (int)$data['status'] . "' ";
        }
        
        if($where){
            $where = ' WHERE '.implode(' AND ', $where);
        }else{
            $where = '';
        }
        
        $sql .= $where;
        
        if (isset($data['start']) || isset($data['limit'])) {
            if ($data['start'] < 0) {
                    $data['start'] = 0;
            }
            if ($data['limit'] < 1) {
                    $data['limit'] = 20;
            }
            $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
        }
        $query = $this->db->query($sql);
        
        $result = array();
        if($query->rows){
            foreach ($query->rows as $ym_category) {
                $categories = json_decode($ym_category['category_id'],TRUE);
                if($categories){
                    foreach ($categories as $category_id) {
                        $result[$category_id] = $ym_category['ym_category_path'];
                    }
                }
            }
        }
        
        return $result;
    }
    
    public function getProductAttributes($product_id,$ym_attributes=array(),$content_language_id) {
        
            $attributes_sql = array();
            //Вычеркнуть атрибуты
            if($ym_attributes){
                foreach ($ym_attributes as $attribute) {
                    $attributes_parts = explode('___', $attribute);
                    //0 - группа, 1 - id атрибута
                    $attributes_sql[$attributes_parts[0]][$attributes_parts[1]] = $attributes_parts[1];
                }
                
            }
            $product_attribute_group_data = array();

            $product_attribute_group_query = $this->db->query("SELECT ag.attribute_group_id, agd.name FROM " . DB_PREFIX . "product_attribute pa LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id) LEFT JOIN " . DB_PREFIX . "attribute_group ag ON (a.attribute_group_id = ag.attribute_group_id) LEFT JOIN " . DB_PREFIX . "attribute_group_description agd ON (ag.attribute_group_id = agd.attribute_group_id) WHERE pa.product_id = '" . (int)$product_id . "' AND agd.language_id = '" . (int)$content_language_id . "' GROUP BY ag.attribute_group_id ORDER BY ag.sort_order, agd.name");

            
            foreach ($product_attribute_group_query->rows as $product_attribute_group) {
                    $product_attribute_data = array();

                    $product_attribute_query = $this->db->query("SELECT a.attribute_id, ad.name, pa.text FROM " . DB_PREFIX . "product_attribute pa LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id) LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id) WHERE pa.product_id = '" . (int)$product_id . "' AND a.attribute_group_id = '" . (int)$product_attribute_group['attribute_group_id'] . "' AND ad.language_id = '" . (int)$content_language_id . "' AND pa.language_id = '" . (int)$content_language_id . "' ORDER BY a.sort_order, ad.name");

                    foreach ($product_attribute_query->rows as $product_attribute) {
                        if(!isset($attributes_sql[$product_attribute_group['attribute_group_id']][$product_attribute['attribute_id']])){
                            
                            /*
                             * 
                            $product_attribute_data[] = array(
                                'attribute_id' => $product_attribute['attribute_id'],
                                'name'         => $product_attribute['name'],
                                'text'         => $product_attribute['text']
                            );
                             * 
                             */
                            
                            $unit = $this->getUnit($product_attribute['name']);
						
                            if($unit!==''){
                                    $product_attribute['name'] = trim(str_replace(array(', ('.$unit.')',',('.$unit.')','('.$unit.')',), '', $product_attribute['name']));
                                    $product_attribute_data[] = array(
                                            'attribute_id' => $product_attribute['attribute_id'],
                                            'name'         => $product_attribute['name'],
                                            'text'         => $product_attribute['text'],
                                            'unit'	=> $unit
                                    );

                            }else{

                                    $product_attribute_data[] = array(
                                        'attribute_id' => $product_attribute['attribute_id'],
                                        'name'         => $product_attribute['name'],
                                        'text'         => $product_attribute['text']
                                    );

                            }
                            
                        }
                    }
                    
                    $unit = $this->getUnit($product_attribute_group['name']);
                    
                    if($unit){
                        $product_attribute_group['name'] = trim(str_replace(array(', ('.$unit.')',',('.$unit.')','('.$unit.')',), '', $product_attribute_group['name']));
                    }

                    $product_attribute_group_data[] = array(
                            'attribute_group_id' => $product_attribute_group['attribute_group_id'],
                            'name'               => $product_attribute_group['name'],
                            'attribute'          => $product_attribute_data,
                            'unit'              => $unit
                    );
            }

            return $product_attribute_group_data;
    }
    
    public function getProductOptions($product_id,$ym_options=array(),$content_language_id) {
        
        
        $product_option_data = array();

        $product_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option po LEFT JOIN `" . DB_PREFIX . "option` o ON (po.option_id = o.option_id) LEFT JOIN " . DB_PREFIX . "option_description od ON (o.option_id = od.option_id) WHERE po.product_id = '" . (int)$product_id . "' AND od.language_id = '" . (int)$content_language_id . "' ORDER BY o.sort_order");

        foreach ($product_option_query->rows as $product_option) {
                $product_option_value_data = array();

                $product_option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id) LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE pov.product_id = '" . (int)$product_id . "' AND pov.product_option_id = '" . (int)$product_option['product_option_id'] . "' AND ovd.language_id = '" . (int)$content_language_id . "' ORDER BY ov.sort_order");

                foreach ($product_option_value_query->rows as $product_option_value) {
                    
                    $product_option_value_data_this = array();
                    
                    foreach ($product_option_value as $product_option_value_name => $product_option_value_value) {
                        $product_option_value_data_this[$product_option_value_name] = $product_option_value_value;
                    }
                    
                    $product_option_value_data[] = $product_option_value_data_this;
                    
                    /*
                        $product_option_value_data[] = array(
                                'product_option_value_id' => $product_option_value['product_option_value_id'],
                                'option_value_id'         => $product_option_value['option_value_id'],
                                'name'                    => $product_option_value['name'],
                                'image'                   => $product_option_value['image'],
                                'quantity'                => $product_option_value['quantity'],
                                'subtract'                => $product_option_value['subtract'],
                                'price'                   => $product_option_value['price'],
                                'price_prefix'            => $product_option_value['price_prefix'],
                                'weight'                  => $product_option_value['weight'],
                                'weight_prefix'           => $product_option_value['weight_prefix']
                        );
                        */
                }
                
                $unit = $this->getUnit($product_option['name']); 
                    
                if($unit){
                    $product_option['name'] = trim(str_replace(array(', ('.$unit.')',',('.$unit.')','('.$unit.')',), '', $product_option['name']));
                }
                
                if(!isset($ym_options[$product_option['option_id']])){
                    $product_option_data[] = array(
                        'product_option_id'    => $product_option['product_option_id'],
                        'product_option_value' => $product_option_value_data,
                        'option_id'            => $product_option['option_id'],
                        'name'                 => $product_option['name'],
                        'type'                 => $product_option['type'],
                        'value'                => $product_option['value'],
                        'required'             => $product_option['required'],
                        'unit' => $unit
                    );
                }
        }
        return $product_option_data;
}
    
public function getProductImages($product_id) {
        $sql = "SELECT * FROM `" . DB_PREFIX . "product_image` WHERE product_id = '".$product_id."' AND image != 'no-image.jpg' AND image != 'no-image.png' AND image != 'no_image.png' AND image != 'no_image.jpg' ORDER BY sort_order ASC ";
        $query = $this->db->query($sql);
        return $query->rows;
    }    
    
public function getProductRelated($product_id) {
            $product_related_data = array();

            $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_related WHERE product_id = '" . (int)$product_id . "'");

            foreach ($query->rows as $result) {
                    $product_related_data[] = $result['related_id'];
            }

            return $product_related_data;
    }

private function getUnit($string){
        $units_parts = explode(' (', $string);
        $unit = '';
        if($units_parts && is_array($units_parts)){
            foreach ($units_parts as $units_part) {
                $parts = explode(')', $units_part);
                if($parts && count($parts)>1){
                    $unit = $parts[0];
                }
            }
        }
        return $unit;
    }

    public function getCategories() {
            $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c  LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE  c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'  AND c.status = '1' AND c.sort_order <> '-1'");
            $categories = array();
            if($query->rows){
                foreach ($query->rows as $category){
                    $categories[ $category['cvategory_id'] ] = $category['cvategory_id'];
                }
            }
            return $categories;
    }
    
    public function getManufacturers() {
            $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "manufacturer m  LEFT JOIN " . DB_PREFIX . "manufacturer_to_store m2s ON (m.manufacturer_id = m2s.manufacturer_id) WHERE  m2s.store_id = '" . (int)$this->config->get('config_store_id') . "'  AND m.status = '1' AND m.sort_order <> '-1'");
            $manufacturers = array();
            if($query->rows){
                foreach ($query->rows as $manufacturer){
                    $manufacturers[ $manufacturer['manufacturer_id'] ] = $manufacturer['manufacturer_id'];
                }
            }
            return $manufacturers;
    }
    
    
    
    
    
    
    
    public function showTable($table='ocext_all_yml_export_filter_data') {
        
        $check = $query = $this->db->query('SHOW TABLES from `'.DB_DATABASE.'` like "'.DB_PREFIX.$table.'" ');
        if(!$check->num_rows){
            return FALSE;
        }else{
            return TRUE;
        }
        
    }
    
    
    
    
    
    public function getSpecialAndDiscontPrices($product_id) {
        
        $result = array('special_price'=>0,'discount_special_price'=>0);
        
        $sql = "SELECT * FROM `".DB_PREFIX."product_special` WHERE customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND date_start <= NOW() AND ( date_end = '0000-00-00' OR date_end >= NOW() ) AND product_id=".$product_id;
        
        $special_prices = $this->db->query($sql." ORDER BY priority ASC ");
        
        if($special_prices->row){
            $result['special_price'] = $special_prices->row['price'];
        }
        
        $sql = "SELECT * FROM `".DB_PREFIX."product_discount` WHERE customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND date_start <= NOW() AND ( date_end = '0000-00-00' OR date_end >= NOW() ) AND product_id=".$product_id;
        
        $discount_prices = $this->db->query($sql." AND quantity=1 ORDER BY priority ASC ");
        
        if($discount_prices->row){
            $result['discount_special_price'] = $discount_prices->row['price'];
        }
        
        return $result;
        
    }
    
    
	
}
?>

 

 

Пример выгрузки https://test.mebelmassive.ru/index.php?route=extension/feed/ocext_feed_generator_yamarket&token=64367

Изменено пользователем DenKuzmin
Ссылка на комментарий

Я насколько понял, цена там формируется в строке 885, но потом в контроллере переопределяется в oldprice, а в price идёт цена по акции. Как мне сделать, чтобы в price шла цена по акции + цена за опцию?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...