27 private static Manager $instance;
29 private array $presetList;
31 private bool $restrictedGroupsMode =
false;
39 if (!isset(self::$instance))
41 self::$instance =
new self;
44 return self::$instance;
53 if (!$this->isAlreadyRegisteredAutoLoader())
55 \spl_autoload_register([$this,
'autoLoad'],
true);
59 private function isAlreadyRegisteredAutoLoader()
61 $autoLoaders = spl_autoload_functions();
67 foreach ($autoLoaders as $autoLoader)
69 if(!is_array($autoLoader))
74 list($object,
$method) = $autoLoader;
76 if ($object instanceof $this)
85 private function __construct()
87 $this->errorCollection =
new ErrorCollection;
92 private function __clone()
97 $this->restrictedGroupsMode = $state ===
true;
102 return $this->restrictedGroupsMode;
107 $file = ltrim($className,
"\\");
108 $file = strtr($file, Loader::ALPHA_UPPER, Loader::ALPHA_LOWER);
112 if(preg_match(
"#[^\\\\/a-zA-Z0-9_]#", $file))
117 $file = str_replace(
'\\',
'/', $file);
118 $fileParts = explode(
"/", $file);
120 if($fileParts[0] !==
"sale" || $fileParts[1] !==
"handlers" || $fileParts[2] !==
'discountpreset')
124 array_shift($fileParts);
126 $filePath =
$documentRoot .
"/bitrix/modules/sale/" . implode(
"/", $fileParts) .
".php";
128 if(file_exists($filePath))
130 require_once($filePath);
134 private function buildPresets()
136 if (!isset($this->presetList))
138 $this->presetList = array_filter(
140 $this->buildDefaultPresets(),
141 $this->buildCustomPresets()
153 private function buildCustomPresets()
155 $presetList =
array();
157 $event =
new Event(
'sale',
'OnSaleDiscountPresetBuildList');
160 foreach(
$event->getResults() as $evenResult)
162 if($evenResult->getType() != EventResult::SUCCESS)
167 $result = $evenResult->getParameters();
170 throw new SystemException(
'Wrong event result by building preset list. Must be array.');
175 if(empty($preset[
'CLASS']))
177 throw new SystemException(
'Wrong event result by building preset list. Could not find CLASS.');
180 if(is_string($preset[
'CLASS']) && class_exists($preset[
'CLASS']))
182 $preset = $this->createPresetInstance($preset[
'CLASS']);
185 $presetList[] = $preset;
190 throw new SystemException(
"Wrong event result by building preset list. Could not find class by CLASS {$preset['CLASS']}");
198 private function buildDefaultPresets()
202 if(!Directory::isDirectoryExists(
$documentRoot . self::DEFAULT_PRESET_DIRECTORY))
204 throw new SystemException(
'Could not find folder with default presets. ' . self::DEFAULT_PRESET_DIRECTORY);
207 $defaultList =
array();
208 $directory =
new Directory(
$documentRoot . self::DEFAULT_PRESET_DIRECTORY);
209 foreach($directory->getChildren() as $presetFile)
211 if(!$presetFile->isFile() || !$presetFile->getName())
216 $className = $this->getClassNameFromPath($presetFile->getPath());
219 $preset = $this->createPresetInstance($className);
222 $defaultList[] = $preset;
234 private function createPresetInstance($className)
238 $class = new \ReflectionClass($className);
241 $instance = $class->newInstanceArgs([]);
246 catch (\ReflectionException $exception)
253 private function getClassNameFromPath(
$path)
255 return "Sale\\Handlers\\DiscountPreset\\" . getFileNameWithoutExtension(
$path);
265 return $this->buildPresets()->presetList;
276 if(class_exists($id))
278 return $this->createPresetInstance($id);
282 foreach($this->buildPresets()->presetList as $preset)
284 if($preset::className() === $id)
303 if ($preset->getCategory() === $category)
305 $presets[] = $preset;
313 $aSort = (int)
$a->getSort();
315 if ($aSort === $bSort) {
318 return ($aSort < $bSort) ? -1 : 1;
328 self::CATEGORY_PRODUCTS => Loc::getMessage(
'SALE_PRESET_DISCOUNT_MANAGER_CATEGORY_PRODUCTS'),
329 self::CATEGORY_PAYMENT => Loc::getMessage(
'SALE_PRESET_DISCOUNT_MANAGER_CATEGORY_PAYMENT'),
330 self::CATEGORY_DELIVERY => Loc::getMessage(
'SALE_PRESET_DISCOUNT_MANAGER_CATEGORY_DELIVERY'),
331 self::CATEGORY_OTHER => Loc::getMessage(
'SALE_PRESET_DISCOUNT_MANAGER_CATEGORY_OTHER'),
339 return $categoryList[$category] ??
'';
344 $count = DiscountTable::getCount([
345 '=PRESET_ID' => $preset::className()
foreach(['Bitrix\\Main'=> '/lib', 'Psr\\Container'=> '/vendor/psr/container/src', 'Psr\\Log'=> '/vendor/psr/log/src', 'Psr\\Http\\Message'=> '/vendor/psr/http-message/src', 'Psr\\Http\\Client'=> '/vendor/psr/http-client/src', 'Http\\Promise'=> '/vendor/php-http/promise/src', 'PHPMailer\\PHPMailer'=> '/vendor/phpmailer/phpmailer/src', 'GeoIp2'=> '/vendor/geoip2/geoip2/src', 'MaxMind\\Db'=> '/vendor/maxmind-db/reader/src/MaxMind/Db', 'PhpParser'=> '/vendor/nikic/php-parser/lib/PhpParser', 'Recurr'=> '/vendor/simshaun/recurr/src/Recurr',] as $namespace=> $namespacePath) $documentRoot