From 3d1befc9b8799318927443658dbf0c862c9e5235 Mon Sep 17 00:00:00 2001 From: Anthony Andriano Date: Thu, 27 Nov 2025 13:18:34 -0700 Subject: [PATCH] Allow system templates to be customized using metadata (#3486) * Allow system templates to be customized using metadata * refactor * removed defaultModuleName parameter * revert an unintended change in a function call --- application/Espo/Controllers/TemplateManager.php | 10 ++++------ .../Espo/Core/Utils/TemplateFileManager.php | 15 ++++++++++++--- .../Modules/Crm/Business/Event/Invitations.php | 4 ++-- .../Crm/Tools/Reminder/Sender/EmailReminder.php | 4 ++-- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/application/Espo/Controllers/TemplateManager.php b/application/Espo/Controllers/TemplateManager.php index 5ff596659f..79f4921a4d 100644 --- a/application/Espo/Controllers/TemplateManager.php +++ b/application/Espo/Controllers/TemplateManager.php @@ -73,17 +73,16 @@ class TemplateManager $scope = $request->getQueryParam('scope'); - $module = $this->metadata->get(['app', 'templates', $name, 'module']); $hasSubject = !$this->metadata->get(['app', 'templates', $name, 'noSubject']); $templateFileManager = $this->templateFileManager; $returnData = (object) []; - $returnData->body = $templateFileManager->getTemplate($name, 'body', $scope, $module); + $returnData->body = $templateFileManager->getTemplate($name, 'body', $scope); if ($hasSubject) { - $returnData->subject = $templateFileManager->getTemplate($name, 'subject', $scope, $module); + $returnData->subject = $templateFileManager->getTemplate($name, 'subject', $scope); } return $returnData; @@ -146,7 +145,6 @@ class TemplateManager $scope = $data->scope; } - $module = $this->metadata->get(['app', 'templates', $data->name, 'module']); $hasSubject = !$this->metadata->get(['app', 'templates', $data->name, 'noSubject']); $templateFileManager = $this->templateFileManager; @@ -159,10 +157,10 @@ class TemplateManager $returnData = (object) []; - $returnData->body = $templateFileManager->getTemplate($data->name, 'body', $scope, $module); + $returnData->body = $templateFileManager->getTemplate($data->name, 'body', $scope); if ($hasSubject) { - $returnData->subject = $templateFileManager->getTemplate($data->name, 'subject', $scope, $module); + $returnData->subject = $templateFileManager->getTemplate($data->name, 'subject', $scope); } return $returnData; diff --git a/application/Espo/Core/Utils/TemplateFileManager.php b/application/Espo/Core/Utils/TemplateFileManager.php index 9c34491a78..6c4827712d 100644 --- a/application/Espo/Core/Utils/TemplateFileManager.php +++ b/application/Espo/Core/Utils/TemplateFileManager.php @@ -32,25 +32,34 @@ namespace Espo\Core\Utils; use Espo\Core\Utils\File\Manager as FileManager; use Espo\Core\Utils\Resource\FileReader; use Espo\Core\Utils\Resource\FileReader\Params as FileReaderParams; +use Espo\Core\Utils\Metadata; class TemplateFileManager { public function __construct( private Config $config, private FileManager $fileManager, - private FileReader $fileReader + private FileReader $fileReader, + private Metadata $metadata, ) {} public function getTemplate( string $type, string $name, ?string $entityType = null, - ?string $defaultModuleName = null ): string { + $templates = $this->metadata->get(['app', 'templates']); + + $moduleName = null; + + if (isset($templates[$type]) && isset($templates[$type]["module"])) { + $moduleName = $templates[$type]["module"]; + } + $params = FileReaderParams::create() ->withScope($entityType) - ->withModuleName($defaultModuleName); + ->withModuleName($moduleName); if ($entityType) { $path1 = $this->getPath($type, $name, $entityType); diff --git a/application/Espo/Modules/Crm/Business/Event/Invitations.php b/application/Espo/Modules/Crm/Business/Event/Invitations.php index 5abfa5ce49..fb0ec887e4 100644 --- a/application/Espo/Modules/Crm/Business/Event/Invitations.php +++ b/application/Espo/Modules/Crm/Business/Event/Invitations.php @@ -121,10 +121,10 @@ class Invitations $data = $this->prepareData($entity, $uid, $invitee); - $subjectTpl = $this->templateFileManager->getTemplate($type, 'subject', $entity->getEntityType(), 'Crm'); + $subjectTpl = $this->templateFileManager->getTemplate($type, 'subject', $entity->getEntityType()); $subjectTpl = str_replace(["\n", "\r"], '', $subjectTpl); - $bodyTpl = $this->templateFileManager->getTemplate($type, 'body', $entity->getEntityType(), 'Crm'); + $bodyTpl = $this->templateFileManager->getTemplate($type, 'body', $entity->getEntityType()); $subject = $htmlizer->render( $entity, diff --git a/application/Espo/Modules/Crm/Tools/Reminder/Sender/EmailReminder.php b/application/Espo/Modules/Crm/Tools/Reminder/Sender/EmailReminder.php index c40c5c40f8..bd68729e2f 100644 --- a/application/Espo/Modules/Crm/Tools/Reminder/Sender/EmailReminder.php +++ b/application/Espo/Modules/Crm/Tools/Reminder/Sender/EmailReminder.php @@ -108,10 +108,10 @@ class EmailReminder private function getTemplates(CoreEntity $entity): array { $subjectTpl = $this->templateFileManager - ->getTemplate('reminder', 'subject', $entity->getEntityType(), 'Crm'); + ->getTemplate('reminder', 'subject', $entity->getEntityType()); $bodyTpl = $this->templateFileManager - ->getTemplate('reminder', 'body', $entity->getEntityType(), 'Crm'); + ->getTemplate('reminder', 'body', $entity->getEntityType()); return [$subjectTpl, $bodyTpl]; }