• Модуль: wiki
  • Путь к файлу: ~/bitrix/modules/wiki/classes/general/wiki.php
  • Класс: CWiki
  • Вызов: CWiki::UpdateCategory
function UpdateCategory($ID, $IBLOCK_ID, $arCats)
{

	$this->CleanCacheById($ID, $IBLOCK_ID);

	$arFilter = array(
		'IBLOCK_ID' => $IBLOCK_ID,
		'CHECK_PERMISSIONS' => 'N'
	);
	$arElement = self::GetElementById($ID, $arFilter);
	$bCategoryPage = false;
	$sCatName = '';
	$arCatsID = array();
	if (CWikiUtils::IsCategoryPage($arElement['~NAME'], $sCatName))
		$bCategoryPage = true;

	if ($bCategoryPage)
	{
		// get current category
		$arFilter =  array('NAME' => $sCatName, 'IBLOCK_ID' => $IBLOCK_ID, 'CHECK_PERMISSIONS' => 'N');
		if (CWikiSocnet::IsSocNet())
		{
			$arFilter['>LEFT_BORDER'] = CWikiSocnet::$iCatLeftBorder;
			$arFilter['GetNext();

		if (empty($arCurCat))
		{
			$CIB_S = new CIBlockSection();
			$_arFields = array();
			$_arFields['IBLOCK_ID'] = $IBLOCK_ID;
			$_arFields['ACTIVE'] = 'Y';
			$_arFields['NAME'] = $sCatName;
			$_arFields['XML_ID'] = $sCatName;
			if (CWikiSocnet::IsSocNet())
				$_arFields['IBLOCK_SECTION_ID'] = CWikiSocnet::$iCatId;
			$iCurCatID = $CIB_S->Add($_arFields);
			if ($iCurCatID != false)
				$arCatsID[] = $iCurCatID;
		}
		else
		{
			$iCurCatID = $arCurCat['ID'];
			$arCatsID[] = $arCurCat['ID'];
		}

		// Page bind only to this category
		CIBlockElement::SetElementSection($ID, $arCatsID);

		$CIB_S = new CIBlockSection();
		if (!empty($arCats))
		{
			// Nova create a category if it still has no
			$arFilter =  array('NAME' => $arCats[0], 'IBLOCK_ID' => $IBLOCK_ID, 'CHECK_PERMISSIONS' => 'N');
			if (CWikiSocnet::IsSocNet())
			{
				$arFilter['>LEFT_BORDER'] = CWikiSocnet::$iCatLeftBorder;
				$arFilter['GetNext();

			if (empty($arCat))
			{
				$_arFields = array();
				$_arFields['IBLOCK_ID'] = $IBLOCK_ID;
				$_arFields['ACTIVE'] = 'Y';
				$_arFields['NAME'] = CWikiUtils::htmlspecialcharsback($arCats[0]);
				$_arFields['XML_ID'] = CWikiUtils::htmlspecialcharsback($arCats[0]);
				$_arFields['CHECK_PERMISSIONS'] = 'N';
				if (CWikiSocnet::IsSocNet())
					$_arFields['IBLOCK_SECTION_ID'] = CWikiSocnet::$iCatId;

				$iCatID = $CIB_S->Add($_arFields);
			}
			else
				$iCatID = $arCat['ID'];

			$_arFields = array();
			$_arFields['IBLOCK_ID'] = $IBLOCK_ID;
			$_arFields['ACTIVE'] = 'Y';
			$_arFields['IBLOCK_SECTION_ID'] = $iCatID;
			// current category doing this subcategory
			$CIB_S->Update($iCurCatID, $_arFields);
		}
		else
		{
			$_arFields = array();
			$_arFields['IBLOCK_ID'] = $IBLOCK_ID;
			$_arFields['ACTIVE'] = 'Y';
			$_arFields['IBLOCK_SECTION_ID'] = 0;
			if (CWikiSocnet::IsSocNet())
				$_arFields['IBLOCK_SECTION_ID'] = CWikiSocnet::$iCatId;
			// bind to the root category
			$CIB_S->Update($iCurCatID, $_arFields);
		}
	}
	else  //not category
	{
		$arExistsCatsId = array();
		$arDelCatId = array();
		$rsSect = CIBlockElement::GetElementGroups($ID, false);
		//$arResult['SECTIONS'] = array(); //erase candidat
		while($arSect = $rsSect->GetNext())
			$arExistsCatsId[] = $arSect['ID'];

		if (!empty($arCats))
		{
			$arFilter =  array('NAME' => $arCats, 'IBLOCK_ID' => $IBLOCK_ID, 'CHECK_PERMISSIONS' => 'N');
			if (CWikiSocnet::IsSocNet())
			{
				$arFilter['>LEFT_BORDER'] = CWikiSocnet::$iCatLeftBorder;
				$arFilter['GetNext())
			{
				$arExiststInBlockCats[] = $arCat['~NAME'];
				$arCatsID[] = $arCat['ID'];
			}

			$CIB_S = new CIBlockSection();
			foreach ($arCats as $sCatName)
			{
				if (!in_array($sCatName, $arExiststInBlockCats))
				{
					$_arFields = array();
					$_arFields['IBLOCK_ID'] = $IBLOCK_ID;
					$_arFields['ACTIVE'] = 'Y';
					$_arFields['NAME'] = CWikiUtils::htmlspecialcharsback($sCatName, false);
					$_arFields['XML_ID'] = CWikiUtils::htmlspecialcharsback($sCatName, false);
					$_arFields['CHECK_PERMISSIONS'] = 'N';
					if (CWikiSocnet::IsSocNet())
						$_arFields['IBLOCK_SECTION_ID'] = CWikiSocnet::$iCatId;
					$iCatID = $CIB_S->Add($_arFields);
					if ($iCatID != false)
						$arCatsID[] = $iCatID;
				}
			}

			//bind to the item
			if (!empty($arCatsID))
			{
				//if (CWikiSocnet::IsSocNet())
				//	$arCatsID[] = CWikiSocnet::$iCatId;
				CIBlockElement::SetElementSection($ID, $arCatsID);
			}
		}
		else
		{
			$arCatsID = array();
			if (CWikiSocnet::IsSocNet())
				$arCatsID = CWikiSocnet::$iCatId;
			CIBlockElement::SetElementSection($ID, $arCatsID);
		}

		if (is_array($arCatsID))
			$arDelCatId = array_diff($arExistsCatsId, $arCatsID);
		if (!empty($arDelCatId))
		{
			foreach ($arDelCatId as $_iCatId)
			{
				$obRes = CIBlockSection::GetList(array(), array('ID' => $_iCatId, 'IBLOCK_ID' => $IBLOCK_ID), true);
				$arCatProp = $obRes->Fetch();
				if ($arCatProp['ELEMENT_CNT'] == 0)
					CIBlockSection::Delete($_iCatId);
			}
		}
	}
}