diff --git a/.idea/jsonSchemas.xml b/.idea/jsonSchemas.xml index 6cc93979a4..af62da91e2 100644 --- a/.idea/jsonSchemas.xml +++ b/.idea/jsonSchemas.xml @@ -1025,6 +1025,25 @@ + + + + + + + diff --git a/.vscode/settings.json b/.vscode/settings.json index 2750805872..2295b6c3ea 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -400,6 +400,12 @@ ], "url": "./schema/metadata/app/rebuild.json" }, + { + "fileMatch": [ + "*/Resources/metadata/app/record.json" + ], + "url": "./schema/metadata/app/record.json" + }, { "fileMatch": [ "*/Resources/metadata/app/recordId.json" diff --git a/application/Espo/Core/Record/Select/ApplierClassNameListProvider.php b/application/Espo/Core/Record/Select/ApplierClassNameListProvider.php index c580ff71ed..fd51fe0953 100644 --- a/application/Espo/Core/Record/Select/ApplierClassNameListProvider.php +++ b/application/Espo/Core/Record/Select/ApplierClassNameListProvider.php @@ -42,6 +42,9 @@ class ApplierClassNameListProvider */ public function get(string $entityType): array { - return $this->metadata->get(['recordDefs', $entityType, 'selectApplierClassNameList']) ?? []; + return [ + ...$this->metadata->get("app.record.selectApplierClassNameList", []), + ...$this->metadata->get("recordDefs.$entityType.selectApplierClassNameList", []), + ]; } } diff --git a/application/Espo/Core/Select/Applier/Appliers/Additional.php b/application/Espo/Core/Select/Applier/Appliers/Additional.php index 310851b0b4..fd45364ab2 100644 --- a/application/Espo/Core/Select/Applier/Appliers/Additional.php +++ b/application/Espo/Core/Select/Applier/Appliers/Additional.php @@ -29,6 +29,7 @@ namespace Espo\Core\Select\Applier\Appliers; +use Espo\Core\Binding\ContextualBinder; use Espo\ORM\Query\SelectBuilder as QueryBuilder; use Espo\Core\Select\SearchParams; use Espo\Core\InjectableFactory; @@ -39,8 +40,11 @@ use Espo\Entities\User; class Additional { - public function __construct(private User $user, private InjectableFactory $injectableFactory) - {} + public function __construct( + private User $user, + private InjectableFactory $injectableFactory, + private string $entityType, + ) {} /** * @param class-string[] $classNameList @@ -63,6 +67,9 @@ class Additional $className, BindingContainerBuilder::create() ->bindInstance(User::class, $this->user) + ->inContext($className, function (ContextualBinder $binder) { + $binder->bindValue('$entityType', $this->entityType); + }) ->build() ); } diff --git a/schema/metadata/app/record.json b/schema/metadata/app/record.json new file mode 100644 index 0000000000..f9fee347eb --- /dev/null +++ b/schema/metadata/app/record.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://www.espocrm.com/schema/metadata/app/record.json", + "title": "app/select", + "description": "Record framework definitions.", + "type": "object", + "properties": { + "selectApplierClassNameList": { + "type": "array", + "items": { + "anyOf": [ + {"const": "__APPEND__"}, + {"type": "string"} + ] + }, + "description": "Classes for additional handling of a select query. Should implement Espo\\Core\\Select\\Applier\\AdditionalApplier interface. An entity type is passed to the constructor in `$entityType` parameter. As of v8.5.0." + } + } +}