Про перенос в верхний уровень.
Ну во-первых таблица элементов, где IN_SECTIONS в N и IBLOCK_SECTION_ID в NULL.
А еще таблица b_iblock_section_element которая нужна для реализации привязки элемента к нескольким разделам.
Т.е. разделы это одновременно дерево из-за легаси, и просто теги, т.е. что-то с кучей родителей.
В целом большая часть решается через \Bitrix\Iblock\Elements\Element%Catalog%Table::query()->...->fetchCollection() и там в массовое изменение. Конечно всякие эвенты не сработают, но это ведь хорошо, нет?)
----------------------------------------------------
Про перенос в другой инфоблок....
Ну это конечно та еще морока, где этим куском кода не обойтись.
Код |
---|
private static function changeElementIblockId($id) {
$query = "UPD ATE " . \Bitrix\Iblock\ElementTable::getTableName() . " ";
$query .= "SE T IBLOCK_ID = '" . CATALOG_SKU_IBLOCK_ID . "', ";
$query .= "IBLOCK_SECTION_ID = '0' ";
// TODO: IN_SECTIONS = "N" & IBLOCK_SECTION_ID = NULL
$query .= "WHERE ID = " . $id;
$query .= ";";
$connection = \Bitrix\Main\Application::getConnection();
$connection->query($query);
}
|
Кажется что все ок, вот оно счастье, но нет, у нас еще есть свойства. И свойства тоже просто так копировать не выйдет, ибо есть свойства одночные, множественные, да еще и с вариантами выбора. Да еще есть инфоблоки 2.0 и 1.0)
Так что можно заранее готовиться к мукам в стиле
Код |
---|
$query = "SEL ECT COLUMN_TYPE FR OM INFORMATION_SCHEMA.COLUMNS ";
$query .= "WHERE table_name = 'b_iblock_element_prop_s" . CATALOG_IBLOCK_ID . "' ";
$query .= "AND COLUMN_NAME = 'PROPERTY_". $propId ."' ";
$query .= ";";
$connection = \Bitrix\Main\Application::getConnection();
$res = $connection->query($query);
$columnType = $res->fetchRaw()["COLUMN_TYPE"];
$query = "ALT ER TABLE b_iblock_element_prop_s" . CATALOG_SKU_IBLOCK_ID . " " ;
$query .= "ADD PROPERTY_". $id ." ". $columnType ."; ";
$connection = \Bitrix\Main\Application::getConnection();
$connection->query($query);
|
Да еще у свойств ИБ есть свои свойства) Это из PropertyFeatureTable где можно ставить штуки "показывать в списке/деталке или добавлять в корзину")
А ну да, еще свойства типа список тоже веселые) PropertyEnumerationTable обладает методом validateXmlId которая говорит, что все XML_ID значений списковых свойств должны быть уникальными. Это не в рамках одного свойства, а вообще все. Т.е. вообще все значения всех списковых свойств, даже не у инфоблоков. Как вариант например скопировать родной класс и убрать там одну строчку) Через наследование не выйдет, ибо битра вызовет родительский метод(
В общем задачка оптимально перенести в другой ИБ это несколько месяцев изучения платформы и напряжения мозга. И вообще сильная преждевременная оптимизация. Намного проще в тупую прочитал, создал новый, удалил старый. Хотя конечно тогда придется париться с тем что это продукт, и переносить цены. Но это быстрее. Честно. По времени разработки на порядок быстрее.