Your IP : 3.145.199.93


Current Path : /home/bitrix/ext_www/home-comfort.in.ua/bitrix/modules/catalog/lib/ebay/
Upload File :
Current File : /home/bitrix/ext_www/home-comfort.in.ua/bitrix/modules/catalog/lib/ebay/exportoffer.php

<?php
namespace Bitrix\Catalog\Ebay;

use Bitrix\Main,
	Bitrix\Main\SystemException,
	Bitrix\Currency;

class ExportOffer implements \Iterator
{
	/*Constructor input vars*/
	protected $iBlockId;
	protected $xmlData;

	/*Counted by constructor vars*/
	protected $bAllSections;
	protected $arSections = array();
	protected $arIblock;
	protected $startPosition = null;
	protected $includeSubsections = true;
	protected $intMaxSectionID = 0;
	protected $arSectionIDs = array();

	/*Iterator vars*/
	protected $currentKey = 0;
	protected $currentRecord = array();

	/*other vars*/
	protected $cnt = 0;
	/** @var null|\CIBlockResult $dbItems */
	protected $dbItems = NULL;
	protected $catalogType;
	protected $onlyAvailableElements = false;	// export with flag "available"

	public function __construct($catalogType, $params)
	{
		if(!isset($params["IBLOCK_ID"]) || intval($params["IBLOCK_ID"]) <= 0)
			throw new SystemException("Incorrect iBlock ID  (".__CLASS__."::".__METHOD__.")");

		$this->catalogType = $catalogType;

		$this->iBlockId = $params["IBLOCK_ID"];
		$this->xmlData = $params["XML_DATA"];

		$this->arIblock = $this->getIblockProps($params["SETUP_SERVER_NAME"]);
		$this->arSections = $this->getSections($params["PRODUCT_GROUPS"]);
		if(isset($params["START_POSITION"]) && $params["START_POSITION"])
			$this->startPosition = $params["START_POSITION"];
		if(isset($params["INCLUDE_SUBSECTION"]))
			$this->includeSubsections = $params["INCLUDE_SUBSECTION"];

		$this->bAllSections = in_array(0, $this->arSections) ? true : false;
		$availGroups = $this->getAvailGroups();
		$this->intMaxSectionID = $this->getMaxSectionId($availGroups);
		$this->arSectionIDs = $this->getSectionIDs($availGroups);
	}

	/*Iterator methods*/

	/**
	 * Return the current element.
	 *
	 * @return array
	 */
	public function current()
	{
		return $this->currentRecord;
	}

	/**
	 * Return the key of the current element.
	 *
	 * @return int
	 */
	public function key()
	{
		return $this->currentKey;
	}

	/**
	 * Move forward to next element.
	 *
	 * @return void
	 */
	public function next()
	{
		$this->currentKey++;
		$this->currentRecord = $this->nextItem();
		$this->checkDiscountCache();
	}

	/**
	 * Rewind the Iterator to the first element.
	 *
	 * @return void
	 */
	public function rewind()
	{
		$this->currentKey = 0;
		$this->dbItems = $this->createDbResObject();
		$this->currentRecord = $this->nextItem();
		$this->cnt = 100;
		$this->checkDiscountCache();
	}

	/**
	 * Checks if current position is valid.
	 *
	 * @return bool
	 */
	public function valid ()
	{
		return is_array($this->currentRecord);
	}

	protected function createDbResObject()
	{
//		order need for limiting by ID
		$order = array("ID" => "ASC");
		$arSelect = array("ID", "LID", "IBLOCK_ID", "IBLOCK_SECTION_ID", "NAME", "PREVIEW_PICTURE", "PREVIEW_TEXT",
			"PREVIEW_TEXT_TYPE", "DETAIL_PICTURE", "LANG_DIR", "DETAIL_PAGE_URL", "DETAIL_TEXT");

		$filter = array("IBLOCK_ID" => $this->iBlockId);

//		if set start position - limit result by ID
		if($this->startPosition)
			$filter[">=ID"] = $this->startPosition;

		if (!$this->bAllSections && !empty($this->arSections))
		{
			$filter["INCLUDE_SUBSECTIONS"] = $this->includeSubsections ? "Y" : "N";
			$filter["SECTION_ID"] = $this->arSections;
		}
		
		if($this->onlyAvailableElements)
			$filter["CATALOG_AVAILABLE"] = "Y";
		$filter["ACTIVE"] = "Y";
		$filter["SECTION_GLOBAL_ACTIVE"] = "Y";
		$filter["ACTIVE_DATE"] = "Y";

		return \CIBlockElement::GetList($order, $filter, false, false, $arSelect);
	}

	protected function getMaxSectionId(array $arAvailGroups)
	{
		$result = 0;

		foreach($arAvailGroups as $group)
			if ($result < $group["ID"])
				$result = $group["ID"];

		$result += 100000000;

		return $result;
	}

	protected function getAvailGroups()
	{
		$arAvailGroups = array();

		if (!$this->bAllSections)
		{
			for ($i = 0, $intSectionsCount = count($this->arSections); $i < $intSectionsCount; $i++)
			{
				$db_res = \CIBlockSection::GetNavChain($this->iBlockId, $this->arSections[$i]);
				$curLEFT_MARGIN = 0;
				$curRIGHT_MARGIN = 0;
				while ($ar_res = $db_res->Fetch())
				{
					$curLEFT_MARGIN = (int)$ar_res["LEFT_MARGIN"];
					$curRIGHT_MARGIN = (int)$ar_res["RIGHT_MARGIN"];
					$arAvailGroups[$ar_res["ID"]] = array(
						"ID" => (int)$ar_res["ID"],
						"IBLOCK_SECTION_ID" => (int)$ar_res["IBLOCK_SECTION_ID"],
						"NAME" => $ar_res["NAME"]
					);
				}

				$filter = array("IBLOCK_ID"=>$this->iBlockId, ">LEFT_MARGIN"=>$curLEFT_MARGIN, "<RIGHT_MARGIN"=>$curRIGHT_MARGIN, "ACTIVE"=>"Y", "IBLOCK_ACTIVE"=>"Y", "GLOBAL_ACTIVE"=>"Y");
				$db_res = \CIBlockSection::GetList(array("left_margin"=>"asc"), $filter);
				while ($ar_res = $db_res->Fetch())
				{
					$arAvailGroups[$ar_res["ID"]] = array(
						"ID" => (int)$ar_res["ID"],
						"IBLOCK_SECTION_ID" => (int)$ar_res["IBLOCK_SECTION_ID"],
						"NAME" => $ar_res["NAME"]
					);
				}
			}
		}
		else
		{
			$filter = array("IBLOCK_ID"=>$this->iBlockId, "ACTIVE"=>"Y", "IBLOCK_ACTIVE"=>"Y", "GLOBAL_ACTIVE"=>"Y");
			$db_res = \CIBlockSection::GetList(array("left_margin"=>"asc"), $filter);
			while ($ar_res = $db_res->Fetch())
			{
				$arAvailGroups[$ar_res["ID"]] = array(
					"ID" => (int)$ar_res["ID"],
					"IBLOCK_SECTION_ID" => (int)$ar_res["IBLOCK_SECTION_ID"],
					"NAME" => $ar_res["NAME"]
				);
			}
		}

		return $arAvailGroups;
	}

	protected function getSections($selectedGroups)
	{
		$arSections = array();

		if (is_array($selectedGroups))
		{
			foreach ($selectedGroups as $value)
			{
				$arSections[] = (int)$value;

				if ($value == 0)
					break;
			}
		}

		return $arSections;
	}

	protected function getIblockProps($serverName)
	{
		$dbIblock = \CIBlock::GetByID($this->iBlockId);
		$arIblock = $dbIblock->Fetch();

		if($arIblock)
		{
			if (strlen($serverName) <= 0)
			{
				if (strlen($arIblock['SERVER_NAME']) <= 0)
				{
					$b = "sort";
					$o = "asc";
					$rsSite = \CSite::GetList($b, $o, array("LID" => $arIblock["LID"]));
					if($arSite = $rsSite->Fetch())
						$arIblock["SERVER_NAME"] = $arSite["SERVER_NAME"];
					if(strlen($arIblock["SERVER_NAME"])<=0 && defined("SITE_SERVER_NAME"))
						$arIblock["SERVER_NAME"] = SITE_SERVER_NAME;
					if(strlen($arIblock["SERVER_NAME"])<=0)
						$arIblock["SERVER_NAME"] = \COption::GetOptionString("main", "server_name", "");
				}
			}
			else
			{
				$arIblock['SERVER_NAME'] = $serverName;
			}

			$arIblock['PROPERTY'] = array();

			$rsProps = \CIBlockProperty::GetList(
				array('SORT' => 'ASC', 'NAME' => 'ASC'),
				array('IBLOCK_ID' => $this->iBlockId, 'ACTIVE' => 'Y', 'CHECK_PERMISSIONS' => 'N')
			);
			while ($arProp = $rsProps->Fetch())
			{
				$arProp['ID'] = (int)$arProp['ID'];
				$arProp['USER_TYPE'] = (string)$arProp['USER_TYPE'];
				$arProp['CODE'] = (string)$arProp['CODE'];
				$arIblock['PROPERTY'][$arProp['ID']] = $arProp;
			}
		}

		return $arIblock;
	}

	protected function getQuantity($productId)
	{
		$result = 0;

		$rsProducts = \CCatalogProduct::GetList(
			array(),
			array('ID' => $productId),
			false,
			false,
			array('ID', 'QUANTITY', 'QUANTITY_TRACE', 'CAN_BUY_ZERO')
		);

		if ($arProduct = $rsProducts->Fetch())
		{
			$arProduct['QUANTITY'] = doubleval($arProduct['QUANTITY']);

			if (0 >= $arProduct['QUANTITY'] && ('Y' != $arProduct['QUANTITY_TRACE'] || 'N' != $arProduct['CAN_BUY_ZERO']))
				$result = 1;
			else
				$result = $arProduct['QUANTITY'];
		}

		return $result;
	}

	/**
	 * Return ruble currency code.
	 *
	 * @return string
	 */
	public static function getRub()
	{
		$currencyList = Currency\CurrencyManager::getCurrencyList();

		return (isset($currencyList['RUR']) ? 'RUR' : 'RUB');
	}
	
	/**
	 * Change setting "export only available elements".
	 *
	 * @param bool $flag
	 */
	public function setOnlyAvailableFlag($flag)
	{
		if($flag)
			$this->onlyAvailableElements = true;
		else
			$this->onlyAvailableElements = false;
	}

	protected function getPrices($productId, $siteId)
	{
		$minPrice = 0;
		$minPriceRUR = 0;
		$minPriceGroup = 0;
		$minPriceCurrency = "";

		$baseCurrency = Currency\CurrencyManager::getBaseCurrency();
		$RUR = $this->getRub();

		if ($this->xmlData['PRICE'] > 0)
		{
			$rsPrices = \CPrice::GetListEx(array(),array(
					'PRODUCT_ID' => $productId,
					'CATALOG_GROUP_ID' => $this->xmlData['PRICE'],
					'CAN_BUY' => 'Y',
					'GROUP_GROUP_ID' => array(2),
					'+<=QUANTITY_FROM' => 1,
					'+>=QUANTITY_TO' => 1,
				)
			);

			if ($arPrice = $rsPrices->Fetch())
			{
				if ($arOptimalPrice = \CCatalogProduct::GetOptimalPrice(
					$productId,
					1,
					array(2), // anonymous
					'N',
					array($arPrice),
					$siteId
				))
				{
					$minPrice = $arOptimalPrice['RESULT_PRICE']['DISCOUNT_PRICE'];
					$minPriceCurrency = $baseCurrency;
					$minPriceRUR = \CCurrencyRates::ConvertCurrency($minPrice, $baseCurrency, $RUR);
					$minPriceGroup = $arOptimalPrice['PRICE']['CATALOG_GROUP_ID'];
				}
			}
		}
		else
		{
			if ($arPrice = \CCatalogProduct::GetOptimalPrice(
				$productId,
				1,
				array(2), // anonymous
				'N',
				array(),
				$siteId
			))
			{
				$minPrice = $arPrice['RESULT_PRICE']['DISCOUNT_PRICE'];
				$minPriceCurrency = $baseCurrency;
				$minPriceRUR = \CCurrencyRates::ConvertCurrency($minPrice, $baseCurrency, $RUR);
				$minPriceGroup = $arPrice['PRICE']['CATALOG_GROUP_ID'];
			}
		}

		$result = array(
			"MIN" => $minPrice,
			"MIN_RUB" => $minPriceRUR,
			"MIN_GROUP" => $minPriceGroup,
			"MIN_CURRENCY" => $minPriceCurrency
		);

		return $result;
	}

	protected function getDetailPageUrl($detailPageUrl)
	{
		if (strlen($detailPageUrl) <= 0)
			$detailPageUrl = '/';
		else
			$detailPageUrl = str_replace(' ', '%20', $detailPageUrl);

		$result = "http://".$this->arIblock['SERVER_NAME'].Main\Text\HtmlFilter::encode($detailPageUrl);

		return $result;
	}

	protected function getPictureUrl($pictNo)
	{
		$strFile = "";

		if ($file = \CFile::GetFileArray($pictNo))
		{
			if(substr($file["SRC"], 0, 1) == "/")
				$strFile = "http://".$this->arIblock['SERVER_NAME'].implode("/", array_map("rawurlencode", explode("/", $file["SRC"])));
			elseif(preg_match("/^(http|https):\\/\\/(.*?)\\/(.*)\$/", $file["SRC"], $match))
				$strFile = "http://".$match[2].'/'.implode("/", array_map("rawurlencode", explode("/", $match[3])));
			else
				$strFile = $file["SRC"];
		}

		return $strFile;
	}

	protected function getParams($product, $arIblock)
	{
		if (isset($arIblock['PROPERTY']))
			$arProperties = $arIblock['PROPERTY'];
		else
			$arProperties = array();

		$arUserTypeFormat = array();

		foreach($arProperties as $key => $arProperty)
		{
			$arUserTypeFormat[$arProperty["ID"]] = false;
			if (strlen($arProperty["USER_TYPE"]))
			{
				$arUserType = \CIBlockProperty::GetUserType($arProperty["USER_TYPE"]);
				if (array_key_exists("GetPublicViewHTML", $arUserType))
				{
					$arUserTypeFormat[$arProperty["ID"]] = $arUserType["GetPublicViewHTML"];
					$arProperties[$key]['PROPERTY_TYPE'] = 'USER_TYPE';
				}
			}
		}

		$result = array();


		if (is_array($this->xmlData) && is_array($this->xmlData['XML_DATA']) && is_array($this->xmlData['XML_DATA']['PARAMS']))
		{
			foreach ($this->xmlData['XML_DATA']['PARAMS'] as $key => $propId)
			{
				if ($propId)
					$result[] = $this->getValue($product, 'PARAM_'.$key, $propId, $arProperties, $arUserTypeFormat);
			}
		}

		return $result;
	}

	protected function getValue($arOffer, $param, $PROPERTY, $arProperties, $arUserTypeFormat)
	{
		$result = array();

		$bParam = (strncmp($param, 'PARAM_', 6) == 0);

		if (isset($arProperties[$PROPERTY]) && !empty($arProperties[$PROPERTY]))
		{
			$PROPERTY_CODE = $arProperties[$PROPERTY]['CODE'];
			$arProperty = (
			isset($arOffer['PROPERTIES'][$PROPERTY_CODE])
				? $arOffer['PROPERTIES'][$PROPERTY_CODE]
				: $arOffer['PROPERTIES'][$PROPERTY]
			);

			$value = array();

			if(!is_array($arProperty["VALUE"]))
				$arProperty["VALUE"] = array($arProperty["VALUE"]);

			switch ($arProperties[$PROPERTY]['PROPERTY_TYPE'])
			{
				case 'USER_TYPE':
					foreach($arProperty["VALUE"] as $oneValue)
					{
						$value[] = call_user_func_array($arUserTypeFormat[$PROPERTY],
							array(
								$arProperty,
								array("VALUE" => $oneValue),
								array('MODE' => 'SIMPLE_TEXT'),
							));
					}
					break;

				case 'E':
					$arCheckValue = array();

					foreach ($arProperty['VALUE'] as &$intValue)
					{
						$intValue = (int)$intValue;
						if (0 < $intValue)
							$arCheckValue[] = $intValue;
					}

					if (isset($intValue))
						unset($intValue);

					if (!empty($arCheckValue))
					{
						$dbRes = \CIBlockElement::GetList(array(), array('IBLOCK_ID' => $arProperties[$PROPERTY]['LINK_IBLOCK_ID'], 'ID' => $arCheckValue), false, false, array('NAME'));
						while ($arRes = $dbRes->Fetch())
						{
							$value[] = $arRes['NAME'];
						}
					}
					break;

				case 'G':
					$arCheckValue = array();

					foreach ($arProperty['VALUE'] as &$intValue)
					{
						$intValue = (int)$intValue;
						if (0 < $intValue)
							$arCheckValue[] = $intValue;
					}

					if (isset($intValue))
						unset($intValue);

					if (!empty($arCheckValue))
					{
						$dbRes = \CIBlockSection::GetList(array(), array('IBLOCK_ID' => $arProperty['LINK_IBLOCK_ID'], 'ID' => $arCheckValue), false, array('NAME'));
						while ($arRes = $dbRes->Fetch())
						{
							$value[] = $arRes['NAME'];
						}
					}
					break;

				case 'L':
					$value .= $arProperty['VALUE'];
					break;

				case 'F':
					foreach ($arProperty['VALUE'] as &$intValue)
					{
						$intValue = (int)$intValue;
						if ($intValue > 0)
						{
							if ($ar_file = \CFile::GetFileArray($intValue))
							{
								if(substr($ar_file["SRC"], 0, 1) == "/")
									$strFile = "http://".$this->arIblock["SERVER_NAME"].implode("/", array_map("rawurlencode", explode("/", $ar_file["SRC"])));
								elseif(preg_match("/^(http|https):\\/\\/(.*?)\\/(.*)\$/", $ar_file["SRC"], $match))
									$strFile = "http://".$match[2].'/'.implode("/", array_map("rawurlencode", explode("/", $match[3])));
								else
									$strFile = $ar_file["SRC"];
								$value[] = $strFile;
							}
						}
					}

					if (isset($intValue))
						unset($intValue);
					break;

				default:
					$value = $arProperty['VALUE'];
			}

			if(is_array($value) && count($value) == 1)
				$value = implode("", $value);

			if ($bParam)
			{
				$result[$param] = array(
					"NAME" => $arProperties[$PROPERTY]['NAME'],
					"VALUES" => $value,
				);
			}
			else
			{
				$result[$param] = $value;
			}
		}

		return $result;
	}

	protected function getCategories($productId)
	{
		$boolCurrentSections = false;
		$result = array();

		$dbElementGroups = \CIBlockElement::GetElementGroups($productId, false, array('ID', 'ADDITIONAL_PROPERTY_ID'));

		while ($arElementGroup = $dbElementGroups->Fetch())
		{
			if (0 < (int)$arElementGroup['ADDITIONAL_PROPERTY_ID'])
				continue;

			$boolCurrentSections = true;

			if (in_array((int)$arElementGroup["ID"], $this->arSectionIDs))
				$result[] = $arElementGroup["ID"];
		}

		if (!$boolCurrentSections)
			$result[] = $this->intMaxSectionID;

		return $result;
	}

	protected function getSectionIDs(array $availGroups)
	{
		if (!empty($availGroups))
			$arSectionIDs = array_keys($availGroups);
		else
			$arSectionIDs = array();

		return $arSectionIDs;
	}

	protected function checkDiscountCache()
	{
		$this->cnt++;

		if (100 <= $this->cnt)
		{
			$this->cnt = 0;
			\CCatalogDiscount::ClearDiscountCache(array(
				'PRODUCT' => true,
				'SECTIONS' => true,
				'PROPERTIES' => true,
			));
		}
	}

	protected function nextItem()
	{
		if(!$obElement = $this->dbItems->GetNextElement())
			return false;

		$arItem = $obElement->GetFields();
		$arItem['PROPERTIES'] = $obElement->GetProperties();
		$arItem["QUANTITY"] = $this->getQuantity($arItem["ID"]);
		$arItem["PRICES"] = $this->getPrices($arItem["ID"], $this->arIblock['LID']);
		$arItem["CATEGORIES"] = $this->getCategories($arItem["ID"]);
		$arItem["DETAIL_PICTURE_URL"] = $this->getPictureUrl((int)$arItem["DETAIL_PICTURE"]);
		$arItem["PREVIEW_PICTURE_URL"] = $this->getPictureUrl((int)$arItem["PREVIEW_PICTURE"]);
		$arItem["PARAMS"] = $this->getParams($arItem, $this->arIblock);
		$arItem["DETAIL_PAGE_URL"] = $this->getDetailPageUrl($arItem["~DETAIL_PAGE_URL"]);

		return $arItem;
	}
}