Недавно передо мной стояла задача: написать древовидные комментарии для постов в блоге, используя модуль "Инфоблоки". Также для модераторов нужно было сделать возможность удалять комментарии – так, чтобы при удалении одного комментарии удалились и все дочерние.
Полностью все скрипты я описывать не буду, расскажу вкратце. Я создал 3 свойства: ID поста, ID пользователя, который оставляет коммент, и ID родительского поста. Последнее свойство я сделал типа "привязка к элементам" этого же инфоблока.
Всё было отлично, я написал скрипт, который добавляет и выводит комменты. Повозившись над ним немного, получилось даже что-то отдаленно похожее на Хабр :) Проблема возникла потом – когда нужно было сделать функционал для удаления комментов модераторами.
Я написал довольно простую рекурсивную функцию:
function deleteComments($parent_id)
{
$arFilter = array("IBLOCK_ID"=>IBLOCK_COMMENTS, "PROPERTY_comment_id" => $parent_id);
$res = CIBlockElement::GetList(array("ID"=>"ASC"), $arFilter, false, array(), array("ID"));
if($res->SelectedRowsCount() > 0)
{
while($ob = $res->GetNextElement())
{
$arFields = $ob->GetFields();
CIBlockElement::Delete($arFields['ID']);
deleteComments($arFields['ID']);
}
}
}
Вроде бы ничего сложного: удаляем исходный коммент и передаем его айдишник в функцию. По нему удаляем все дочерние комментарии. Но.. Что-то пошло не так – функция не работала. Долго-долго таращился на код, принтовал все переменные (параметры, айдишники в цикле) – всё было правильно. Но коммент удалялся только основной, дочерние оставались.
"В чём же дело?" &ndash недоумевал я. А оказалось всё очень просто. Дело было в типе свойства. Комменты, которые не удалялись, были привязаны к родительскому и, посмотрев значения свойств в админке, я увидел, что после удаления родителя свойство наследников обнулялось. Соответственно, GetList() ничего не возвращал и элементы не удалялись.
Ничего кроме как сделать свойство обычным числом в голову не пришло.



Комментарии (7)
CIBlockElement::Delete($arFields['ID']);
deleteComments($arFields['ID']);
из примера в статье, т.е. сделать так:
deleteComments($arFields['ID']);
CIBlockElement::Delete($arFields['ID']);
то все будет как надо или я чего то не понял?