Ошибка (из предыдущего примера), типа
[Error]
Class "Bitrix\Iblock\Elements\ElementCatalogTable" not found (0)
возникает потому, что класс Bitrix\Iblock\Elements\ElementCatalogTable не существует автоматически — он генерируется только при наличии соответствующего инфоблока, если включена опция "Генерировать коды компонентов" и созданы классы D7 через интерфейс Битрикс (например, через "Типы инфоблоков" → "Генерация D7-классов").
Если таких классов нет — вы не можете использовать ElementCatalogTable, и PHP выбрасывает Class not found.
✅ Можно использовать универсальный D7-метод без зависимостей от сгенерированных классов
Ниже пример, который не требует наличия ElementCatalogTable, а использует стандартный API D7 через CIBlockElement и Bitrix\Iblock\ElementTable:
Код |
---|
<?php
// Подключаем пролог Битрикс
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Main\Entity\DataManager;
// Логируем начало
AddMessage2Log("Запуск массовой генерации символьных кодов для элементов инфоблока (универсальный D7)");
// Подключаем модуль iblock
if (!Loader::includeModule('iblock')) {
AddMessage2Log("Ошибка: не удалось подключить модуль iblock");
die("Модуль iblock не подключён");
}
// Настройки
$iblockId = 3; // ← Укажите нужный ID вашего инфоблока
$params = [
"max_len" => 100,
"change_case" => "L", // в нижний регистр
"replace_space" => "-", // пробелы на дефис
"replace_other" => "-", // прочие символы на дефис
"delete_repeat_replace" => true, // убрать дубли дефисов
"safe_chars" => "" // безопасные символы (если нужны)
];
// Получаем элементы инфоблока без символьного кода
$query = ElementTable::getList([
'filter' => [
'=IBLOCK_ID' => $iblockId,
'CODE' => null // или false — элементы без CODE
],
'select' => ['ID', 'NAME'],
'limit' => 5000 // защита от перегрузки; можно запускать по частям
]);
$updatedCount = 0;
while ($element = $query->fetch()) {
$elementID = $element['ID'];
$elementName = trim($element['NAME']);
if (empty($elementName)) {
AddMessage2Log("D7. Элемент ID {$elementID}: пропущен — пустое название");
continue;
}
// Генерируем символьный код
$newCode = CUtil::translit($elementName, 'ru', $params);
// Обновляем поле CODE через ElementTable
$result = ElementTable::update($elementID, ['CODE' => $newCode]);
if ($result->isSuccess()) {
AddMessage2Log("D7. Элемент ID {$elementID}: установлен код '{$newCode}'");
$updatedCount++;
} else {
$errors = implode(', ', $result->getErrorMessages());
AddMessage2Log("D7. Элемент ID {$elementID}: ошибка обновления -> {$errors}");
}
}
echo "Готово. Обновлено элементов: {$updatedCount}. Результаты в логах (/bitrix/logs/).";
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/footer.php');
?> |