PageRenderTime 46ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/components/bitrix/wiki.history/component.php

https://gitlab.com/alexprowars/bitrix
PHP | 465 lines | 398 code | 61 blank | 6 comment | 98 complexity | a357f2adf68027b66688741809ffbce0 MD5 | raw file
  1. <?if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();
  2. global $CACHE_MANAGER;
  3. $arParams['IN_COMPLEX'] = 'N';
  4. if (($arParent = $this->GetParent()) !== NULL)
  5. $arParams['IN_COMPLEX'] = 'Y';
  6. if(empty($arParams['PAGE_VAR']))
  7. $arParams['PAGE_VAR'] = 'title';
  8. if(empty($arParams['OPER_VAR']))
  9. $arParams['OPER_VAR'] = 'oper';
  10. $arParams['PATH_TO_POST'] = trim($arParams['PATH_TO_POST']);
  11. if(empty($arParams['SEF_MODE']))
  12. {
  13. $arParams['SEF_MODE'] = 'N';
  14. if ($arParams['IN_COMPLEX'] == 'Y')
  15. $arParams['SEF_MODE'] = $this->GetParent()->arResult['SEF_MODE'];
  16. }
  17. $arParams['NAME_TEMPLATE'] = empty($arParams['NAME_TEMPLATE']) ? CSite::GetNameFormat(false) : str_replace(array("#NOBR#","#/NOBR#"), array("",""), $arParams["NAME_TEMPLATE"]);
  18. $arCache = array();
  19. if(empty($arParams['SOCNET_GROUP_ID']) && $arParams['IN_COMPLEX'] == 'Y')
  20. {
  21. if (mb_strpos($this->GetParent()->GetName(), 'socialnetwork') !== false &&
  22. !empty($this->GetParent()->arResult['VARIABLES']['group_id']))
  23. $arParams['SOCNET_GROUP_ID'] = $this->GetParent()->arResult['VARIABLES']['group_id'];
  24. }
  25. if (!empty($arParams['SOCNET_GROUP_ID']))
  26. $arCache = array('SOCNET_GROUP_ID' => $arParams['SOCNET_GROUP_ID']);
  27. $arParams['PATH_TO_POST'] = trim($arParams['PATH_TO_POST']);
  28. if(empty($arParams['PATH_TO_POST']))
  29. $arParams['PATH_TO_POST'] = htmlspecialcharsbx($APPLICATION->GetCurPage()."?$arParams[PAGE_VAR]=#wiki_name#");
  30. $arParams['PATH_TO_HISTORY'] = trim($arParams['PATH_TO_HISTORY']);
  31. if($arParams['PATH_TO_HISTORY'] == '')
  32. {
  33. $arParams['PATH_TO_HISTORY'] = htmlspecialcharsbx($APPLICATION->GetCurPage()."?$arParams[PAGE_VAR]=#wiki_name#");
  34. if ($arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == 'Y')
  35. $arParams['PATH_TO_HISTORY'] = $this->GetParent()->arResult['PATH_TO_HISTORY'];
  36. }
  37. $arParams['PATH_TO_USER'] = trim($arParams['PATH_TO_USER']);
  38. if($arParams['PATH_TO_USER'] == '')
  39. {
  40. if ($arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == "Y")
  41. $arParams["PATH_TO_USER"] = $this->GetParent()->arParams['PATH_TO_USER'];
  42. }
  43. $arParams['PATH_TO_HISTORY_DIFF'] = trim($arParams['PATH_TO_HISTORY_DIFF']);
  44. if($arParams['PATH_TO_HISTORY_DIFF'] == '')
  45. $arParams['PATH_TO_HISTORY_DIFF'] = htmlspecialcharsbx($APPLICATION->GetCurPage()."?$arParams[PAGE_VAR]=#wiki_name#");
  46. $arParams['PATH_TO_CATEGORY'] = trim($arParams['PATH_TO_CATEGORY']);
  47. if($arParams['PATH_TO_CATEGORY'] == '')
  48. $arParams['PATH_TO_CATEGORY'] = htmlspecialcharsbx($APPLICATION->GetCurPage()."?$arParams[PAGE_VAR]=#wiki_name#");
  49. $arParams['PATH_TO_DISCUSSION'] = trim($arParams['PATH_TO_DISCUSSION']);
  50. if($arParams['PATH_TO_DISCUSSION'] == '')
  51. $arParams['PATH_TO_DISCUSSION'] = htmlspecialcharsbx($APPLICATION->GetCurPage()."?$arParams[PAGE_VAR]=#wiki_name#");
  52. if(empty($arParams['USE_REVIEW']))
  53. $arParams['USE_REVIEW'] = 'Y';
  54. if (empty($arParams['HISTORY_COUNT']))
  55. $arParams['HISTORY_COUNT'] = 20;
  56. $arNavParams = array(
  57. 'nPageSize' => $arParams['HISTORY_COUNT']
  58. );
  59. $arNavigation = CDBResult::GetNavParams($arNavParams);
  60. $historyId = 0;
  61. if (isset($_REQUEST['oldid']))
  62. {
  63. $historyId = intval($_REQUEST['oldid']);
  64. $arCache['oldid'] = $historyId;
  65. }
  66. $GLOBALS['arParams'] = $arParams;
  67. if (!CModule::IncludeModule('wiki'))
  68. {
  69. ShowError(GetMessage('WIKI_MODULE_NOT_INSTALLED'));
  70. return;
  71. }
  72. if(!CModule::IncludeModule('iblock'))
  73. {
  74. ShowError(GetMessage('IBLOCK_MODULE_NOT_INSTALLED'));
  75. return;
  76. }
  77. if(!CModule::IncludeModule('bizproc'))
  78. {
  79. ShowError(GetMessage('BIZPROC_MODULE_NOT_INSTALLED'));
  80. return;
  81. }
  82. if (empty($arParams['IBLOCK_ID']))
  83. {
  84. ShowError(GetMessage('IBLOCK_NOT_ASSIGNED'));
  85. return;
  86. }
  87. if (CWikiSocnet::isEnabledSocnet() && !empty($arParams['SOCNET_GROUP_ID']))
  88. {
  89. if(!CModule::IncludeModule('socialnetwork'))
  90. {
  91. ShowError(GetMessage('SOCNET_MODULE_NOT_INSTALLED'));
  92. return;
  93. }
  94. }
  95. if (array_key_exists('SOCNET_GROUP_ID', $arParams) && empty($arParams['SOCNET_GROUP_ID']))
  96. {
  97. ShowError(GetMessage('WIKI_ACCESS_DENIED'));
  98. return;
  99. }
  100. $arResult['SOCNET'] = false;
  101. if (CWikiSocnet::isEnabledSocnet() && !empty($arParams['SOCNET_GROUP_ID']))
  102. {
  103. $iblock_id_tmp = CWikiSocnet::RecalcIBlockID($arParams["SOCNET_GROUP_ID"]);
  104. if ($iblock_id_tmp)
  105. $arParams['IBLOCK_ID'] = $iblock_id_tmp;
  106. if (!CWikiSocnet::Init($arParams['SOCNET_GROUP_ID'], $arParams['IBLOCK_ID']))
  107. {
  108. ShowError(GetMessage('WIKI_SOCNET_INITIALIZING_FAILED'));
  109. return;
  110. }
  111. $arResult['SOCNET'] = true;
  112. }
  113. if (!CWikiUtils::IsReadable())
  114. {
  115. ShowError(GetMessage('WIKI_ACCESS_DENIED'));
  116. return;
  117. }
  118. $res = CIBlock::GetList(Array(), Array("ID"=>$arParams['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N'));
  119. $arIBLOCK = $res->GetNext();
  120. if (empty($arIBLOCK['BIZPROC']) || $arIBLOCK['BIZPROC'] != 'Y')
  121. {
  122. ShowError(GetMessage('WIKI_NOT_CHANGE_BIZPROC'));
  123. return;
  124. }
  125. //converts the old type of document to a new
  126. if (COption::GetOptionString('wiki', 'convert_history_'.$arParams['IBLOCK_ID'], 'N') == 'N')
  127. {
  128. $arFilter = array(
  129. 'IBLOCK_ID' => $arParams['IBLOCK_ID'],
  130. 'CHECK_PERMISSIONS' => 'N',
  131. 'ACTIVE' => 'Y'
  132. );
  133. $rsElement = CIBlockElement::GetList(array(), $arFilter, false, false, Array());
  134. while($arElement = $rsElement->GetNext())
  135. {
  136. CBPHistoryService::MergeHistory(array('iblock', 'CWikiDocument', $arElement['ID']), array('iblock', 'CIBlockDocument', $arElement['ID']));
  137. }
  138. COption::SetOptionString('wiki', 'convert_history_'.$arParams['IBLOCK_ID'], 'Y');
  139. LocalRedirect(CHTTP::urlAddParams(
  140. CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_HISTORY'],
  141. array(
  142. 'wiki_name' => $arParams['ELEMENT_NAME'],
  143. 'group_id' => CWikiSocnet::$iSocNetId
  144. )
  145. ),
  146. $arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == 'N' ? array($arParams['OPER_VAR'] => 'history') : array()
  147. ));
  148. return ;
  149. }
  150. CUtil::InitJSCore(array("ajax", "tooltip")); //http://jabber.bx/view.php?id=30695
  151. if($this->StartResultCache(false, array($USER->GetGroups(), $arNavigation, $arCache), false))
  152. {
  153. $arResult['USE_REVIEW'] = $arParams['USE_REVIEW'];
  154. $arResult['ELEMENT'] = array();
  155. $arParams['ELEMENT_NAME'] = rawurldecode($arParams['ELEMENT_NAME']);
  156. $arFilter = array(
  157. 'IBLOCK_ID' => $arParams['IBLOCK_ID'],
  158. 'CHECK_PERMISSIONS' => 'N',
  159. 'ACTIVE' => 'Y'
  160. );
  161. if (empty($arParams['ELEMENT_NAME']))
  162. $arParams['ELEMENT_NAME'] = CWiki::GetDefaultPage($arParams['IBLOCK_ID']);
  163. if (!empty($arParams['ELEMENT_NAME']) && ($arResult['ELEMENT'] = CWiki::GetElementByName($arParams['ELEMENT_NAME'], $arFilter)) != false)
  164. $arParams['ELEMENT_ID'] = $arResult['ELEMENT']['ID'];
  165. else
  166. {
  167. $this->AbortResultCache();
  168. return;
  169. }
  170. //$arResult['TOPLINKS'] = CWikiUtils::getRightsLinks(array('article', 'history'), $arParams);
  171. $documentId = array('iblock', 'CWikiDocument', $arParams['ELEMENT_ID']);
  172. $bCanUserWrite = CBPDocument::CanUserOperateDocument(
  173. CBPCanUserOperateOperation::WriteDocument,
  174. $GLOBALS['USER']->GetID(),
  175. $documentId,
  176. array('UserGroups' => $GLOBALS['USER']->GetUserGroupArray())
  177. );
  178. if (!$bCanUserWrite)
  179. {
  180. $this->AbortResultCache();
  181. ShowError(GetMessage('WIKI_ACCESS_DENIED'));
  182. return;
  183. }
  184. if(!empty($historyId) && check_bitrix_sessid())
  185. {
  186. $this->AbortResultCache();
  187. if (isset($_REQUEST['delete']))
  188. {
  189. if (CWikiUtils::IsDeleteable())
  190. {
  191. $historyService = new CBPHistoryService();
  192. $historyService->DeleteHistory($historyId, array('iblock', 'CWikiDocument', $arParams['ELEMENT_ID']));
  193. $CACHE_MANAGER->ClearByTag('wiki_'.$arParams['ELEMENT_ID']);
  194. LocalRedirect(
  195. CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_HISTORY'],
  196. array(
  197. 'wiki_name' => $arParams['ELEMENT_NAME'],
  198. 'group_id' => CWikiSocnet::$iSocNetId
  199. )
  200. )
  201. );
  202. }
  203. else
  204. {
  205. $this->AbortResultCache();
  206. ShowError(GetMessage('WIKI_ACCESS_DENIED'));
  207. return;
  208. }
  209. }
  210. else
  211. {
  212. try
  213. {
  214. $CWIKI = new CWiki();
  215. if ($CWIKI->Recover($historyId, $arParams['ELEMENT_ID'], $arParams['IBLOCK_ID']))
  216. {
  217. // $arResult["MESSAGE"] = GetMessage('WIKI_PAGE_RECOVER');
  218. // so how could it change the name
  219. $arResult['ELEMENT_NEW'] = CWiki::GetElementById($arParams['ELEMENT_ID'], $arFilter);
  220. if (CWiki::GetDefaultPage($arParams['IBLOCK_ID']) == $arResult['ELEMENT']['NAME'] &&
  221. $arResult['ELEMENT']['NAME'] != $arResult['ELEMENT_NEW']['NAME'])
  222. CWiki::SetDefaultPage($arParams['IBLOCK_ID'], $arResult['ELEMENT_NEW']['NAME']);
  223. $CACHE_MANAGER->ClearByTag('wiki_'.$arParams['ELEMENT_ID']);
  224. LocalRedirect(
  225. CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_POST'],
  226. array(
  227. 'wiki_name' => rawurlencode($arResult['ELEMENT_NEW']['NAME']),
  228. 'group_id' => CWikiSocnet::$iSocNetId
  229. )
  230. )
  231. );
  232. }
  233. else
  234. $arResult['FATAL_MESSAGE'] = GetMessage('WIKI_PAGE_RECOVER_ERROR');
  235. }
  236. catch (Exception $e)
  237. {
  238. $arResult['FATAL_MESSAGE'] = $e->getMessage();
  239. }
  240. }
  241. }
  242. $history = new CBPHistoryService();
  243. $arFilter = array('DOCUMENT_ID' => $documentId);
  244. $dbResultList = $history->GetHistoryList(
  245. array('ID' => 'DESC'),
  246. $arFilter,
  247. false,
  248. false,
  249. array('ID', 'DOCUMENT_ID', 'NAME', 'MODIFIED', 'USER_ID', 'USER_NAME', 'USER_LAST_NAME', 'USER_SECOND_NAME', 'USER_LOGIN')
  250. );
  251. $dbResultListFirst = $history->GetHistoryList(
  252. array('ID' => 'DESC'),
  253. $arFilter,
  254. false,
  255. false,
  256. array('ID')
  257. );
  258. $arResult['PAGE_VAR'] = $arParams['PAGE_VAR'];
  259. $arResult['OPER_VAR'] = $arParams['OPER_VAR'];
  260. $arResult['PATH_TO_HISTORY_DIFF'] = CHTTP::urlAddParams(
  261. CComponentEngine::MakePathFromTemplate(
  262. $arParams['PATH_TO_HISTORY_DIFF'],
  263. array(
  264. 'wiki_name' => rawurlencode($arParams['ELEMENT_NAME']),
  265. 'group_id' => CWikiSocnet::$iSocNetId
  266. )
  267. ),
  268. $arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == 'N' ? array($arParams['OPER_VAR'] => 'history_diff') : array()
  269. );
  270. $sTableID = 'tbl_bizproc_document_history';
  271. $rsHistoryFirst= new CDBResult($dbResultListFirst, $sTableID);
  272. $arHistoryFirst = $rsHistoryFirst->GetNext();
  273. $rsHistory= new CDBResult($dbResultList, $sTableID);
  274. $rsHistory->NavStart($arParams['HISTORY_COUNT'], false);
  275. $arResult['DB_LIST'] = &$rsHistory;
  276. $arResult['HISTORY'] = array();
  277. if ($arResult['SOCNET'])
  278. {
  279. $arResult['AJAX_PAGE'] = $APPLICATION->GetCurPageParam('', array('bxajaxid', 'logout'));
  280. $arResult['PATH_TO_USER'] = $arParams['PATH_TO_USER'];
  281. $arResult['SHOW_LOGIN'] = $this->GetParent()->arParams['SHOW_LOGIN'];
  282. $arResult['NAME_TEMPLATE'] = $this->GetParent()->arParams['NAME_TEMPLATE'];
  283. $arResult['PATH_TO_CONPANY_DEPARTMENT'] = $this->GetParent()->arParams['PATH_TO_CONPANY_DEPARTMENT'];
  284. $arResult['PATH_TO_VIDEO_CALL'] = $this->GetParent()->arParams['PATH_TO_VIDEO_CALL'];
  285. $arResult['PATH_TO_SONET_MESSAGES_CHAT'] = $this->GetParent()->arParams['PATH_TO_MESSAGES_CHAT'];
  286. }
  287. $arErrorsTmp = array();
  288. while($arHistory = $rsHistory->GetNext())
  289. {
  290. $arHistory['USER_LINK'] = '';
  291. $arHistoryResult = CBPDocument::GetDocumentFromHistory($arHistory['ID'], $arErrorsTmp);
  292. $arHistory["MODIFY_COMMENT"] = $arHistoryResult["DOCUMENT"]["MODIFY_COMMENT"];
  293. if (!empty($arParams['PATH_TO_USER']))
  294. {
  295. $arHistory['USER_LINK'] = CHTTP::urlAddParams(
  296. CComponentEngine::MakePathFromTemplate(
  297. $arParams['PATH_TO_USER'],
  298. array(
  299. 'wiki_name' => rawurlencode($arParams['ELEMENT_NAME']),
  300. 'group_id' => CWikiSocnet::$iSocNetId,
  301. 'user_id' => $arHistory['USER_ID']
  302. )
  303. ),
  304. array()
  305. );
  306. }
  307. /*CBPHistoryService::GetHistoryList() returns specialchared values
  308. and CWikiUtils::GetUserLogin also do htmlspecialchars*/
  309. foreach (array('USER_LOGIN','USER_NAME','USER_LAST_NAME','USER_SECOND_NAME') as $key)
  310. $arHistory[$key] = CWikiUtils::htmlspecialchars_decode($arHistory[$key]);
  311. $arHistory['USER_LOGIN'] = CWikiUtils::GetUserLogin($arHistory, $arParams["NAME_TEMPLATE"]);
  312. $arHistory['DISCUSSION_LINK'] = CHTTP::urlAddParams(
  313. CComponentEngine::MakePathFromTemplate(
  314. $arParams['PATH_TO_DISCUSSION'],
  315. array(
  316. 'wiki_name' => rawurlencode($arParams['ELEMENT_NAME']),
  317. 'group_id' => CWikiSocnet::$iSocNetId
  318. )
  319. ),
  320. $arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == 'N' ? array($arParams['OPER_VAR'] => 'discussion') : array()
  321. );
  322. $arHistory['SHOW_LINK'] = CHTTP::urlAddParams(
  323. CComponentEngine::MakePathFromTemplate(
  324. $arParams['PATH_TO_POST'],
  325. array(
  326. 'wiki_name' => rawurlencode($arParams['ELEMENT_NAME']),
  327. 'group_id' => CWikiSocnet::$iSocNetId
  328. )
  329. ),
  330. array('oldid' => $arHistory['ID'])
  331. );
  332. $arHp = array('oldid' => $arHistory['ID'], 'sessid' => bitrix_sessid());
  333. if ($arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == 'N')
  334. $arHp[$arParams['OPER_VAR']] = 'history';
  335. $arHistory['CANCEL_LINK'] = CHTTP::urlAddParams(
  336. CComponentEngine::MakePathFromTemplate(
  337. $arParams['PATH_TO_HISTORY'],
  338. array(
  339. 'wiki_name' => rawurlencode($arParams['ELEMENT_NAME']),
  340. 'group_id' => CWikiSocnet::$iSocNetId
  341. )
  342. ),
  343. $arHp
  344. );
  345. if ($arHistoryFirst['ID'] != $arHistory['ID'])
  346. {
  347. $arHp = array('diffid' => $arHistoryFirst['ID'], 'oldid' => $arHistory['ID']);
  348. if ($arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == 'N')
  349. $arHp[$arParams['OPER_VAR']] = 'history_diff';
  350. $arHistory['CUR_LINK'] = CHTTP::urlAddParams(
  351. CComponentEngine::MakePathFromTemplate(
  352. $arParams['PATH_TO_HISTORY_DIFF'],
  353. array(
  354. 'wiki_name' => rawurlencode($arParams['ELEMENT_NAME']),
  355. 'group_id' => CWikiSocnet::$iSocNetId
  356. )
  357. ),
  358. $arHp
  359. );
  360. }
  361. if (CWikiUtils::IsDeleteable())
  362. {
  363. $arHp = array('oldid' => $arHistory['ID'], 'sessid' => bitrix_sessid(), 'delete' => 1);
  364. if ($arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == 'N')
  365. $arHp[$arParams['OPER_VAR']] = 'history';
  366. $arHistory['DELETE_LINK'] = CHTTP::urlAddParams(
  367. CComponentEngine::MakePathFromTemplate(
  368. $arParams['PATH_TO_HISTORY'],
  369. array(
  370. 'wiki_name' => rawurlencode($arParams['ELEMENT_NAME']),
  371. 'group_id' => CWikiSocnet::$iSocNetId
  372. )
  373. ),
  374. $arHp
  375. );
  376. }
  377. $arHistory['MODIFIED'] = FormatDateFromDB($arHistory['MODIFIED']);
  378. $arResult['HISTORY'][] = $arHistory;
  379. $iPrev = count($arResult['HISTORY']) - 2;
  380. if (isset($arResult['HISTORY'][$iPrev]))
  381. {
  382. $arHp = array('diffid' => $arResult['HISTORY'][$iPrev]['ID'], 'oldid' => $arHistory['ID']);
  383. if ($arParams['IN_COMPLEX'] == 'Y' && $arParams['SEF_MODE'] == 'N')
  384. $arHp[$arParams['OPER_VAR']] = 'history_diff';
  385. $arResult['HISTORY'][$iPrev]['PREV_LINK'] = CHTTP::urlAddParams(
  386. CComponentEngine::MakePathFromTemplate(
  387. $arParams['PATH_TO_HISTORY_DIFF'],
  388. array(
  389. 'wiki_name' => rawurlencode($arParams['ELEMENT_NAME']),
  390. 'group_id' => CWikiSocnet::$iSocNetId
  391. )
  392. ),
  393. $arHp
  394. );
  395. }
  396. }
  397. $CACHE_MANAGER->StartTagCache($this->GetCachePath());
  398. $CACHE_MANAGER->RegisterTag('wiki_'.$arParams['ELEMENT_ID']);
  399. $CACHE_MANAGER->EndTagCache();
  400. $this->IncludeComponentTemplate();
  401. }
  402. include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/components/bitrix/wiki/include/nav.php');
  403. unset($GLOBALS['arParams']);
  404. ?>