diff --git a/application/Espo/Core/HookManager.php b/application/Espo/Core/HookManager.php index 0e7dd9f4b3..b129616714 100644 --- a/application/Espo/Core/HookManager.php +++ b/application/Espo/Core/HookManager.php @@ -171,8 +171,8 @@ class HookManager /** * @param string $hookDir - * @param array> $hookData - * @return array> + * @param array> $hookData + * @return array> */ private function readHookData(string $hookDir, array $hookData = []): array { @@ -180,7 +180,7 @@ class HookManager return $hookData; } - /** @var array $fileList */ + /** @var array $fileList */ $fileList = $this->fileManager->getFileList($hookDir, 1, '\.php$', true); foreach ($fileList as $scopeName => $hookFiles) { @@ -197,7 +197,7 @@ class HookManager /** @var string[] $hookMethods */ $hookMethods = array_filter($hookMethods, function ($item) { - if (strpos($item, 'set') === 0) { + if (str_starts_with($item, 'set')) { return false; } @@ -211,6 +211,10 @@ class HookManager continue; } + if ($this->hookClassIsSuppressed($className)) { + continue; + } + $hookData[$normalizedScopeName][$hookType][] = [ 'className' => $className, 'order' => $className::$order ?? self::DEFAULT_ORDER, @@ -222,6 +226,16 @@ class HookManager return $hookData; } + /** + * @param class-string $className + */ + private function hookClassIsSuppressed(string $className): bool + { + $suppressList = $this->metadata->get(['app', 'hook', 'suppressClassNameList']) ?? []; + + return in_array($className, $suppressList); + } + /** * Sort hooks by the order parameter. * diff --git a/application/Espo/Core/Utils/Metadata.php b/application/Espo/Core/Utils/Metadata.php index ed67f91507..ceb4f66d43 100644 --- a/application/Espo/Core/Utils/Metadata.php +++ b/application/Espo/Core/Utils/Metadata.php @@ -76,6 +76,7 @@ class Metadata ['app', 'fieldProcessing', 'readLoaderClassNameList'], ['app', 'fieldProcessing', 'listLoaderClassNameList'], ['app', 'fieldProcessing', 'saverClassNameList'], + ['app', 'hook', 'suppressClassNameList'], ['recordDefs', self::ANY_KEY, 'readLoaderClassNameList'], ['recordDefs', self::ANY_KEY, 'listLoaderClassNameList'], ['recordDefs', self::ANY_KEY, 'saverClassNameList'], diff --git a/application/Espo/Resources/metadata/app/hook.json b/application/Espo/Resources/metadata/app/hook.json new file mode 100644 index 0000000000..dde72afca2 --- /dev/null +++ b/application/Espo/Resources/metadata/app/hook.json @@ -0,0 +1,3 @@ +{ + "suppressClassNameList": [] +} diff --git a/application/Espo/Resources/metadata/app/metadata.json b/application/Espo/Resources/metadata/app/metadata.json index 12a4bb2716..059348e2b2 100644 --- a/application/Espo/Resources/metadata/app/metadata.json +++ b/application/Espo/Resources/metadata/app/metadata.json @@ -28,6 +28,7 @@ ["app", "smsProviders", "__ANY__", "senderClassName"], ["app", "orm"], ["app", "linkManager"], + ["app", "hook"], ["selectDefs"], ["recordDefs"], ["pdfDefs"],