PageRenderTime 45ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/iblock/admin/iblock_reindex.php

https://gitlab.com/alexprowars/bitrix
PHP | 298 lines | 282 code | 15 blank | 1 comment | 23 complexity | 738d3037c425ba7dd7ab43cc6139f9ec MD5 | raw file
  1. <?
  2. /** @global CMain $APPLICATION */
  3. use Bitrix\Main\Loader;
  4. require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
  5. Loader::includeModule('iblock');
  6. require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/prolog.php");
  7. IncludeModuleLangFile(__FILE__);
  8. $IBLOCK_ID = (isset($_GET['IBLOCK_ID']) ? (int)$_GET['IBLOCK_ID'] : 0);
  9. if (!CIBlockRights::UserHasRightTo($IBLOCK_ID, $IBLOCK_ID, "iblock_edit"))
  10. $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
  11. $max_execution_time = (isset($_REQUEST['max_execution_time']) ? (int)$_REQUEST['max_execution_time'] : 0);
  12. if ($max_execution_time <= 0)
  13. $max_execution_time = 20;
  14. $res = false;
  15. $iblockDropDown = array();
  16. $iblockFilter = array('=PROPERTY_INDEX' => 'I');
  17. if (Loader::includeModule('catalog'))
  18. {
  19. $OfferIblocks = array();
  20. $offersIterator = \Bitrix\Catalog\CatalogIblockTable::getList(array(
  21. 'select' => array('IBLOCK_ID'),
  22. 'filter' => array('!PRODUCT_IBLOCK_ID' => 0)
  23. ));
  24. while ($offer = $offersIterator->fetch())
  25. {
  26. $OfferIblocks[] = (int)$offer['IBLOCK_ID'];
  27. }
  28. if (!empty($OfferIblocks))
  29. {
  30. unset($offer);
  31. $iblockFilter['!ID'] = $OfferIblocks;
  32. }
  33. unset($offersIterator, $OfferIblocks);
  34. }
  35. $iblockList = \Bitrix\Iblock\IblockTable::getList(array(
  36. 'select' => array('ID', 'NAME', 'ACTIVE'),
  37. 'filter' => $iblockFilter,
  38. 'order' => array('ID' => 'asc', 'NAME' => 'asc'),
  39. ));
  40. while ($iblockInfo = $iblockList->fetch())
  41. {
  42. $iblockDropDown[$iblockInfo['ID']] = '['.$iblockInfo['ID'].'] '.$iblockInfo['NAME'].($iblockInfo['ACTIVE'] == 'N' ? ' ('.GetMessage('IBLOCK_REINDEX_DEACTIVE').')' : '');
  43. }
  44. unset($iblockInfo, $iblockList);
  45. if($_SERVER["REQUEST_METHOD"] == "POST" && $_REQUEST["Reindex"]=="Y")
  46. {
  47. CUtil::JSPostUnescape();
  48. require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php");
  49. if (empty($iblockDropDown))
  50. {
  51. $message = new CAdminMessage(array(
  52. "MESSAGE" => GetMessage("IBLOCK_REINDEX_COMPLETE"),
  53. "DETAILS" => GetMessage("IBLOCK_REINDEX_TOTAL_COMPLETE"),
  54. "HTML" => true,
  55. "TYPE" => "OK",
  56. ));
  57. echo $message->Show();
  58. }
  59. else
  60. {
  61. if (!isset($iblockDropDown[$IBLOCK_ID]))
  62. $IBLOCK_ID = key($iblockDropDown);
  63. $index = \Bitrix\Iblock\PropertyIndex\Manager::createIndexer($IBLOCK_ID);
  64. if (!empty($_POST["NS"]) && is_array($_POST["NS"]))
  65. {
  66. $NS = $_POST["NS"];
  67. }
  68. else
  69. {
  70. $NS = array();
  71. }
  72. if (!isset($NS[$IBLOCK_ID]))
  73. {
  74. $NS[$IBLOCK_ID] = array(
  75. "CNT" => 0,
  76. "LAST_ID" => 0,
  77. );
  78. $index->startIndex();
  79. $NS[$IBLOCK_ID]["TOTAL"] = $index->estimateElementCount();
  80. }
  81. $index->setLastElementId($NS[$IBLOCK_ID]["LAST_ID"]);
  82. $res = $index->continueIndex($max_execution_time);
  83. if ($res > 0)
  84. {
  85. $NS[$IBLOCK_ID]["CNT"] += $res;
  86. $NS[$IBLOCK_ID]["LAST_ID"] = $index->getLastElementId();
  87. $message = new CAdminMessage(array(
  88. "MESSAGE" => GetMessage("IBLOCK_REINDEX_IN_PROGRESS"),
  89. "DETAILS" => GetMessage("IBLOCK_REINDEX_TOTAL") . " <span id=\"some_left\"><b>" . $NS[$IBLOCK_ID]["CNT"] . "</b></span><br>#PROGRESS_BAR#",
  90. "HTML" => true,
  91. "TYPE" => "PROGRESS",
  92. "PROGRESS_TOTAL" => $NS[$IBLOCK_ID]["TOTAL"],
  93. "PROGRESS_VALUE" => $NS[$IBLOCK_ID]["CNT"],
  94. ));
  95. echo $message->Show();
  96. ?>
  97. <script type="text/javascript">
  98. jsSelectUtils.selectOption(BX('iblock'), <?echo $IBLOCK_ID?>);
  99. DoNext(<?echo CUtil::PhpToJSObject($NS)?>);
  100. </script>
  101. <?
  102. }
  103. else
  104. {
  105. $index->endIndex();
  106. \Bitrix\Iblock\PropertyIndex\Manager::checkAdminNotification();
  107. CBitrixComponent::clearComponentCache("bitrix:catalog.smart.filter");
  108. CIBlock::clearIblockTagCache($IBLOCK_ID);
  109. unset($iblockDropDown[$IBLOCK_ID]);
  110. if (empty($iblockDropDown) || $NS['iblock'] > 0)
  111. $mess = GetMessage("IBLOCK_REINDEX_TOTAL") . " <b>" . $NS[$IBLOCK_ID]["CNT"] . "</b>";
  112. else
  113. $mess = GetMessage("IBLOCK_REINDEX_TOTAL") . " <span id=\"some_left\"><b>" . $NS[$IBLOCK_ID]["CNT"] . "</b></span>";
  114. $message = new CAdminMessage(array(
  115. "MESSAGE" => GetMessage("IBLOCK_REINDEX_COMPLETE"),
  116. "DETAILS" => $mess,
  117. "HTML" => true,
  118. "TYPE" => "OK",
  119. ));
  120. echo $message->Show();
  121. ?>
  122. <script type="text/javascript">
  123. jsSelectUtils.deleteOption(BX('iblock'), <?echo $IBLOCK_ID?>);
  124. <?
  125. if (!empty($iblockDropDown) && $NS['iblock'] <= 0)
  126. {
  127. $IBLOCK_ID = key($iblockDropDown);
  128. ?>
  129. jsSelectUtils.selectOption(BX('iblock'), <?echo $IBLOCK_ID?>);
  130. DoNext(<?echo CUtil::PhpToJSObject($NS)?>);
  131. <?
  132. }
  133. ?>
  134. </script>
  135. <?
  136. }
  137. }
  138. require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin_js.php");
  139. }
  140. elseif (empty($iblockDropDown))
  141. {
  142. $APPLICATION->SetTitle(GetMessage("IBLOCK_REINDEX_TITLE"));
  143. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");
  144. $message = new CAdminMessage(array(
  145. "DETAILS" => GetMessage("IBLOCK_REINDEX_TOTAL_COMPLETE"),
  146. "HTML" => true,
  147. "TYPE" => "OK",
  148. ));
  149. echo $message->Show();
  150. $aMenu = array(
  151. array(
  152. "TEXT" => GetMessage("IBLOCK_BACK_TO_ADMIN"),
  153. "LINK" => '/bitrix/admin/iblock_reindex_admin.php?lang='.LANGUAGE_ID,
  154. "ICON" => "btn_list",
  155. )
  156. );
  157. $context = new CAdminContextMenu($aMenu);
  158. $context->Show();
  159. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
  160. }
  161. else
  162. {
  163. $APPLICATION->SetTitle(GetMessage("IBLOCK_REINDEX_TITLE"));
  164. $aTabs = array(
  165. array(
  166. "DIV" => "edit1",
  167. "TAB" => GetMessage("IBLOCK_REINDEX_TAB"),
  168. "ICON" => "main_user_edit",
  169. "TITLE" => GetMessage("IBLOCK_REINDEX_TAB_TITLE"),
  170. ),
  171. );
  172. $tabControl = new CAdminTabControl("tabControl", $aTabs, true, true);
  173. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");
  174. ?>
  175. <script type="text/javascript">
  176. var savedNS,
  177. stop,
  178. interval = 0;
  179. function StartReindex()
  180. {
  181. stop = false;
  182. BX('reindex_result_div').innerHTML = '';
  183. BX('stop_button').disabled = false;
  184. BX('start_button').disabled = true;
  185. BX('continue_button').disabled = true;
  186. DoNext({iblock: BX('iblock').value});
  187. }
  188. function StopReindex()
  189. {
  190. stop = true;
  191. BX('stop_button').disabled = true;
  192. BX('start_button').disabled = false;
  193. BX('continue_button').disabled = false;
  194. }
  195. function ContinueReindex()
  196. {
  197. stop = false;
  198. BX('stop_button').disabled = false;
  199. BX('start_button').disabled = true;
  200. BX('continue_button').disabled = true;
  201. DoNext(savedNS);
  202. }
  203. function EndReindex()
  204. {
  205. stop = true;
  206. BX('stop_button').disabled = true;
  207. BX('start_button').disabled = false;
  208. BX('continue_button').disabled = true;
  209. }
  210. function DoNext(NS)
  211. {
  212. var queryString = 'Reindex=Y'
  213. + '&lang=<?echo LANGUAGE_ID?>'
  214. + '&IBLOCK_ID=' + BX('iblock').value
  215. ;
  216. savedNS = NS;
  217. if(!stop)
  218. {
  219. BX.showWait();
  220. BX.ajax.post(
  221. 'iblock_reindex.php?' + queryString,
  222. {
  223. 'NS': NS,
  224. 'max_execution_time': BX('max_execution_time').value,
  225. 'sessid': BX.bitrix_sessid()
  226. },
  227. function(result)
  228. {
  229. BX('reindex_result_div').innerHTML = result;
  230. BX.closeWait();
  231. if(!BX('some_left'))
  232. {
  233. EndReindex();
  234. }
  235. }
  236. );
  237. }
  238. }
  239. </script>
  240. <div id="reindex_result_div"></div>
  241. <?
  242. $aMenu = array(
  243. array(
  244. "TEXT" => GetMessage("IBLOCK_BACK_TO_ADMIN"),
  245. "LINK" => '/bitrix/admin/iblock_reindex_admin.php?lang='.LANGUAGE_ID,
  246. "ICON" => "btn_list",
  247. )
  248. );
  249. $context = new CAdminContextMenu($aMenu);
  250. $context->Show();
  251. ?>
  252. <form method="POST" action="<?echo $APPLICATION->GetCurPage()?>?lang=<?echo htmlspecialcharsbx(LANG)?>" name="fs1">
  253. <?
  254. $tabControl->Begin();
  255. $tabControl->BeginNextTab();
  256. ?>
  257. <tr>
  258. <td><label for="iblock"><?echo GetMessage("IBLOCK_REINDEX_IBLOCK")?></label></td>
  259. <td><select name="iblock" id="iblock"> <?echo GetMessage("IBLOCK_REINDEX_STEP_SEC")?>
  260. <option value=""><?echo GetMessage('MAIN_ALL')?></option>
  261. <?foreach ($iblockDropDown as $key => $value)
  262. {
  263. ?><option value="<?echo htmlspecialcharsbx($key)?>" <?if ($_GET['IBLOCK_ID'] == $key) echo 'selected="selected"';?>><?echo htmlspecialcharsEx($value)?></option><?
  264. }?>
  265. </select></td>
  266. </tr>
  267. <tr>
  268. <td><label for="max_execution_time"><?echo GetMessage("IBLOCK_REINDEX_STEP")?></label></td>
  269. <td><input type="text" name="max_execution_time" id="max_execution_time" size="3" value="<?echo $max_execution_time;?>"> <?echo GetMessage("IBLOCK_REINDEX_STEP_SEC")?></td>
  270. </tr>
  271. <?
  272. $tabControl->Buttons();
  273. ?>
  274. <input type="button" id="start_button" value="<?echo GetMessage("IBLOCK_REINDEX_START_BUTTON")?>" OnClick="StartReindex();" class="adm-btn-save">
  275. <input type="button" id="stop_button" value="<?=GetMessage("IBLOCK_REINDEX_STOP_BUTTON")?>" OnClick="StopReindex();" disabled>
  276. <input type="button" id="continue_button" value="<?=GetMessage("IBLOCK_REINDEX_CONTINUE_BUTTON")?>" OnClick="ContinueReindex();" disabled>
  277. <?
  278. $tabControl->End();
  279. ?>
  280. </form>
  281. <?
  282. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
  283. }