Учусь по видеокурсам. Задания к 3-ему уроку "События". Задание №2.
"Реализовать проверку – при удалении товара из каталога, проверять: если количество
просмотров товара (поле SHOW_COUNTER) больше 1, то отменять удаление, деактивировать
товар и выводить в административный раздел соответствующее уведомление с указанием
количества просмотров."
Моя проблема в том, что чтобы не дать удалить элемент мы кидаем исключение (так сказано в API, эт не я придумал). Но если мы кидаем исключение, то редактировать элемент невозможно в тот же момент. Т.е. нельзя никак его деактивировать.
Так как же и отменить удаление элемента и деактивировать его из одного события? Вот, что я делал:
[CODE]AddEventHandler("iblock", "OnBeforeIBlockElementDelete", Array("CIBlockBeforeDelete", "OnBeforeIBlockElementDeleteHandler"));
class CIBlockBeforeDelete {
function OnBeforeIBlockElementDeleteHandler($ID) {
$get_el = CIBlockElement::GetByID($ID);
if($el_res = $get_el->GetNext()){
$flag = false;
if($el_res['IBLOCK_ID'] == CATALOG_IBLOCK_ID && $el_res["SHOW_COUNTER"] > 1) {
global $APPLICATION;
$APPLICATION->throwException("Элемент не будет удалён, а только деактивирован. Просмотрен: ".$el_res["SHOW_COUNTER"]." раз");
$el = new CIBlockElement;
$arLoadProductArray = Array("ACTIVE" => "N");
$res = $el->Update($ID, $arLoadProductArray);
return false;
}
}
}
}[/CODE]
Удаление я отменить могу по необходимому условию, а вот деактивировать элемент никак не получается.
"Реализовать проверку – при удалении товара из каталога, проверять: если количество
просмотров товара (поле SHOW_COUNTER) больше 1, то отменять удаление, деактивировать
товар и выводить в административный раздел соответствующее уведомление с указанием
количества просмотров."
Моя проблема в том, что чтобы не дать удалить элемент мы кидаем исключение (так сказано в API, эт не я придумал). Но если мы кидаем исключение, то редактировать элемент невозможно в тот же момент. Т.е. нельзя никак его деактивировать.
Так как же и отменить удаление элемента и деактивировать его из одного события? Вот, что я делал:
[CODE]AddEventHandler("iblock", "OnBeforeIBlockElementDelete", Array("CIBlockBeforeDelete", "OnBeforeIBlockElementDeleteHandler"));
class CIBlockBeforeDelete {
function OnBeforeIBlockElementDeleteHandler($ID) {
$get_el = CIBlockElement::GetByID($ID);
if($el_res = $get_el->GetNext()){
$flag = false;
if($el_res['IBLOCK_ID'] == CATALOG_IBLOCK_ID && $el_res["SHOW_COUNTER"] > 1) {
global $APPLICATION;
$APPLICATION->throwException("Элемент не будет удалён, а только деактивирован. Просмотрен: ".$el_res["SHOW_COUNTER"]." раз");
$el = new CIBlockElement;
$arLoadProductArray = Array("ACTIVE" => "N");
$res = $el->Update($ID, $arLoadProductArray);
return false;
}
}
}
}[/CODE]
Удаление я отменить могу по необходимому условию, а вот деактивировать элемент никак не получается.