Your IP : 3.145.76.111


Current Path : /home/bitrix/ext_www/dev.ballu.in.ua/yml/
Upload File :
Current File : /home/bitrix/ext_www/dev.ballu.in.ua/yml/market.php

<?php
if( strpos($_SERVER["PHP_SELF"], "DEV") !== false || strpos($_SERVER["PWD"], "DEV") !== false || $_SERVER["SERVER_NAME"] == "dev.ballu.ru" )
	$_SERVER["DOCUMENT_ROOT"] = "/home/bitrix/DEV/dev.ballu.ru";
else
	$_SERVER["DOCUMENT_ROOT"] = "/home/bitrix/PUB/ballu.ru";

$_SERVER['SERVER_NAME'] = "www.ballu.ru";

include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

set_time_limit(3600);


//Константы, потом вынести в настройки
$CATALOG_IBLOCK_ID = COption::GetOptionInt( "rusklimat.exchange", 'RK_EXCHANGE_CATALOG_IBLOCK_ID');
$PROPS_IBLOCK_ID = COption::GetOptionInt( "rusklimat.exchange", 'RK_EXCHANGE_CATALOG_PROPERTIES_IBLOCK_ID');
$PROPS_GROUPER_IBLOCK_ID = COption::GetOptionInt( "rusklimat.exchange", 'RK_EXCHANGE_CATALOG_PROPS_GROUPER_IBLOCK_ID');
$GLOBUS_IBLOCK_ID = COption::GetOptionInt( "rusklimat.exchange", 'RK_EXCHANGE_MAIN_GLOBUS_IBLOCK_ID');
$STOCKS_IBLOCK_ID = COption::GetOptionInt( "rusklimat.exchange", 'RK_EXCHANGE_CATALOG_PICKUP_IBLOCK_ID');
$brand_prop_id = 52;
// МСК - жестко привязываем
$url_file = "/export/retail_rocket.xml";



$script_speed = microtime(true);

$fp = fopen($_SERVER['DOCUMENT_ROOT']."/tmp".$url_file, 'w');

if(!$fp)
{
	echo "Error";
	die();
}



/* Получаем свойства */
$arProperties = rkRetailMakeYml::getProperties($PROPS_GROUPER_IBLOCK_ID, $CATALOG_IBLOCK_ID, $PROPS_IBLOCK_ID); // св-ва
$arProds = rkRetailMakeYml::getProducts($CATALOG_IBLOCK_ID, $arProperties, $brand_prop_id); // товары


$yml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
		<yml_catalog date=\"" . date("Y-m-d H:i") . "\">
			<shop>
				<name>ООО &amp;quot;РК-МОНТАЖ&amp;quot;</name>
				<company>ООО &amp;quot;РК-МОНТАЖ&amp;quot;</company>
				<url>https://www.ballu.ru/</url>
				<currencies>
					<currency id=\"RUR\" rate=\"1\"/>
				</currencies>
				".rkRetailMakeYml::getXmlCategories($CATALOG_IBLOCK_ID)."
				";

fwrite($fp, $yml);

rkRetailMakeYml::getXmlOffers($arProds, $CATALOG_IBLOCK_ID, $arProperties, $brand_prop_id, $fp);


$yml = "	</shop>
			</yml_catalog>";

fwrite($fp, $yml);
fclose($fp);

//Записываем историю

//Копируем временный файл в постоянный и удаляем
copy($_SERVER['DOCUMENT_ROOT']."/tmp".$url_file, $_SERVER['DOCUMENT_ROOT'].$url_file);
unlink($_SERVER['DOCUMENT_ROOT']."/tmp".$url_file);


echo '<div><a href="'.$url_file.'">'.$url_file.'</a></div>';


printf('Скрипт выполнялся %.4F сек., кол-во товаров: '.rkRetailMakeYml::$cnt.'<br />', microtime(true) - $script_speed);


class rkRetailMakeYml
{
	static $cnt = 0;
	static $allowCategories = [];
	static $arCategories = [];
	static $allowOffers = [];
	static $arPropsIblock = [];
	static $arPriceSelect = [];
	static $PROD_IDS = []; // IDшники товаров


	public static function getProperties($PROPS_GROUPER_IBLOCK_ID, $CATALOG_IBLOCK_ID, $PROPS_IBLOCK_ID)
	{
		$result = [];

		$PROPS_GROUPS = getGroupProp();

		foreach ($PROPS_GROUPS as $prop_group)
		{
			if ($prop_group["SORT"] >= 10 && ($prop_group["SORT"] < 70))
			{
				$res = CIBlockElement::GetList(
					Array(),
					Array("IBLOCK_ID" => $PROPS_GROUPER_IBLOCK_ID, "ID" => $prop_group["ID"], "ACTIVE" => "Y"),
					false,
					false,
					Array("ID", "NAME", "PROPERTY_PROPS")
				);

				$arProps = array();

				while ($ob = $res->GetNextElement())
				{
					$arFields = $ob->GetFields();
					$arProps = $arFields["PROPERTY_PROPS_VALUE"];
				}

				foreach ($arProps as $p)
				{
					$properties = CIBlockProperty::GetList(Array("sort" => "asc", "name" => "asc"), Array("ACTIVE" => "Y", "IBLOCK_ID" => $CATALOG_IBLOCK_ID, "XML_ID" => $p));

					while ($prop_fields = $properties->GetNext())
					{
						if(!in_array(ToUpper($prop_fields['CODE']), ['PREDOPL_TOVAR_MSK']))
						{
							$result["PROPERTY_" . strtoupper($prop_fields['CODE'])] = array("CODE" => $prop_fields['CODE'], "NAME" => $prop_fields['NAME'], "HINT" => $prop_fields['HINT']);
						}
					}
				}
			}
		}

		// запишем массив свойст из инфоблока Свойства (чтобы потом сверять их с привязкой к разделу)
		$resProps = CIBlockElement::GetList([], ["IBLOCK_ID" => $PROPS_IBLOCK_ID], false, false, ["ID", "NAME", "CODE"]);
		while($obProps = $resProps->Fetch())
		{
			self::$arPropsIblock[$obProps['ID']] = $obProps;
		}

		return $result;
	}

	public static function getPropertyBrand($CATALOG_IBLOCK_ID, $brand_prop_id)
	{
		$result = [];

		if($brand_prop_id)
		{
			$properties = CIBlockProperty::GetList(
				Array("sort" => "asc", "name" => "asc"),
				Array("ACTIVE" => "Y", "IBLOCK_ID" => $CATALOG_IBLOCK_ID, "ID" => $brand_prop_id)
			);

			while ($prop_fields = $properties->GetNext())
			{
				$result["PROPERTY_" . strtoupper($prop_fields['CODE'])] = array("CODE" => $prop_fields['CODE'], "NAME " => $prop_fields['NAME'], "HINT " => $prop_fields['HINT']);
			}
		}

		return $result;
	}

	public static function getPropertyPictures($CATALOG_IBLOCK_ID)
	{
		$result = [];

		if($CATALOG_IBLOCK_ID)
		{
			for ($i = 1; $i < 11; $i++)
			{
				$properties = CIBlockProperty::GetList(Array("sort" => "asc", "name" => "asc"), Array("ACTIVE" => "Y", "IBLOCK_ID" => $CATALOG_IBLOCK_ID, "CODE" => "PICTURE" . $i . "_RU_NEW"));

				while ($prop_fields = $properties->GetNext())
				{
					$result["PROPERTY_" . strtoupper($prop_fields['CODE'])] = array("CODE" => $prop_fields['CODE'], "NAME " => $prop_fields['NAME'], "HINT " => $prop_fields['HINT']);
				}
			}
		}

		return $result;
	}

	public static function getXmlCategories($CATALOG_IBLOCK_ID)
	{
		$result = '';

		if($CATALOG_IBLOCK_ID)
		{
			$result = "<categories>\r\n";

			$db_list = CIBlockSection::GetList(
				[],
				Array('IBLOCK_ID' => $CATALOG_IBLOCK_ID, 'GLOBAL_ACTIVE' => 'Y'),
				false,
				['ID', 'NAME', 'IBLOCK_SECTION_ID', 'UF_PSEUDO_SECTION', 'UF_ORDER_PARAMETERS']
			);

			while ($ar_result = $db_list->GetNext())
			{
				if(!empty($ar_result['UF_PSEUDO_SECTION']))
				{
					$ar_result['UF_PSEUDO_SECTION'] = unserialize($ar_result['~UF_PSEUDO_SECTION']);

					if($ar_result['UF_PSEUDO_SECTION']['is_pseudosection'] == 'Y')
					{
						continue;
					}
				}

				self::$allowCategories[$ar_result['ID']] = $ar_result['ID'];
				self::$arCategories[$ar_result['ID']] = $ar_result;

				$result .= '<category id="'.$ar_result['ID'].'" parentId="'.$ar_result['IBLOCK_SECTION_ID'].'">'.htmlspecialchars($ar_result['NAME']).'</category>'."\r\n";
			}

			$result .= "</categories>";
		}

		return $result;
	}

	public static function getXmlOffers($arProds, $CATALOG_IBLOCK_ID, $arProperties, $brand_prop_id, $fp)
	{
		$result = '';

		fwrite($fp, '<offers>');

		$propertyBrand = rkRetailMakeYml::getPropertyBrand($CATALOG_IBLOCK_ID, $brand_prop_id);
		$propertyPictures = rkRetailMakeYml::getPropertyPictures($CATALOG_IBLOCK_ID);

		$arProperties = array_merge($arProperties, $propertyBrand, $propertyPictures);

		foreach ($arProds as $prod)
		{
			$Reviews = $curIdsProps = $offer = [];

			//if($prod["ID"] != 59821)
			//	continue;

			// Пропускаем только в случае если нет на складе + нет предзаказа + есть предоплата

			if(!in_array($prod["IBLOCK_SECTION_ID"], self::$allowCategories))
			{
				pre('break item ('.$prod.'), in pseusection '.$prod["IBLOCK_SECTION_ID"]);
				continue;
			}
			else
			{
				// ID свойств которые выводятся в разделе у товаров
				if(!empty(self::$arCategories[$prod["IBLOCK_SECTION_ID"]]["UF_ORDER_PARAMETERS"]))
					$curIdsProps = self::$arCategories[$prod["IBLOCK_SECTION_ID"]]["UF_ORDER_PARAMETERS"];
			}

			if(!empty($prod['PROPERTY_FILTER_00390_VALUE']))
			{
				self::$cnt++;

				$offer[] = '<offer id="'.$prod['ID'].'" available="false">';
				self::$allowOffers[$prod['ID']] = $prod['ID'];

				foreach ($prod["PROPERTY_IMPORT_BARCODES_VALUE"] as $barcode)
					$offer[] = '<barcode>'.$barcode.'</barcode>';


				$url = 'https://'.$_SERVER['SERVER_NAME'].'/product-'.$prod['CODE'].'/';

				$offer[] = '<url>'.$url.'</url>';
				$offer[] = '<price>0</price>';

				// склады
				foreach ($arStock as $stock)
				{
					$avail = ($arAvailable[$prod["ID"]][$stock["STORE"]["ID"]] > 0)?"true":"false";
					$price = $prod["CATALOG_PRICE_".$stock["PRICE"]["ID"]] ?? 0;
					$old_price = $prod["CATALOG_PRICE_".$stock["PRICE_NODISCOUNT"]["ID"]] ?? 0;

					$offer[] = '<stock id="' . $stock["ID"] . '">';
					$offer[] = '<available>' . $avail . '</available>';
					$offer[] = '<price>' . number_format($price, 0, ".", "") . '</price>';

					if($old_price > 0 && $old_price > $price)
						$offer[] = '<oldprice>' . $old_price . '</oldprice>';

					$offer[] = '<url>https://' . $_SERVER['SERVER_NAME'] . (!empty($stock["CITY"]['GEO_CITY_FOLDER']) ? "/" . $stock["CITY"]['GEO_CITY_FOLDER'] : "") . '/product-' . $prod['CODE'] . '/</url>';

					$offer[] = '</stock>';
				}


				$offer[] = '<categoryId>'.$prod["IBLOCK_SECTION_ID"].'</categoryId>';

				if (!empty($prod['PROPERTY_PICTURE1_RU_NEW_VALUE']))
				{
					// делаем ресайз
					$pictureId = $prod['PROPERTY_PICTURE1_RU_NEW_VALUE'];
					$pictureSrc =  CFile::ResizeImageGet($pictureId, ["width" => 400, "height" => 400], BX_RESIZE_IMAGE_EXACT)["src"];

					$offer[] = '<picture>https://'.$_SERVER['SERVER_NAME'].$pictureSrc.'</picture>';
					//Если картинка есть - выставляем флаг
				}
				else
				{
					$offer[] = '<picture>https://www.rusklimat.ru/local/templates/rusklimat/images/nophoto.png</picture>';
				}


				$offer[] = '<vendor>'.htmlspecialchars($prod['PROPERTY_FILTER_00390_VALUE']).'</vendor>';
				$offer[] = '<name>'.htmlspecialchars($prod['NAME']).'</name>';

				if(!empty($prod['PROPERTY_FILTER_00200_VALUE']))
					$offer[] = '<param name="Weight">'.htmlspecialchars($prod['PROPERTY_FILTER_00200_VALUE']).'</param>';

				// хар-ки
				if(!empty($curIdsProps))
				{
					foreach($curIdsProps as $idProp)
					{
						$code_prop = strtoupper(self::$arPropsIblock[$idProp]["CODE"]);
						$p = "PROPERTY_". $code_prop;

						if(!empty($prod[$p . "_VALUE"]))
						{
							$param = [
								'p_name' => htmlspecialchars($arProperties[$p]['NAME']),
								'p_hint' => htmlspecialchars($arProperties[$p]['HINT']),
								'p_value' => htmlspecialchars(
									(is_array($prod[$p . "_VALUE"]) ? implode(',', $prod[$p . "_VALUE"]) : $prod[$p . "_VALUE"])
								),
							];

							if(!empty($param['p_value']))
							{
								$offer[] = '<param name="' . $param['p_name'] . '" >' . $param['p_value'] . ($param['p_hint'] ? ' ' . $param['p_hint'] : '') . '</param>';
							}
						}
					}
				}
				// END: хар-ки

				// отзывы + рейтинг
				$Reviews = GetReviews($prod['ID']);
				if(!empty($Reviews))
				{
					$offer[] = '<param name="Rating">'.$Reviews['TOTAL_RATE'].'</param>';
					$offer[] = '<param name="Reviews">'.count($Reviews['REVIEWS']).'</param>';
				}
				// END: отзывы + рейтинг

				$offer[] = '</offer>';
			}

			$result .= implode("\r\n", $offer);

			if(!fmod(self::$cnt, 500))
			{
				fwrite($fp, $result);
				$result = '';
			}
		}

		fwrite($fp, $result);
		fwrite($fp, '</offers>');
	}

	// Получаем товары
	public static function getProducts($CATALOG_IBLOCK_ID, $arProperties, $brand_prop_id)
	{
		$arPropertiesCode = array_keys($arProperties);

		$propertyBrand = rkRetailMakeYml::getPropertyBrand($CATALOG_IBLOCK_ID, $brand_prop_id);
		$propertyPictures = rkRetailMakeYml::getPropertyPictures($CATALOG_IBLOCK_ID);

		$arFilter = Array(
			"IBLOCK_ID" => $CATALOG_IBLOCK_ID,
			"ACTIVE" => "Y",
		);

		$arFilter["!PROPERTY_PRICE_ON_REQUEST"] = 1; // #28339

		$arFilter[] = [
			'LOGIC' => 'OR',
			['=PROPERTY_IMPORT_NSI_ACTIVE' => 1],
			['=PROPERTY_IMPORT_NSI_ACTIVE' => false],
		];

		$arSelect = Array(
			"ID",
			"NAME",
			"CODE",
			"XML_ID",

			"IBLOCK_SECTION_ID",
			"PROPERTY_IS_BIG_SIZE",
			"PROPERTY_EXPORT_YML_CHECK",
			"PROPERTY_IMPORT_BARCODES",
		);

		$arSelect = array_merge($arSelect, $arPropertiesCode, array_keys($propertyBrand), array_keys($propertyPictures), self::$arPriceSelect);

		$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);

		while ($ob = $res->GetNextElement())
		{
			$arFields = $ob->GetFields();
			$out[$arFields["ID"]] = $arFields;
		}
		return $out;
	}
}