ini_set("memory_limit","-1");
set_time_limit(0);
error_reporting(E_ALL);
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
global $USER;
if (!$USER->IsAdmin()) {
echo "Давай, до свидания!" . PHP_EOL;
}
function clog($text, $path = false)
{
if (!$path) {
$path = '%s/local/ver_offers.%d.log';
echo $path . "<br />";
while(true) {
$t++;
$exist = file_exists(sprintf($path, $_SERVER["DOCUMENT_ROOT"], $t));
if(!$exist){
$path = sprintf($path, $_SERVER["DOCUMENT_ROOT"], $t);
break;
}
}
}
echo $path . "<br />";
$fh = fopen($_SERVER["DOCUMENT_ROOT"] . $path, 'a');
if (!$fh) {
echo "не записал!<br />";
return false;
}
$to_file = date('Y-m-d H:i:s') . ' ';
$to_file .= $text . "\n";
fwrite($fh, $to_file);
fclose($fh);
}
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
$el = new CIBlockElement;
$arSelect = Array(
"ID", "IBLOCK_ID", "NAME", "ACTIVE", "PROPERTY_CML2_ARTICLE", "PROPERTY_MODEL", "PROPERTY_COLOR", "PROPERTY_SIZE", "CATALOG_GROUP_3"
);
$arFilter = Array("IBLOCK_ID" => 12, "!PROPERTY_CML2_ARTICLE" => false, "ACTIVE" => "Y");
$arOFilter = Array("IBLOCK_ID" => 13);
$res = CIBlockElement::GetList(Array("ID" => "DESC"), $arFilter, false, array("nTopCount" => 1), $arSelect);
$arOldID = $doubleOffers = $compareModels = array();
$cntProducts = 1;
while ($fields = $res->GetNext()) {
/* родительский элемент */
$pid = $fields["ID"];
if ($fields["PROPERTY_MODEL_VALUE"] != "") {
$resMod = CIBlockElement::GetList(
Array("show_counter" => "desc"), $arFilter, false, array("nTopCount" => 1), array("ID", "IBLOCK_ID")
);
if ($model = $resMod->GetNext()) {
//TODO: проверить, после распечатывания, есть ли в этом массиве что-нибудь, нужен ли этот блок.
if ($pid != $model["ID"]) {
$arOldID[] = $pid;
$pid = $model["ID"];
}
}
}
// проверяем, есть ли ТП, если нет, создаем
$arOFilter["PROPERTY_CML2_ARTICLE"] = $fields["PROPERTY_CML2_ARTICLE_VALUE"];
$resOffers = CIBlockElement::GetList(
Array("show_counter" => "DESC"), $arOFilter, false, false, array("ID", "IBLOCK_ID", "ACTIVE", "PROPERTY_CML2_ARTICLE")
);
$isFirst = true;
while ($fieldsOffers = $resOffers->GetNext()) {
if(!$isFirst)
$doubleOffers[] = $fieldsOffers["ID"];
$isFirst = false;
}
/* торговые предложения */
$arOffers = array();
$result["PRICES"] = CIBlockPriceTools::GetCatalogPrices(12, array("Розница"));
$arOffers = CIBlockPriceTools::GetOffersArray(
array("IBLOCK_ID" => 12),
array($fields["ID"]),
array(
"SORT" => "ASC",
"ID" => "DESC",
), // сортировка по полям
array("ID", "IBLOCK_ID", "PROPERTY_CML2_ARTICLE"), // поля для вывода
array(), // свойства для вывода
0, // кол-во торг. предложений
$result["PRICES"], // типы цен
true
);
foreach ($arOffers as $iOffer) {
$article = $iOffer["PROPERTY_CML2_ARTICLE_VALUE"];
if(!$article){
CIBlockElement::SetPropertyValuesEx($iOffer["ID"], 13, array(121 => NULL));
continue;
}
$resModels = CIBlockElement::GetList(
Array("show_counter" => "DESC"),
array("IBLOCK_ID" => 12, "PROPERTY_CML2_ARTICLE" => $article),
false,
array("nTopCount" => 1),
array("ID", "IBLOCK_ID", "PROPERTY_CML2_ARTICLE", "PROPERTY_MODEL")
);
if($elem = $resModels->GetNext()){
$m = trim($elem["PROPERTY_MODEL_VALUE"]);
if(!empty($m)){
if($m != $fields["PROPERTY_MODEL_VALUE"]) {
CIBlockElement::SetPropertyValuesEx($iOffer["ID"], 13, array(121 => $elem["ID"]));
$compareModels[$fields["ID"]][] = $m;
}
} else {
// модель пустая, надо пересохранить ТП
CIBlockElement::SetPropertyValuesEx($iOffer["ID"], 13, array(121 => $elem["ID"]));
}
}
}
// создание ТП, если его нет
if($isFirst && count($arOffers) <= 0) {
$arLoadProductArray = Array(
"MODIFIED_BY" => $USER->GetID(), // элемент изменен текущим пользователем
"IBLOCK_SECTION_ID" => false, // элемент лежит в корне раздела
"IBLOCK_ID" => 13,
"PROPERTY_VALUES" => array(
"CML2_ARTICLE" => $fields["PROPERTY_CML2_ARTICLE_VALUE"],
"CML2_LINK" => $pid,
"CML2_SIZE" => $fields["PROPERTY_SIZE_VALUE"],
"CML2_COLOR" => $fields["PROPERTY_COLOR_VALUE"],
),
"NAME" => $fields["NAME"],
"ACTIVE" => "Y", // активен
);
if($PRODUCT_ID = $el->Add($arLoadProductArray)){
$cnt++;
$IsProduct=CCatalogProduct::GetByID($PRODUCT_ID);
if (!$IsProduct)
{
CCatalogProduct::Add(Array('ID'=>$PRODUCT_ID, "QUANTITY" => $fields["CATALOG_QUANTITY"]));
}
CPrice::Add(
array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => 3,
"PRICE" => $fields["CATALOG_PRICE_3"],
"CURRENCY" => "RUB"
)
);
}
}
if($cntProducts%10 == 0)
clog("товаров просканировано: " . $cntProducts );
// количество товаров
$cntProducts++;
}
if($cntProducts)
clog( "Всего товаров пройдено: " . ($cntProducts-1) );
if($cnt)
clog("кол-во созданных ТП: " . $cnt);
if(!empty($arOldID))
clog("товары с несоответствием в сортировке и активности: " . json_encode($arOldID));
if($doubleOffers)
clog("тп-дубли: " . json_encode($doubleOffers));
if($compareModels)
clog("НЕСООТВЕТСТВУЮЩИЕ МОДЕЛИ: " . json_encode($compareModels));