Скрипт удаления элементов Битрикс
Логика скрипта (скачать):
1) Задаём set_time_limit
2) Включаем вывод ошибок
3) Подключаем prolog bitrix
4) Подключаем нужный модуль iblock
5) Вытаскиваем элементы
6) Собираем ID-шники
7) Делаем перебор массива ID-шников и удаляем элементы
set_time_limit(60000); // включаем вывод ошибочек ini_set(‘error_reporting’, E_ALL); ini_set(‘display_errors’, 1); ini_set(‘display_startup_errors’, 1); // включаем замер исполнения скрипта // подключаем prolog bitrix require $_SERVER[«DOCUMENT_ROOT»] . ‘/bitrix/modules/main/include/prolog_before.php’; // подключаем нужные модули CModule::IncludeModule(«iblock»); $infoblock = 3; // Инфоблок с ID ХХХ (необходимо установить ID нужного инфоблока) //Вытаскиваем элементы $arSelectElems = array ( «ID» ); $arFilterElems = array ( «IBLOCK_ID» => $infoblock ); $arSortElems = array ( «NAME» => «ASC» ); $arResult[«ELEMENTS»] = array(); $rsElementElement = CIBlockElement::GetList(array(‘left_margin’ => ‘asc’), $arFilterElems, false, false, $arSelectElems); while ( $ar_Element = $rsElementElement->Fetch() ) < $ar_Resu[] = array( // собираем массив того, что нам нужно 'ID' =>$ar_Element[‘ID’], // id ); > //Удаляем элементы foreach ($ar_Resu as $section)
Ещё статьи:
25.02.2024 Какие показатели обеспечивает антибот для защиты сайта от накруток?
Какие показатели обеспечивает антибот для защиты сайта от SEO накруток и есть ли в этом какая-то эффективность?
Часто у заказчиков возникают такие вопросы, и первым делом нужно определить критерии по которым оценивать эффективность. ID: 467
08.11.2023 Прощай bitrix.xscan, не стало битрикс скан модуля
Сегодня увидел, что полезного модуля bitrix.xscan не стало на маркетплейсе. ID: 464
26.07.2023 Сохренение ютм меток в сессию
Вариант сохренения ютм меток в сессию в афйле init.php ID: 462
Как удалить файл в свойстве элемента инфоблока?
Сабж. Казалось просто. А вот и ни фига. Есть камни, о которые новичок порвет мозг. Мне стыдно, но я убил часа полтора. Резюмирую здесь, надеюсь это последний раз у всех нас.
Итак, как нам обновить вообще любое св-во в Битрикс?
1. Update
2. SetPropertyValues
3. SetPropertyValuesEx
В каждом варианте на ключ массива обновления идет код св-ва, а значение — новое значение. Для удаления файла нам надо передать вот такой простой массивчик:
array(‘MY_FILE’ => array(‘XXX’ => array(‘del’ => ‘Y’)));
Да, вот такой геморрой. Он универсален, что для ИБ, что для ИБ+, что для документооборота. MY_FILE — это код вашего св-ва типа файл. А что такое ХХХ? Настоящая порнография. Там содержится _ID_ _значения_ св-ва. То есть не ID св-ва, а именно ID значения. И магия еще в том, что в случае ИБ+ у нас нет такого понятия, а ID значения формируется как ID_элемента:ID_свва. Но вам это знать необязательно, лучше получить универсально.
CModule::IncludeModule('iblock'); $IB = 24; $ID = 220304; $CODE = 'ONE_FL'; if ($arProp = CIBlockElement::GetProperty($IB, $ID, 'ID', 'DESC', array('CODE' => $CODE))->fetch()) < $XXX = $arProp['PROPERTY_VALUE_ID']; CIBlockElement::SetPropertyValueCode($ID, $CODE, array($XXX =>array('del' => 'Y'))); >
Вот таким образом получается этот универсальный XXX, именно так его и надо передавать для каждого файла, который мы хотим удалить.
Что делать в случае множественного файла? Как удалить конкретный файл в списке? Все просто — используем в примере выше не if, а while, ну и дополнительно фильтруем, какой файл надо удалить.
1С-Битрикс. Как массово и достаточно быстро удалить все разделы в инфоблоке?
Добрый день!
Подскажите пожалуйста как массово и достаточно быстро удалить все разделы в инфоблоке?
Всего разделов 55к
Через админку всё виснет, несмотря на больше max execution time.
Скрипт такой набросал, но как-то долговато работает.. Или это норма?
'asc'), array('IBLOCK_ID' => $infoblock)); while ( $ar_Section = $rs_Section->Fetch() ) < $ar_Resu[] = array( // собираем массив того, что нам нужно 'ID' =>$ar_Section['ID'], // id раздела 'NAME' => $ar_Section['NAME'], // имя раздела (что нас, собственно, интересует) 'IBLOCK_SECTION_ID' => $ar_Section['IBLOCK_SECTION_ID'], ); > foreach ($ar_Resu as $section) < CIBlockElement::Delete($section["ID"]); >?>
- Вопрос задан более трёх лет назад
- 7830 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 4
занимаюсь разработкой сайтов на 1c-bitrix
При большом количестве разделов (30к+), Bitrix начинает вставлять палки в колеса как разработчику, так и пользователю, который будет работать с такими ИБ.
— Списки элементов ИБ будут безбожно тормозить в интерфейсе. На каждом хите будет добавляться фильтр по разделу.
— Редактировать их становится очень затруднительно, опять же из за долгой загрузки интерфейса и большого времени изменения.
Всё это из за того что разделы это NESTED SETS деревья. При добавлении/удалении раздела происходит вычисление LEFT_MARGIN и RIGHT_MARGIN для каждого раздела во всем инфоблоке.
Для добавления и обновления (CIBlockSection::Add, CIBlockSection::Update) есть параметр метода $bResort, который позволяет отключить этот перерасчёт в момент их выполнения.
Только после этого ОБЯЗАТЕЛЬНО надо выполнять CIBlockSection::Resort.
Это можно использовать при большом количестве операций Update и Add. Сначала выполняете все операции Update и Add с $bResort=false, а после них CIBlockSection::Resort
- пересчет границ NESTED SETS,
- CIblockElement::GetList (поиск вложенных элементов)
- CIblockElement::Delete (если в разделе были элементы),
- Запрос к таблице которая хранит множественные привязки элемента к разделам (поиск значений и их удаление)
- CIBlockSection::GetList (поиск вложенных разделов)
- CIBlockSection::Delete (удаление вложенных разделов)
- Переиндексирование поиска
- Запросы к UF_* полям раздела (поиск значений и их удаление)
- При заполненных SEO полях, запросы к таблицам которые их хранят (поиск значений и их удаление)
- При расширенном управлении правами это еще запросы к таблицам которые хранят эти настройки (поиск значений и их удаление)
и это скорее всего не полный список, а только то что могу назвать по памяти.
Нельзя быстро удалить разделы стандартным API без написания своих запросов к БД которые проделают всё что описано выше. В идеале надо взять код стандартного CIBlockSection::Delete, внимательно его изучить и написать свой метод который будет с помощью прямых запросов делать тоже самое, но оптимально.
Если же вопрос стоит в том чтобы удалить эти разделы за ЛЮБОЕ количество времени, тогда можно написать страничку с пошаговым удалением разделов, через ajax запросы. Причем надо учитывать, что вначале разделы будут удаляться ОЧЕНЬ медленно и ajax запрос может отвалиться по таймауту, поэтому надо будет за один шаг удалять пару разделов. А ближе к границе в 10к разделов, за один шаг можно будет удалять уже большее количество.
Пошаговое удаление элементов инфоблока
Данный модуль позволяет пошагово удалить все элементы инфоблока. Решение незаменимо, если приходится работать с большим числом данных, особенно на этапе разработки, отладки сайта, когда по той или иной причине не правильно загрузили данные. Подходит для сайта на любой редакции 1С-Битрикс.
Внимание! Данный модуль разработан с использованием апи D7.
Минимальные технические требования для продукта с версии 14.0 (с ядром D7):
- PHP версии 5.3.
- MySQL версии 5.