%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/wiki/classes/general/ |
Current File : /home/bitrix/www/bitrix/modules/wiki/classes/general/wiki.php |
<?php use \Bitrix\Main\Error; use Bitrix\Main\ErrorCollection; use Bitrix\Main\Localization\Loc; IncludeModuleLangFile(__FILE__); class CWiki { /** * * * @var CIBlockElement */ var $cIB_E = null; const PAGE_UPDATED_CACHE_ID = "WIKI_PAGE_UPDATED_"; const GET_BY_NAME_CACHE_ID = "WIKI_BY_NAME_CACHE_ID_"; const CWIKI_CACHE_TTL = 36000000; /** @var ErrorCollection */ protected $errorCollection; function __construct() { $this->cIB_E = new CIBlockElement(); $this->errorCollection = new ErrorCollection(); } function Add($arFields) { $arFields['XML_ID'] = $arFields['NAME']; $arCats = array(); $CWikiParser = new CWikiParser(); $arFields['DETAIL_TEXT'] = $CWikiParser->parseBeforeSave($arFields['DETAIL_TEXT'], $arCats, $arFields['NAME_TEMPLATE']); if (CWikiSocnet::IsSocNet()) $arFields['IBLOCK_SECTION_ID'] = CWikiSocnet::$iCatId; //add item $ID = $this->cIB_E->Add($arFields); $this->CleanCache($ID, $arFields['NAME'],$arFields['IBLOCK_ID']); //serve category / bindings $this->UpdateCategory($ID, $arFields['IBLOCK_ID'], $arCats); //$this->UpdateHistory($ID, $arFields['IBLOCK_ID']); return $ID; } function Update($ID, $arFields) { $arCats = array(); $CWikiParser = new CWikiParser(); $arFields['DETAIL_TEXT'] = $CWikiParser->parseBeforeSave($arFields['DETAIL_TEXT'], $arCats, $arFields['NAME_TEMPLATE']); $this->CleanCache($ID, $arFields['NAME'], $arFields['IBLOCK_ID']); //save item $this->cIB_E->Update($ID, $arFields); //serve category / bindings $arCats = str_replace("/", "-", $arCats); //http://jabber.bx/view.php?id=28447 $this->UpdateCategory($ID, $arFields['IBLOCK_ID'], $arCats); $modifyComment = isset($arFields["MODIFY_COMMENT"]) ? $arFields["MODIFY_COMMENT"] : ""; $this->UpdateHistory($ID, $arFields['IBLOCK_ID'], $modifyComment); return true; } function Recover($HISTORY_ID, $ID, $IBLOCK_ID) { $this->CleanCacheById($ID, $IBLOCK_ID); $rIBlock = CIBlock::getList(Array(), array('ID' => $IBLOCK_ID, 'CHECK_PERMISSIONS' => 'N')); $arIBlock = $rIBlock->GetNext(); if ($arIBlock['BIZPROC'] == 'Y' && CModule::IncludeModule('bizproc')) { $arErrorsTmp = array(); $arHistoryResult = CBPDocument::GetDocumentFromHistory($HISTORY_ID, $arErrorsTmp); $modifyComment = GetMessage('WIKI_RECOVER_COMMENT')." ".$arHistoryResult["MODIFIED"]; if (CBPHistoryService::RecoverDocumentFromHistory($HISTORY_ID)) { if ($this->UpdateHistory($ID, $IBLOCK_ID, $modifyComment)) return true; else return false; } else return false; } else return false; } function UpdateHistory($ID, $IBLOCK_ID, $modifyComment=false) { global $USER; $rIBlock = CIBlock::getList(Array(), array('ID' => $IBLOCK_ID, 'CHECK_PERMISSIONS' => 'N')); $arIBlock = $rIBlock->GetNext(); // add changes history if ($arIBlock['BIZPROC'] == 'Y' && CModule::IncludeModule('bizproc')) { $cRuntime = CBPRuntime::GetRuntime(); $cRuntime->StartRuntime(); $documentService = $cRuntime->GetService('DocumentService'); $historyIndex = CBPHistoryService::Add( array( 'DOCUMENT_ID' => array('iblock', 'CWikiDocument', $ID), 'NAME' => 'New', 'DOCUMENT' => null, 'USER_ID' => $USER->GetID() ) ); $arDocument = $documentService->GetDocumentForHistory(array('iblock', 'CWikiDocument', $ID), $historyIndex); $arDocument["MODIFY_COMMENT"] = $modifyComment ? $modifyComment : ''; if (is_array($arDocument)) { CBPHistoryService::Update( $historyIndex, array( 'NAME' => $arDocument['NAME'], 'DOCUMENT' => $arDocument, ) ); } return true; } return false; } 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['<RIGHT_BORDER'] = CWikiSocnet::$iCatRightBorder; } $rsCurCats = CIBlockSection::GetList(array(), $arFilter); $arCurCat = $rsCurCats->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['<RIGHT_BORDER'] = CWikiSocnet::$iCatRightBorder; } $rsCats = CIBlockSection::GetList(array(), $arFilter); $arCat = $rsCats->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['<RIGHT_BORDER'] = CWikiSocnet::$iCatRightBorder; } $rsCats = CIBlockSection::GetList(array(), $arFilter); while($arCat = $rsCats->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); } } } } //TODO: Delete (check) all comments function Delete($ID, $IBLOCK_ID) { $rIBlock = CIBlock::getList(Array(), array('ID' => $IBLOCK_ID, 'CHECK_PERMISSIONS' => 'N')); $arIBlock = $rIBlock->GetNext(); // erase the history of changes if ($arIBlock['BIZPROC'] == 'Y' && CModule::IncludeModule('bizproc')) { $historyService = new CBPHistoryService(); $historyService->DeleteHistoryByDocument(array('iblock', 'CWikiDocument', $ID)); } $this->CleanCacheById($ID,$IBLOCK_ID); // delete item $bResult = $this->cIB_E->Delete($ID); return $bResult; } function AddImage($ID, $IBLOCK_ID, $arImage) { $arProperties = array(); $arCurImages = array(); $arCurImagesNew = array(); $arAddImage = array(); $rsProperties = CIBlockElement::GetProperty($IBLOCK_ID, $ID, 'value_id', 'asc', array('ACTIVE' => 'Y', 'CODE' => 'IMAGES')); while($arProperty = $rsProperties->Fetch()) { if($arProperty['CODE'] == 'IMAGES') { $arProperties['IMAGES'] = $arProperty; $arCurImages[$arProperty['VALUE']] = ''; } } $rsFile = CFile::GetList(array(), array('@ID' => implode(',', array_keys($arCurImages)))); while($arFile = $rsFile->Fetch()) $arCurImages[$arFile['ID']] = $arFile['ORIGINAL_NAME']; if(array_search($arImage['name'], $arCurImages) !== false) { $this->errorCollection->add(array(new Error(Loc::getMessage('WIKI_ERROR_IMAGE_ATTACHED')))); return false; } $obProperty = new CIBlockProperty(); $res = true; if(!array_key_exists('IMAGES', $arProperties)) { $res = $obProperty->Add(array( 'IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y', 'PROPERTY_TYPE' => 'F', 'MULTIPLE' => 'Y', 'NAME' => 'Images', 'CODE' => 'IMAGES' )); } $arFields = array(); CFile::ResizeImage($arImage, array( 'width' => COption::GetOptionString('wiki', 'image_max_width', 600), 'height' => COption::GetOptionString('wiki', 'image_max_height', 600) )); $arFields['PROPERTY_VALUES'] = array('IMAGES' => $arImage); $arFields['BLOCK_ID'] = $IBLOCK_ID; $arFields['ELEMENT_ID'] = $ID; $this->cIB_E->Update($ID, $arFields); $rsProperties = CIBlockElement::GetProperty($IBLOCK_ID, $ID, 'value_id', 'asc', array('ACTIVE' => 'Y', 'CODE' => 'IMAGES', 'EMPTY' => 'N')); while($arProperty = $rsProperties->Fetch()) { if($arProperty['CODE'] == 'IMAGES') $arCurImagesNew[$arProperty['VALUE']] = ''; } $arAddImage = array_diff(array_keys($arCurImagesNew), array_keys($arCurImages)); list(, $imgId) = each($arAddImage); return $imgId; } function DeleteImage($IMAGE_ID, $ID, $IBLOCK_ID) { $rsProperties = CIBlockElement::GetProperty($IBLOCK_ID, $ID, 'value_id', 'asc', array('ACTIVE' => 'Y', 'CODE' => 'IMAGES')); $_iPropertyId = 0; while($arProperty = $rsProperties->Fetch()) { if($arProperty['CODE'] == 'IMAGES' && $arProperty['VALUE'] == $IMAGE_ID) { $_iPropertyId = $arProperty['PROPERTY_VALUE_ID']; break; } } if (!empty($_iPropertyId)) { $arPropertyValues = array(); $arPropertyValues[$_iPropertyId] = array('VALUE' => array('del' => 'Y'), 'DESCRIPTION' => ''); $this->cIB_E->SetPropertyValues($ID, $IBLOCK_ID, $arPropertyValues, 'IMAGES'); } } function Rename($ID, $arFields, $bUpdateSearch=true) { $arFilter = array('IBLOCK_ID' => $arFields['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N'); // checking for the existence of a page with this name $arElement = self::GetElementByName($arFields['NAME'], $arFilter); $arOldElement = self::GetElementById($ID, $arFilter); $bRename = false; if ($arOldElement != false) { if ($arElement == false) $bRename = true; else if($arElement['ID'] == $ID) $bRename = true; } if ($bRename) { $this->CleanCacheById($ID, $arFields['IBLOCK_ID']); $arFields['XML_ID'] = $arFields['NAME']; $this->cIB_E->Update($ID, $arFields, false, $bUpdateSearch); $sCatName = ''; if(CWikiUtils::IsCategoryPage($arFields['NAME'], $sCatName)) { $sCatNameOld = ''; if (CWikiUtils::IsCategoryPage($arOldElement['NAME'], $sCatNameOld)) { // rename a category $arFilter = array('NAME' => $sCatNameOld, 'IBLOCK_ID' => $arFields['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N'); if (CWikiSocnet::IsSocNet()) { $arFilter['>LEFT_BORDER'] = CWikiSocnet::$iCatLeftBorder; $arFilter['<RIGHT_BORDER'] = CWikiSocnet::$iCatRightBorder; } $rsCats = CIBlockSection::GetList(array(), $arFilter); $arCat = $rsCats->GetNext(); if ($arCat != false) { $CIB_S = new CIBlockSection(); $_arFields = array(); $_arFields['IBLOCK_ID'] = $arFields['IBLOCK_ID']; $_arFields['NAME'] = $sCatName; $_arFields['XML_ID'] = $sCatName; $_arFields['CHECK_PERMISSIONS'] = 'N'; $CIB_S->Update($arCat['ID'], $_arFields); } } } $arOldElement['NAME'] = CWikiUtils::htmlspecialcharsback($arOldElement['NAME']); if (self::GetDefaultPage($arFields['IBLOCK_ID']) == false || (self::GetDefaultPage($arFields['IBLOCK_ID']) == $arOldElement['NAME'] && $arOldElement['NAME'] != $arFields['NAME'])) self::SetDefaultPage($arFields['IBLOCK_ID'], $arFields['NAME']); return true; } return false; } /** * Renames inner links, and categories on wiki pages * alternatively you must do that manualy, after page, or catgory was renamed. * @param int $iBlockId (mandatory)- id of iblock witch contain page, or category. * @param str $oldName (mandatory)- old page or category name. * @param str $newName (mandatory)- new page or category name. * @param int $iBlockSectId (optional) - id of iBlock section witch contain page, or category. * if wiki used with socnet groups, this param must be setted, otherwise all pages of all soc. groups * will be changed. * @return int the amount of changed pages. */ function RenameLinkOnPages($iBlockId, $oldName, $newName, $iBlockSectId = false) { if(!$iBlockId || !$oldName || !$newName) return false; $arFilter["IBLOCK_ID"] = $iBlockId; $arFilter["CHECK_PERMISSIONS"]="N"; if($iBlockSectId) { $arFilter["SECTION_ID"] = $iBlockSectId; $arFilter["INCLUDE_SUBSECTIONS"] = "Y"; } $count = 0; $sCatName = ''; $isCategory = CWikiUtils::IsCategoryPage($oldName , $sCatName); $catSearch = "[[".GetMessage('CATEGORY_NAME').":".$sCatName."]]"; $arPatterns = array( //link and link_name are equal array( "search" => "[[".$oldName."|".$oldName."]]", "pattern" => "/\[\[(".preg_quote($oldName).")\|(".preg_quote($oldName).")\]\]/isU".BX_UTF_PCRE_MODIFIER, "replacement" => "[[".$newName."|".$newName."]]" ), //link and link_name are different array( "search" => "[[".$oldName."|", "pattern" => "/\[\[(".preg_quote($oldName).")\|(.*)\]\]/isU".BX_UTF_PCRE_MODIFIER, "replacement" => "[[".$newName."|$2]]" ), //exist only link array( "search" => "[[".$oldName."]]", "pattern" => "/\[\[".preg_quote($oldName)."\]\]/isU".BX_UTF_PCRE_MODIFIER, "replacement" => "[[".$newName."]]" ) ); $dbRes = CIBlockElement::GetList(array(), $arFilter, false, false, array("ID", "NAME", "DETAIL_TEXT")); while($arElement = $dbRes->GetNext()) { $bChanged = false; $newText = $arElement["~DETAIL_TEXT"]; foreach ($arPatterns as $arPattern) { if(strpos($newText, $arPattern["search"]) !== false) { $newText = preg_replace($arPattern["pattern"], $arPattern["replacement"], $newText); $bChanged = true; } } if ($isCategory) if(strpos($newText, $catSearch) !== false) { $newText = $this->RenameCategoryOnPage($newText, $sCatName, $newName); $bChanged = true; } if($bChanged) { $this->CleanCache($arElement["ID"], $arElement["NAME"], $iBlockId); $this->cIB_E->Update($arElement["ID"], array("DETAIL_TEXT" => $newText), false, true); self::MarkPageAsUpdated($iBlockId, $iBlockSectId, $arElement["NAME"]); $count++; } } return $count; } function RenameCategoryOnPage($pageText, $oldCategoryName, $newCategoryName) { $newCategoryName = preg_replace("/category:/isU", "", $newCategoryName); return preg_replace("/\[\[".GetMessage('CATEGORY_NAME').":".$oldCategoryName."\]\]/isU", "[[".GetMessage('CATEGORY_NAME').":".$newCategoryName."]]", $pageText); } static function SetDefaultPage($IBLOCK_ID, $NAME) { if (CWikiSocnet::IsSocNet()) { $ENTITY_ID = 'IBLOCK_'.$IBLOCK_ID.'_SECTION'; $ELEMENT_ID = CWikiSocnet::$iCatId; } else { $ENTITY_ID = 'IBLOCK_'.$IBLOCK_ID; $ELEMENT_ID = $IBLOCK_ID; } AddEventHandler("main", "OnUserTypeBuildList", array("CUserTypeWiki", "GetUserTypeDescription")); $GLOBALS['USER_FIELD_MANAGER']->CleanCache(); $GLOBALS['USER_FIELD_MANAGER']->arUserTypes = ''; $arElement = $GLOBALS['USER_FIELD_MANAGER']->GetUserFields($ENTITY_ID, $ELEMENT_ID); if ($arElement !== false) { if (!isset($arElement['UF_WIKI_INDEX'])) { $arFields = array(); $arFields['ENTITY_ID'] = $ENTITY_ID; $arFields['FIELD_NAME'] = 'UF_WIKI_INDEX'; $arFields['USER_TYPE_ID'] = 'wiki'; $CAllUserTypeEntity = new CUserTypeEntity(); $intID=$CAllUserTypeEntity->Add($arFields); if (false == $intID) { $e = $GLOBALS['APPLICATION']->GetException(); if ($e) ShowError(GetMessage("WIKI_USER_T_ADD_ERR").$e->GetString()); } } if (empty($arElement['UF_WIKI_INDEX']['VALUE']) || $arElement['UF_WIKI_INDEX']['VALUE'] != $NAME) { $arFields = array(); $arFields['UF_WIKI_INDEX'] = $NAME; $GLOBALS['USER_FIELD_MANAGER']->Update($ENTITY_ID, $ELEMENT_ID, $arFields); } return true; } return false; } static function GetDefaultPage($IBLOCK_ID) { if (CWikiSocnet::IsSocNet()) { $ENTITY_ID = 'IBLOCK_'.$IBLOCK_ID.'_SECTION'; $ELEMENT_ID = CWikiSocnet::$iCatId; } else { $ENTITY_ID = 'IBLOCK_'.$IBLOCK_ID; $ELEMENT_ID = $IBLOCK_ID; } AddEventHandler("main", "OnUserTypeBuildList", array("CUserTypeWiki", "GetUserTypeDescription")); $GLOBALS['USER_FIELD_MANAGER']->CleanCache(); $GLOBALS['USER_FIELD_MANAGER']->arUserTypes = ''; $arElement = $GLOBALS['USER_FIELD_MANAGER']->GetUserFields( $ENTITY_ID, $ELEMENT_ID ); return isset($arElement['UF_WIKI_INDEX']['VALUE']) ? $arElement['UF_WIKI_INDEX']['VALUE'] : ''; } function GetCategory($NAME, $IBLOCK_ID) { global $arParams; $arResult = array(); $arResult[] = array( 'TITLE' => GetMessage('Service:Categories_TITLE'), 'NAME' => GetMessage('Service:Categories'), 'LINK' => CHTTP::urlAddParams( CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_CATEGORIES'], array( 'wiki_name' => 'Service:Categories', 'group_id' => CWikiSocnet::$iSocNetId ) ), array() ), 'IS_RED' => 'N', 'IS_SERVICE' => 'Y' ); $arFilter['=XML_ID'] = CWikiUtils::htmlspecialcharsback($NAME); $arFilter['IBLOCK_ID'] = $IBLOCK_ID; $arFilter['CHECK_PERMISSIONS'] = 'N'; if (CWikiSocnet::IsSocNet()) $arFilter['SUBSECTION'] = CWikiSocnet::$iCatId; $rsElement = CIBlockElement::GetList(array(), $arFilter, false, false, Array()); $arElement = $rsElement->GetNext(); $sCatName = ''; if (CWikiUtils::IsCategoryPage($NAME, $sCatName)) return $arResult; $arLink = array(); $arLinkExists = array(); $arCat = array(); $rsSect = CIBlockElement::GetElementGroups($arElement['ID'], false); while($arSect = $rsSect->GetNext()) { $arCat[$arSect['ID']] = $arSect; $arLink[] = 'category:'.CWikiUtils::htmlspecialcharsback($arSect['NAME']); } /*if(empty($arLink)) return array();*/ if (CWikiSocnet::IsSocNet() && isset($arCat[CWikiSocnet::$iCatId])) unset($arCat[CWikiSocnet::$iCatId]); $arFilter = array(); $arFilter['=NAME'] = $arLink; $arFilter['IBLOCK_ID'] = $IBLOCK_ID; $arFilter['ACTIVE'] = 'Y'; $arFilter['CHECK_PERMISSIONS'] = 'N'; if (CWikiSocnet::IsSocNet()) $arFilter['SUBSECTION'] = CWikiSocnet::$iCatId; $rsElement = CIBlockElement::GetList(array(), $arFilter, false, false, Array()); while($obElement = $rsElement->GetNextElement()) { $arFields = $obElement->GetFields(); $arLinkExists[] = preg_replace('/^(category|'.GetMessage('CATEGORY_NAME').'):/i'.BX_UTF_PCRE_MODIFIER, '', $arFields['NAME']); } if (!empty($arCat)) { foreach ($arCat as $_arCat) { $_arCat['NAME'] = CWikiUtils::htmlspecialcharsback($_arCat['NAME'], false); $_arResult = array(); $_arResult['ID'] = $_arCat['ID']; $_arResult['IS_RED'] = 'N'; $_arResult['LINK'] = CHTTP::urlAddParams( CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_CATEGORY'], array( 'wiki_name' => 'Category:'.$_arCat['NAME'], 'group_id' => CWikiSocnet::$iSocNetId ) ), array() ); $_arResult['TITLE'] = $_arCat['NAME']; $_arResult['NAME'] = $_arCat['NAME']; $_arResult['IS_SERVICE'] = 'N'; if (!in_array($_arCat['NAME'], $arLinkExists)) $_arResult['IS_RED'] = 'Y'; $arResult[] = $_arResult; } } return $arResult; } /** * * * * @param int $ID * @return array */ public static function GetElementById($ID, $arFilter) { global $arParams; $arFilter['ID'] = $ID; if (CWikiSocnet::IsSocNet()) $arFilter['SUBSECTION'] = CWikiSocnet::$iCatId; $rsElement = CIBlockElement::GetList(array(), $arFilter, false, false, Array()); $obElement = $rsElement->GetNextElement(); $arResult = false; if ($obElement !== false) { $arResult = $obElement->GetFields(); if (isset($arResult['NAME'])) $arResult['NAME'] = htmlspecialcharsbx($arResult['NAME']); $rsProperties = $obElement->GetProperties(array(), array('CODE' => 'IMAGES')); foreach ($rsProperties as $arProperty) $arResult[$arProperty['CODE']] = $arProperty['VALUE']; $arResult['SECTIONS'] = self::GetCategory($arResult['XML_ID'], $arFilter['IBLOCK_ID']); if (!empty($arResult['TAGS'])) { $_arTAGS = explode(',', $arResult['TAGS']); $arResult['_TAGS'] = array(); foreach ($_arTAGS as $sTag) { $arTag = array('NAME' => $sTag); if (!empty($arParams['PATH_TO_SEARCH'])) { $arP = $arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == 'N' ? array($arParams['OPER_VAR'] => 'search') : array(); $arP['tags'] = rawurlencode($sTag); $arTag['LINK'] = CHTTP::urlAddParams( CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_SEARCH'], array( 'wiki_name' => $arParams['ELEMENT_NAME'], 'group_id' => CWikiSocnet::$iSocNetId) ), $arP ); } $arResult['_TAGS'][] = $arTag; } } } return $arResult; } /** * @param string $NAME (mandatory) - the name of page * @param array $arFilter (mandatory) - the filter for CIBlockElement::GetList * @param array $arComponentParams (optional) - params of the calling wiki component * using indexes: CACHE_TIME, PATH_TO_SEARCH, IN_COMPLEX, SEF_MODE, OPER_VAR, ELEMENT_NAME * necessary for: building search tag links * @return array */ public static function GetElementByName($NAME, $arFilter, $arComponentParams = array()) { global $CACHE_MANAGER; $iCatId = ""; if (CWikiSocnet::IsSocNet()) { $arFilter['SUBSECTION'] = CWikiSocnet::$iCatId; $iCatId = $arFilter['SUBSECTION']; } $cacheByNameID = self::GetIdForCacheByName($arFilter['IBLOCK_ID'], $iCatId, $NAME); $cacheTime = isset($arComponentParams['CACHE_TIME']) ? intval($arComponentParams['CACHE_TIME']) : CWiki::CWIKI_CACHE_TTL; if($CACHE_MANAGER->Read($cacheTime, $cacheByNameID)) { $cachedElement = $CACHE_MANAGER->Get($cacheByNameID); if($cachedElement) { //if cached element satisfied to filter's conditions $sameFilter = true; foreach ($arFilter as $key => $value) { if(isset($cachedElement[$key]) && $value != "" && $cachedElement[$key] != $value) { $sameFilter = false; break; } } if($sameFilter) return $cachedElement; } } $NAME = CWikiUtils::UnlocalizeCategoryName($NAME); $NAME = CWikiUtils::htmlspecialcharsback($NAME); $arFilter['=XML_ID'] = $NAME; $rsElement = CIBlockElement::GetList(array(), $arFilter); $obElement = $rsElement->GetNextElement(); $arResult = false; if ($obElement !== false) { $arResult = $obElement->GetFields(); if (isset($arResult['NAME'])) $arResult['NAME'] = htmlspecialcharsbx($arResult['NAME']); $rsProperties = $obElement->GetProperties(array(), array('CODE' => 'IMAGES')); foreach ($rsProperties as $arProperty) $arResult[$arProperty['CODE']] = $arProperty['VALUE']; $rsProperties = $obElement->GetProperties(array(), array('CODE' => 'FORUM_TOPIC_ID')); foreach ($rsProperties as $arProperty) $arResult[$arProperty['CODE']] = $arProperty['VALUE']; $arResult['SECTIONS'] = self::GetCategory($arResult['XML_ID'], $arFilter['IBLOCK_ID']); if (!empty($arResult['TAGS'])) { $_arTAGS = explode(',', $arResult['TAGS']); $arResult['_TAGS'] = array(); foreach ($_arTAGS as $sTag) { $sTag = trim($sTag); $arTag = array('NAME' => $sTag); if (!empty($arComponentParams) && isset($arComponentParams['PATH_TO_SEARCH'])) { $arP = $arComponentParams['IN_COMPLEX'] == 'Y' && $arComponentParams['SEF_MODE'] == 'N' ? array($arComponentParams['OPER_VAR'] => 'search') : array(); $arP['tags'] = rawurlencode($sTag); $arTag['LINK'] = CHTTP::urlAddParams( CComponentEngine::MakePathFromTemplate($arComponentParams['PATH_TO_SEARCH'], array( 'wiki_name' => $arComponentParams['ELEMENT_NAME'], 'group_id' => CWikiSocnet::$iSocNetId ) ), $arP ); } $arResult['_TAGS'][] = $arTag; } } } if(!empty($arComponentParams)) //Let's store only full page data with tag links $CACHE_MANAGER->Set($cacheByNameID, $arResult); return $arResult; } /** * @return \Bitrix\Main\ErrorCollection */ public function getErrors() { return $this->errorCollection; } public function CleanCacheById($ID, $iBlockId = false) { return $this->CleanCache($ID, false, $iBlockId); } public function CleanCache($ID = false, $Name = false, $iBlockId = false) { if($ID === false && !$Name) return false; global $CACHE_MANAGER; if($ID !== false) $CACHE_MANAGER->ClearByTag('wiki_'.$ID); if(!$iBlockId) return true; $iCatId = CWikiSocnet::IsSocNet() ? CWikiSocnet::$iCatId : ""; if($ID !== false ) { $cacheByNameID = self::GetIdForCacheByName($iBlockId, $iCatId, $ID); $CACHE_MANAGER->Clean($cacheByNameID); if(!$Name) { $arFilter = array( 'IBLOCK_ID' => $iBlockId, 'CHECK_PERMISSIONS' => 'N' ); $arElement = self::GetElementById($ID, $arFilter); if($arElement != false) $elName = $arElement['NAME']; } else { $elName = $Name; } } $cacheByNameID = self::GetIdForCacheByName($iBlockId, $iCatId, $elName); $CACHE_MANAGER->Clean($cacheByNameID); return true; } private static function GetIdForCacheByName($iBlockId, $iSocCatId, $elementName) { return self::GET_BY_NAME_CACHE_ID.$iBlockId.$iSocCatId.$elementName; } public static function UnMarkPageAsUpdated($iBlockId, $iSocCatId, $name) { global $CACHE_MANAGER; $cacheId = self::GetCacheIdForPageUpdated($iBlockId, $iSocCatId, $name); $CACHE_MANAGER->Clean($cacheId); return true; } public static function IsPageUpdated($iBlockId, $iSocCatId, $name, $cacheTime = self::CWIKI_CACHE_TTL) { global $CACHE_MANAGER; $cacheId = self::GetCacheIdForPageUpdated($iBlockId, $iSocCatId, $name); if($CACHE_MANAGER->Read($cacheTime, $cacheID)) return ($CACHE_MANAGER->Get($cacheId) == "Y"); return false; } private static function MarkPageAsUpdated($iBlockId, $iSocCatId, $name) { global $CACHE_MANAGER; $cacheId = self::GetCacheIdForPageUpdated($iBlockId, $iSocCatId, $name); $CACHE_MANAGER->Set($cacheId, "Y"); return true; } private static function GetCacheIdForPageUpdated($iBlockId, $iSocCatId, $name) { return self::PAGE_UPDATED_CACHE_ID.$iBlockId.$iSocCatId.$name; } } ?>