Следи за нами

Пошаговое удаление элементов инфоблока

Дата создания: г.

Представляю вашему вниманию скрипт, позволяющий настроить автоматическое удаление всех элементов инфоблока с постраничной переборкой элементов в автоматическом режиме

Иногда приходится сталкиваться с сайтами, которые размещены на очень слабом хостинге. Если на таком хостинге нужно удалить все элементы инфоблока - тут или удалять напрямую, через базу данных (что не очень хорошо), либо постранично удалять элементы, что тоже муторно :(

use Bitrix\Main; use Bitrix\Main\Application; use \Bitrix\Main\Localization\Loc as Loc; use \Bitrix\Main\Data\Cache; require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_before.php"); require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/prolog.php"); Loc::loadMessages(__FILE__); if (!Main\Loader::includeModule('iblock')) { die('Module `iblock` is not installed'); } CJSCore::Init(array('jquery')); $POST_RIGHT = $APPLICATION-&gt;GetGroupRight("catalog"); // если нет прав - отправим к форме авторизации с сообщением об ошибке if ($POST_RIGHT == "D") $APPLICATION-&gt;AuthForm(GetMessage("ACCESS_DENIED")); $context = Application::getInstance()-&gt;getContext(); $request = $context-&gt;getRequest(); if ($request-&gt;isPost() &amp;&amp; $request-&gt;get('action') &amp;&amp; $POST_RIGHT == "W" &amp;&amp; check_bitrix_sessid()) { $arResult = array(); $arPostData = $request-&gt;getPostList()-&gt;toArray(); switch ($request-&gt;get('action')) { case 'clearElements': $arSelect = Array("ID", "IBLOCK_ID"); $arFilter = Array("IBLOCK_ID" =&gt; IntVal($arPostData['IBLOCK_ID'])); $maxForStep = 5; $pagesParams = ($arPostData['num'] == 1) ? array('nPageSize' =&gt; $maxForStep) : array('nTopCount' =&gt; $maxForStep); $res = CIBlockElement::GetList(Array(), $arFilter, false, $pagesParams, $arSelect); $arResult['CNT'] = $res-&gt;NavPageCount; global $DB; while ($arFields = $res-&gt;GetNext()) { $DB-&gt;StartTransaction(); if (!\CIBlockElement::Delete($arFields['ID'])) { $arResult['STATUS']['ERROR'][] = $arFields['ID'] . ' not deleted!'; $DB-&gt;Rollback(); } else { $arResult['STATUS']['OK'][] = $arFields['ID']; $DB-&gt;Commit(); } // $arResult[] = $arFields; } break; default: print_r($arPostData); } if ($request-&gt;isAjaxRequest() &amp;&amp; !empty($arResult)) { $APPLICATION-&gt;RestartBuffer(); header('Content-type: application/json'); echo \Bitrix\Main\Web\Json::encode($arResult); exit(); } } $APPLICATION-&gt;SetTitle('Обработчик элементов информационного блока'); require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"); class clIblockEntitiesProcessor { public static function GetIblockTypes($life_time = 3600 * 24 * 30) { $result = false; $cache_params = array('function' =&gt; 'CIBlockType::GetList'); $cache_id = md5(serialize($cache_params)); $cache_dir = __CLASS__; $cache = Cache::createInstance(); if ($life_time clean($cache_id, $cache_dir); } if ($cache-&gt;initCache($life_time, $cache_id, $cache_dir)) { $result = $cache-&gt;getVars(); } elseif ($cache-&gt;startDataCache() &amp;&amp; \Bitrix\Main\Loader::includeModule('iblock')) { $db_iblock_type = \CIBlockType::GetList(); while ($ar_iblock_type = $db_iblock_type-&gt;Fetch()) { if ($arIBType = \CIBlockType::GetByIDLang($ar_iblock_type["ID"], LANG)) { $arIBType['NAME'] = htmlspecialcharsEx($arIBType["NAME"]); $result[$arIBType['IBLOCK_TYPE_ID']] = array( 'IBLOCK_TYPE_ID' =&gt; $arIBType['IBLOCK_TYPE_ID'], 'NAME' =&gt; $arIBType['NAME'], ); } } $cache-&gt;endDataCache($result); } return $result; } public static function GetIblockList($filter = array(), $life_time = 3600 * 24 * 30) { $result = false; $cache_params = array('function' =&gt; 'CIBlock::GetList', 'filter_params' =&gt; $filter); $cache_id = md5(serialize($cache_params)); $cache_dir = __CLASS__; $cache = \Bitrix\Main\Data\Cache::createInstance(); if ($life_time clean($cache_id, $cache_dir); } if ($cache-&gt;initCache($life_time, $cache_id, $cache_dir)) { $result = $cache-&gt;getVars(); } elseif ($cache-&gt;startDataCache() &amp;&amp; \Bitrix\Main\Loader::includeModule('iblock')) { $res = \CIBlock::GetList( Array(), $filter, false ); while ($ar_res = $res-&gt;Fetch()) { $result[$ar_res['ID']] = array( 'ID' =&gt; $ar_res['ID'], 'IBLOCK_TYPE_ID' =&gt; $ar_res['IBLOCK_TYPE_ID'], 'CODE' =&gt; $ar_res['CODE'], 'NAME' =&gt; $ar_res['NAME'], 'ACTIVE' =&gt; $ar_res['ACTIVE'], 'PICTURE' =&gt; $ar_res['PICTURE'], 'DESCRIPTION' =&gt; $ar_res['DESCRIPTION'], 'DESCRIPTION_TYPE' =&gt; $ar_res['DESCRIPTION_TYPE'], 'CATALOG' =&gt; \CCatalogSKU::GetInfoByProductIBlock(intval($ar_res['ID'])), ); } $cache-&gt;endDataCache($result); } return $result; } public static function GetIblockElementItems( $arParams = array('filter' =&gt; array(), 'select' =&gt; false, 'sort' =&gt; array('name' =&gt; 'asc'), 'page_params' =&gt; false, 'group' =&gt; false), $life_time = 3600) { if (!isset($arParams['filter']) || empty($arParams['filter'])) return false; $arFilter = $arParams['filter']; $arSelect = (isset($arParams['select'])) ? $arParams['select'] : false; $arSort = (isset($arParams['sort'])) ? $arParams['sort'] : array('name' =&gt; 'asc'); $pageParams = (isset($arParams['page_params'])) ? $arParams['page_params'] : false; $groupParams = (isset($arParams['group'])) ? $arParams['group'] : false; $result = false; $cache_params = array(); foreach (array_keys($arParams) as $array_key) { if (is_array($arParams[$array_key])) { foreach ($arParams[$array_key] as $key =&gt; $value) { $cache_params[$array_key . '-' . $key] = $value; } } elseif (is_bool($arParams[$array_key])) { $cache_params[$array_key] = $arParams[$array_key] ? 1 : 0; } } $cache_id = md5(serialize($cache_params)); $cache_dir = __CLASS__ . '/' . __FUNCTION__; $cache = \Bitrix\Main\Data\Cache::createInstance(); if ($life_time clean($cache_id, $cache_dir); } if ($cache-&gt;initCache($life_time, $cache_id, $cache_dir)) { $result = $cache-&gt;getVars(); } elseif ($cache-&gt;startDataCache() &amp;&amp; \Bitrix\Main\Loader::includeModule('iblock')) { $rsItems = \CIBlockElement::GetList($arSort, $arFilter, $groupParams, $pageParams, $arSelect); if ( is_array($arSelect) &amp;&amp; in_array('IBLOCK_ID', $arSelect) &amp;&amp; in_array('ID', $arSelect) ) { $filterProperties = array(); foreach ($arSelect as $select) { if (strpos($select, 'PROPERTY_') !== false) { $filterProperties[] = str_replace('PROPERTY_', '', $select); } } while ($arElement = $rsItems-&gt;GetNextElement()) { $arFields = $arElement-&gt;GetFields(); if (!empty($filterProperties)) { foreach ($filterProperties as $arFilterCode) { if (!isset($arFields['PROPERTIES'])) $arFields['PROPERTIES'] = array(); $arFields['PROPERTIES'] = array_merge($arFields['PROPERTIES'], $arElement-&gt;GetProperties(false, array( 'CODE' =&gt; $arFilterCode ))); // $arFields['PROPERTIES'][$arFilterCode] = ; } // $arFields['PROPERTIES'] = $arElement-&gt;GetProperties(false,array('CODE'=&gt;$filterProperties)); } $result[] = $arFields; } } elseif (empty($arSelect)) { while ($arElement = $rsItems-&gt;GetNextElement()) { $arFields = $arElement-&gt;GetFields(); $arFields['PROPERTIES'] = $arElement-&gt;GetProperties(); $result[] = $arFields; } } else { while ($arElement = $rsItems-&gt;GetNext()) { $result[] = $arElement; } } if (!empty($result)) { foreach ($result as $key =&gt; $arItem) { if (!empty($arItem['PROPERTIES'])) { foreach ($arItem['PROPERTIES'] as $pCode =&gt; $arProperty) { $result[$key]['PROPERTIES'][$pCode] = \CIBlockFormatProperties::GetDisplayValue( array('ID' =&gt; $arItem['ID'], 'NAME' =&gt; $arItem['NAME']), $arProperty, ''); } } } } if (isset($pageParams) &amp;&amp; !empty($pageParams) &amp;&amp; $pageParams['nPageSize'] == 1 &amp;&amp; !empty($result[0])) { $result = $result[0]; } $cache-&gt;endDataCache($result); } return $result; } } $tmp = clIblockEntitiesProcessor::GetIblockList(array('ACTIVE' =&gt; 'Y')); $arIblockList = array(); foreach ($tmp as $item) { $arIblockList[$item['ID']] = $item; } // echo '&lt;pre&gt;'; print_r($arIblockList);echo '&lt;/pre&gt;'; ?&gt; &lt;form method="post" action="&lt;? echo $APPLICATION-&gt;GetCurPage() ?&gt;" enctype="multipart/form-data" name="iblocksProcessorForm"&gt; &lt;? echo bitrix_sessid_post(); ?&gt; &lt;div&gt; &lt;select name="IBLOCK_ID" id="IBLOCK_ID"&gt; &lt;? foreach ($arIblockList as $arIblock) { ?&gt; &lt;option value="&lt;?= $arIblock['ID'] ?&gt;"&gt;[&lt;?= $arIblock['ID'] ?&gt;] &lt;?= $arIblock['NAME'] ?&gt;&lt;/option&gt; &lt;? } ?&gt; &lt;/select&gt; &lt;/div&gt; &lt;div id="loading"&gt;&lt;p class="persents" style="display: none;"&gt; Обработано: &lt;span class="pv"&gt;0&lt;/span&gt;% (Строка: &lt;span class="rv"&gt;1&lt;/span&gt;/ &lt;span class="maxrows"&gt;0&lt;/span&gt;) &lt;/p&gt;&lt;/div&gt; &lt;div&gt; &lt;button id="DeleteElements"&gt;Удалить все элементы&lt;/button&gt; &lt;/div&gt; &lt;/form&gt; &lt;script type="text/javascript"&gt; var deferreds = []; var i = 10; var maxRows = false; var Form; $(document).ready(function(){ lastSelectedIblock = localStorage.getItem('IBLOCK_ID'); if(lastSelectedIblock!==undefined &amp;&amp; parseInt(lastSelectedIblock)&gt;0){ $('form[name="iblocksProcessorForm"]').find('option[value="'+lastSelectedIblock+'"]').attr('selected','selected'); } }); $(document).on('change','form[name="iblocksProcessorForm"] select[name="IBLOCK_ID"]', function () { localStorage.setItem('IBLOCK_ID',$(this).val()) ; }); $(document).on('click', 'form[name="iblocksProcessorForm"] button#DeleteElements', function () { var that = this; Form = $(this).parents('form'); var num = 1; var wait = BX.showWait('loading'); var persentsContainer = Form.find('p.persents'); var PostParams = { num: num, action: 'clearElements', sessid: Form.find('input[name="sessid"]').val(), 'IBLOCK_ID': Form.find('select[name="IBLOCK_ID"]').val() }; function work_with_row(num, d) { var Persents = (parseInt(num)-1) * 100 / parseInt(maxRows); persentsContainer.find('span.pv').html(Math.round(Persents)); persentsContainer.find('span.rv').html(parseInt(num)-1); PostParams.num = num; $.ajax({ type: "POST", url: location.href, data: PostParams, dataType: "json", success: function (data) { d &amp;&amp; d.resolve(); }, onfailure: function () { d &amp;&amp; d.resolve(); } }); } $.ajax({ type: "POST", url: location.href, data: PostParams, dataType: "json" }).then(function (data) { if (!maxRows &amp;&amp; data.CNT !== undefined) { maxRows = data.CNT; var deferreds = []; var i = 10; persentsContainer.find('span.maxrows').html(maxRows); persentsContainer.show(); for (var index = num + 1; index <p>Таким образом, при первом аякс-запросе скрипт получает информацию о том, сколько всего страниц ему нужно обработать (количество элементов на странице выбирается на основании производительности сервера),а дальше уже проходится по всем страницам и производит удаление. </p> <p>P.S. Скрипт написан в виде страницы административного раздела сайта</p> <div style="clear:both"></div> <br>

Таким образом, при первом аякс-запросе скрипт получает информацию о том, сколько всего страниц ему нужно обработать (количество элементов на странице выбирается на основании производительности сервера),а дальше уже проходится по всем страницам и производит удаление.

P.S. Скрипт написан в виде страницы административного раздела сайта

Прикрепить файл

до 50мб