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."
+ }
+ }
+}