Свойство типа «Привязка к элементам»

Недавно передо мной стояла задача: написать древовидные комментарии для постов в блоге, используя модуль "Инфоблоки". Также для модераторов нужно было сделать возможность удалять комментарии – так, чтобы при удалении одного комментарии удалились и все дочерние.

Полностью все скрипты я описывать не буду, расскажу вкратце. Я создал 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() ничего не возвращал и элементы не удалялись.

Ничего кроме как сделать свойство обычным числом в голову не пришло.

Дата: 15 января 2010
Теги: инфоблоки, свойства
Добавить в закладки:

Комментарии (7)

Интеллигент, 16 Января 2010

Санек, мы сегодня только говорили на тему движка таблиц. ИнноДБ позволяет внешние ключи создавать, может быть и проблемы нет, если связать внешним ключом два поля? Правда, в битриксе я не сведущ, и я, быть может, упускаю важную деталь.

Александр Живетьев
Александр Живетьев, 16 Января 2010

Дело в том, что мне нужно пробегаться по комментам именно "сверху вниз", а не "снизу вверх". Если бы было наоборот, всё было бы проще)

Виктор, 6 Февраля 2010

Александр, очень полезно если напишите как вывести свойства связанного элемента, т.е. не просто название элемента, который привязан, но и его картинку или др. св-во. Эта тема часто на форуме Битрикса поднимается и всем будет полезен такой урок

Александр Живетьев
Александр Живетьев, 6 Февраля 2010

Виктор, благодарю за совет. Добавлю.

Sergei, 2 Июля 2010

как применить эту функцию в компоненте "форма добавления элементов инфоблока" для отображения и заполнения свойств привязки к элементам

Fmndkn, 16 Декабря 2010

Писал гостевую с подобным функционалом. Для привязки родителей использовал не свойство, а свободное поле "CODE". Единственный момент, сначала удалял 'детей' а потом 'родителя'. Дабы не потерлась логика сообщений, если при удалении 'ребенка' возникнет ошибка. Поле "CODE" использовал чтобы не совершать лишних вызовов по свойствам. Хотя сейчас это тоже не проблема.

Andrey, 21 Июля 2011

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