Skip to content

Instantly share code, notes, and snippets.

@Dok11
Last active November 17, 2023 21:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Dok11/68704fb68dbd7fe416b717e25f833246 to your computer and use it in GitHub Desktop.
Save Dok11/68704fb68dbd7fe416b717e25f833246 to your computer and use it in GitHub Desktop.
Bitrix Classes Extending
<?php
if (\Bitrix\Main\Loader::includeModule('iblock')) {
\Bitrix\Main\Loader::registerAutoLoadClasses(null, [
'CIBlockCMLImport' => __DIR__ . '/ciblockcmlimport.php',
]);
}
$pathToOriginalCode = $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/iblock/classes/general/cml2.php';
$originalCode = file_get_contents($pathToOriginalCode);
$modifiedCode = str_replace('__FILE__', "'$pathToOriginalCode'", $originalCode);
$modifiedCode = str_replace('class CIBlockCMLImport', 'class OriginalCIBlockCMLImport', $modifiedCode);
eval('?>' . $modifiedCode);
class CIBlockCMLImport extends OriginalCIBlockCMLImport
{
public function DeactivateSections($action): void
{}
}
<?php
// init.php:
// Объявляем свой класс импорта вместо класса Битрикса по умолчанию
if (\Bitrix\Main\Loader::includeModule('iblock')) {
\Bitrix\Main\Loader::registerAutoLoadClasses(null, [
'CIBlockCMLImport' => __DIR__ . '/ciblockcmlimport.php',
]);
}
// ciblockcmlimport.php:
// Указываем путь к исходному файлу cml2.php, содержащему класс CIBlockCMLImport
$pathToOriginalCode = $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/iblock/classes/general/cml2.php';
// Считываем содержимое исходного файла
$originalCode = file_get_contents($pathToOriginalCode);
// Заменяем __FILE__ на фактический путь к исходному файлу.
// Это необходимо, потому что внутри исходного класса может использоваться __FILE__,
// и его значение должно оставаться корректным даже после изменения кода.
$modifiedCode = str_replace('__FILE__', "'$pathToOriginalCode'", $originalCode);
// Заменяем имя класса на OriginalCIBlockCMLImport, чтобы избежать конфликта имен
// при последующем определении нашего собственного класса CIBlockCMLImport
$modifiedCode = str_replace('class CIBlockCMLImport', 'class OriginalCIBlockCMLImport', $modifiedCode);
// Выполняем модифицированный код, создавая класс OriginalCIBlockCMLImport
eval('?>' . $modifiedCode);
/**
* Класс наследуется от оригинального CIBlockCMLImport.
*/
class CIBlockCMLImport extends OriginalCIBlockCMLImport
{
public function DeactivateSections($action): void
{
// Чтобы не деактивировать разделы при импорте XML, оставляем метод пустым.
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment