Your IP : 3.12.76.151
<?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>ООО &quot;РК-МОНТАЖ&quot;</name>
<company>ООО &quot;РК-МОНТАЖ&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;
}
}