示例#1
0
IncludeModuleLangFile(__FILE__);
IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/options.php");
CJSCore::Init(array("jquery"));

$APPLICATION->SetAdditionalCSS("/bitrix/js/pr.recrm/jquery-ui/jquery-ui.min.css");
$APPLICATION->AddHeadScript('/bitrix/js/pr.recrm/jquery-ui/jquery-ui.min.js');
$APPLICATION->AddHeadScript('/bitrix/js/pr.recrm/pr.recrm.js');

$RECRM 			= new prReCrmData;
$LAST_UPD 		= $RECRM->getLastUpdate();
$SELECT_T 		= $RECRM->getSelectTypes();
$SELECT_IB 		= $RECRM->getIB(true);
$CHECK_IB 		= $RECRM->checkIB();
$CHECK_KEY 		= $RECRM->checkKey();
$GET_KEY 		= $RECRM->getKey();
$TYPES 			= prReCrmProps::getTypes('name');
$CUR_MOD_PAGE 	= $APPLICATION->GetCurPage().'?lang='.LANGUAGE_ID.'&mid='.urlencode($module_id);
$ACTION 		= htmlspecialcharsEx($_GET['action']);
$STATUS 		= false;
$wLocation 		= '';
$wTime 			= 3000;
$error 			= array();

$arWRK 			= array('0' => GetMessage('PR_RECRM_N'), '1' => GetMessage('PR_RECRM_Y'));

$arAllOptions [] = array("pr_recrm_key",		GetMessage("PR_RECRM_F_KEY"),			array("text"), 					GetMessage("PR_RECRM_F_KEY_NOTE"));
$arAllOptions [] = array("pr_recrm_s_step",		GetMessage("PR_RECRM_F_S_STEP"),		array("text"), 					GetMessage("PR_RECRM_F_S_STEP_NOTE"));
$arAllOptions [] = array("pr_recrm_img_w",		GetMessage("PR_RECRM_F_IMG_W"),			array("text"), 					GetMessage("PR_RECRM_F_IMG_W_NOTE"));
$arAllOptions [] = array("pr_recrm_img_h",		GetMessage("PR_RECRM_F_IMG_H"),			array("text"), 					GetMessage("PR_RECRM_F_IMG_H_NOTE"));
$arAllOptions [] = array("pr_recrm_img_wrk",	GetMessage("PR_RECRM_F_IMG_WRK"),		array("selectbox",$arWRK), 		GetMessage("PR_RECRM_F_IMG_WRK_NOTE"));
$arAllOptions [] = array("pr_recrm_types",		GetMessage("PR_RECRM_F_TYPES_SELECT"),	array("multiple", $TYPES), 		GetMessage("PR_RECRM_F_TYPES_SELECT_NOTE"));
	public function importIBEl($CRON = 0, $TYPES_ARR = array(), $START = 'N')
	{
		if($START == 'Y'):
			COption::SetOptionString(self::$module_id, 'pr_recrm_step', 0);
			COption::SetOptionString(self::$module_id, 'pr_recrm_start_upd', time());
		endif;
		
		CModule::IncludeModule("iblock");
		
		$STEP = $this->getStep();
		COption::SetOptionString(self::$module_id, 'pr_recrm_step', $STEP);
		
		if(!is_array($TYPES_ARR) AND $CRON === 'Y')
		{
			$TYPES_ARR = array();
			foreach($this->getSelectTypes() AS $T_V)
			{
				$TYPES_ARR [$T_V] = $T_V;
			}
		}
		
		$TYPES_G 	= is_array($TYPES_ARR) ? $TYPES_ARR : explode(',',$_GET['types']);
		$TYPES_G 	= array_filter($TYPES_G);
		$TYPES 		= $TYPES_G;
		
		//AddMessage2Log('Получены типы '.implode(', ',$TYPES_G));
		
		if(count($TYPES) == 0)
		{
			//AddMessage2Log('Выгрузка завершена');
			COption::SetOptionString(self::$module_id, 'pr_recrm_last_upd', time());
			COption::SetOptionString(self::$module_id, 'pr_recrm_start_upd', 0);
			COption::SetOptionString(self::$module_id, 'pr_recrm_step', '0');
			return true;
		}
		else
		{
			$TYPE 		= array_shift($TYPES);
			$arrIDs 	= $this->arrIDs($TYPE, $STEP);
			$el_import 	= $arrIDs['DEL'] + $arrIDs['NEW'] + $arrIDs['UPD'];
			$el_count 	= count($el_import);
			
			//AddMessage2Log('Начал выгружать '.$TYPE . ' количество ' . count($el_import));
			if($el_count == 0)
			{
				//AddMessage2Log('В типе '.$TYPE . ' больше нет объектов, вызываем метод выгрузки');
				COption::SetOptionString(self::$module_id, 'pr_recrm_step', '0');
				if($CRON === 'Y')
				{
					$this->importIBEl('Y', $TYPES);
				}
				else
				{
					return $this->importIBEl(0, $TYPES);
				}
			}
			else
			{
				$IBLOCK_ID 		= $this->getIBId($TYPE);
				$el_db 			= $this->getEliB($TYPE);
			}
			
			$StepTime = $this->getStepTime(); // Сколько шаг
			foreach($el_import AS $el_k)
			{
				if(intval($el_k) == 0) continue;
				
				/* Выход из цикла по времени */
				$LeftTime = time() - $this->getStartUpdate();
				if($CRON !== 'Y' AND $StepTime > 0 AND $LeftTime >= $StepTime) break;
				
				/* ID в Btrx */
				$elDbId = $el_db['id_btrx'][$el_k];
				
				if(in_array($el_k, $arrIDs['DEL'])):
					$el = new CIBlockElement;
					$el->Delete($elDbId);
					unset($arrIDs['DEL'][$el_k]);
					continue;
				endif;
				
				$el_title 			= '';
				$el_description 	= '';
				$PROP 				= array();
				
				/* Подробно о элемент из ReCrm */
				$get_json 			= $this->getJson($TYPE, array('id' => $el_k));
				$el_dA 				= $this->convertArrImport($TYPE, $get_json);
				$el_d				= $el_dA[$el_k];
				
				/* Заголовки */
				if(is_array($el_d['title']))
				{
					$el_title = $el_d['title']['value'];
					unset($el_d['title']);
				}
				elseif(is_array($el_d['name']))
				{
					$el_title = $el_d['name']['value'];
					unset($el_d['name']);
				}
				
				/* Описание */
				if(is_array($el_d['description'])):
					$el_description = nl2br(str_replace($this->getDescStr(), '', $el_d['description']['value']));
					unset($el_d['description']);
				endif;
				
				foreach($el_d AS $el_prop_k => $el_prop_v)
				{
					$PROP[$el_prop_k] = $this->dataChange($el_prop_k, $el_prop_v['value']);
				}
				
				/* Изображения */
				if($TYPE == 'agent')
				{
					$PROP['photo'] = $this->convertArrImport('agentphoto',$this->getJson('agentphoto', array('agent_id' => $el_k, 'width' => '500', 'height' => '500', 'crop' => '0')));
				}
				elseif($TYPE == 'estate')
				{
					$getCoverSize = $this->getCoverSize();
					$PROP['estatecoverphoto'] 	= $this->convertArrImport('estatecoverphoto',$this->getJson('estatecoverphoto', array('estate_id' => $el_k, 'width' => $getCoverSize['width'], 'height' => $getCoverSize['height'], 'crop' => '1', 'watermark' => $this->getWRK())));
					$PROP['estatephoto'] 		= $this->convertArrImport('estatephoto',$this->getJson('estatephoto', array('estate_id' => $el_k, 'width' => '800', 'height' => '600', 'crop' => '0', 'watermark' => $this->getWRK())));
					$PROP['estatephotolayout'] 	= $this->convertArrImport('estatephotolayout',$this->getJson('estatephotolayout', array('estate_id' => $el_k, 'width' => '800', 'height' => '600', 'crop' => '0', 'watermark' => $this->getWRK())));
					if($PROP['edit_date'] == '') 		$PROP['edit_date'] 		= $PROP['creation_date'];
					if($PROP['edit_datetime'] == '') 	$PROP['edit_datetime'] 	= $PROP['creation_datetime'];
				}
				
				/* Добавляем свойства которых нет */
				$this->checkIBProps($TYPE, $el_d);
				
				$el_code = CUtil::translit($el_title.'_'.$el_k, "ru" , array(
					"max_len" 				=> "100",
					"change_case" 			=> "L",
					"replace_space" 		=> "_",
					"replace_other" 		=> "_",
					"delete_repeat_replace" => "true",
					"use_google" 			=> "false",
				));
				
				$arEl = array(
					"MODIFIED_BY" 		=> $GLOBALS['USER']->GetID(),
					"IBLOCK_ID" 		=> $IBLOCK_ID,
					"NAME" 				=> $el_title,
					"CODE" 				=> $el_code,
					"DETAIL_TEXT" 		=> $el_description,
					"DETAIL_TEXT_TYPE" 	=> 'html',
				);
				
				$el = new CIBlockElement;
				
				if(in_array($el_k, $arrIDs['UPD']))
				{
					$cur_id = $el->Update($elDbId, $arEl);
					foreach($PROP AS $PROP_k => $PROP_v)
					{
						CIBlockElement::SetPropertyValues($elDbId, $IBLOCK_ID, $PROP_v, $PROP_k);
					}
					unset($arrIDs['UPD'][$el_k]);
				}
				
				if(in_array($el_k, $arrIDs['NEW']))
				{
					$arEl["PROPERTY_VALUES"] = $PROP;
					$cur_id = $el->Add($arEl);
					unset($arrIDs['NEW'][$el_k]);
				}
				
				$el_count--;
				
				//if($el->LAST_ERROR) AddMessage2Log('Ошибка на типе ' . $TYPE . ': ' . $el->LAST_ERROR);
			}
			
			//AddMessage2Log('Прошло сек '. $LeftTime . ' при времени шага '.$StepTime);
			//AddMessage2Log('Сброс цикла на типе '. $TYPE .' при количестве элементов '.$el_count);
			
			COption::SetOptionString(self::$module_id, 'pr_recrm_start_upd', time());
			$this->tmpDb($arrIDs);
			if($CRON === 'Y') $this->importIBEl('Y', $TYPES); // если крон - рекурсия
			return array(
				'MESS' 	=> GetMessage("PR_RECRM_STATUS_WHAT") . ': "'.prReCrmProps::getTypes('name', $TYPE).'", '.GetMessage("PR_RECRM_STATUS_COUNT").': '.$el_count.'.',
				'STEP' 	=> $STEP,
				'IBT' 	=> $TYPES_G,
			);
		}

	}