- Модуль: 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);
}
}
}
}