Алексей Сипаев, да, я вообще стараюсь в админке никогда не править php файлы. Была у меня как-то история, что из-за кодировке действительно сайт "умер". Ну, благо были бэкапы + сайт был на техническом домене.
У меня еще возник вопрос, лишь частично связанный с изначальной темой. В битриксе есть возможность привязать товар к какому-либо разделу, чтобы товар был сразу в двух разделах (например товар "Десертная ложка" находится одновременно и в разделе "Посуда" и в разделе "Ложки"). При этом в 1С ложка находится только в посуде. На сайте создаем раздел с названием ложки (на фото "Тестовый раздел") и привязываем товар к нему.
[URL=http://prntscr.com/jd3u79]http://prntscr.com/jd3u79[/URL]
Но после выгрузки этот товар затрется из раздела, т.к. в 1С этот раздел отсутствует.
Я попытался избежать этого с помощью такого кода [CODE]AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","SaveMySection");
function SaveMySection(&$arFields) {
if (@$_REQUEST['mode']=='import') { //импорт из 1с
$db_old_groups = CIBlockElement::GetElementGroups($arFields['ID'], true);
while($ar_group = $db_old_groups->Fetch()) {
if(!in_array($ar_group['ID'],$arFields['IBLOCK_SECTION']))
$arFields['IBLOCK_SECTION'][]=$ar_group['ID'];
}
}
}
[/CODE]Данный код отлично работает, привязка к разделам не сбрасывается. НО, теперь перестает работать код на активацию товаров и их обнуление. Как заставить работать обе функции? Пробовал такую конструкцию[CODE]AddEventHandler( "catalog", "OnSuccessCatalogImport1C" , array( "mdf_import", "SetDeactivatedToZero" ) );
class mdf_import {
function SetDeactivatedToZero( $arParams, $arFields ) {
// Активируем товары и обнуляем доступное количество
$element = new CIBlockElement;
$rsElements = CIBlockElement::GetList(
array(),
array("IBLOCK_ID" => MAIN_IBLOCK_ID, "ACTIVE" => "N"),
false,
false,
array("ID")
);
$rest = new CCatalogProduct;
// в цикле включаем активность и обнуляем количество
while ($arElement = $rsElements->Fetch()) {
// Включили активность
$element->UPDATE($arElement["ID"], array("ACTIVE" => "Y"));
// Обнулили количество
$rest->Update($arElement["ID"], Array("QUANTITY" => 0));
}
$db_old_groups = CIBlockElement::GetElementGroups($arFields['ID'], true);
while($ar_group = $db_old_groups->Fetch()) {
if(!in_array($ar_group['ID'],$arFields['IBLOCK_SECTION']))
$arFields['IBLOCK_SECTION'][]=$ar_group['ID'];
}
}
}
[/CODE]Но как я понял она не работает из-за того, что не известен $arFields['ID']. Как поступить?
У меня еще возник вопрос, лишь частично связанный с изначальной темой. В битриксе есть возможность привязать товар к какому-либо разделу, чтобы товар был сразу в двух разделах (например товар "Десертная ложка" находится одновременно и в разделе "Посуда" и в разделе "Ложки"). При этом в 1С ложка находится только в посуде. На сайте создаем раздел с названием ложки (на фото "Тестовый раздел") и привязываем товар к нему.
[URL=http://prntscr.com/jd3u79]http://prntscr.com/jd3u79[/URL]
Но после выгрузки этот товар затрется из раздела, т.к. в 1С этот раздел отсутствует.
Я попытался избежать этого с помощью такого кода [CODE]AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","SaveMySection");
function SaveMySection(&$arFields) {
if (@$_REQUEST['mode']=='import') { //импорт из 1с
$db_old_groups = CIBlockElement::GetElementGroups($arFields['ID'], true);
while($ar_group = $db_old_groups->Fetch()) {
if(!in_array($ar_group['ID'],$arFields['IBLOCK_SECTION']))
$arFields['IBLOCK_SECTION'][]=$ar_group['ID'];
}
}
}
[/CODE]Данный код отлично работает, привязка к разделам не сбрасывается. НО, теперь перестает работать код на активацию товаров и их обнуление. Как заставить работать обе функции? Пробовал такую конструкцию[CODE]AddEventHandler( "catalog", "OnSuccessCatalogImport1C" , array( "mdf_import", "SetDeactivatedToZero" ) );
class mdf_import {
function SetDeactivatedToZero( $arParams, $arFields ) {
// Активируем товары и обнуляем доступное количество
$element = new CIBlockElement;
$rsElements = CIBlockElement::GetList(
array(),
array("IBLOCK_ID" => MAIN_IBLOCK_ID, "ACTIVE" => "N"),
false,
false,
array("ID")
);
$rest = new CCatalogProduct;
// в цикле включаем активность и обнуляем количество
while ($arElement = $rsElements->Fetch()) {
// Включили активность
$element->UPDATE($arElement["ID"], array("ACTIVE" => "Y"));
// Обнулили количество
$rest->Update($arElement["ID"], Array("QUANTITY" => 0));
}
$db_old_groups = CIBlockElement::GetElementGroups($arFields['ID'], true);
while($ar_group = $db_old_groups->Fetch()) {
if(!in_array($ar_group['ID'],$arFields['IBLOCK_SECTION']))
$arFields['IBLOCK_SECTION'][]=$ar_group['ID'];
}
}
}
[/CODE]Но как я понял она не работает из-за того, что не известен $arFields['ID']. Как поступить?