Email Templates
OroFrontendBundle extends Email Templates Inheritance feature with the ability to load email templates from the current layout theme.
Implementation Overview
OroFrontendBundle implements the email template candidates provider \Oro\Bundle\FrontendBundle\EmailTemplateCandidates\LayoutThemeAwareEmailTemplateCandidatesProvider
that is added to the chain in \Oro\Bundle\EmailBundle\EmailTemplateCandidates\EmailTemplateCandidatesProvider
. It provides the email template candidate name with the @theme namespace and the current layout theme name in parameters, for example @theme:name=default/order_confirmation_email.
Email templates with the @theme namespace are handled by email template loader \Oro\Bundle\LayoutBundle\Twig\EmailTemplateLoader\LayoutThemeEmailTemplateLoader
.
Layout Theme Email Template Loader
Email template loader \Oro\Bundle\LayoutBundle\Twig\EmailTemplateLoader\LayoutThemeEmailTemplateLoader
extends \Twig\Loader\FilesystemLoader
with the ability to handle @theme namespace and parse parameters from template name. Under the hood, it converts names like the following @theme:name=default/order_confirmation_email into @default/order_confirmation_email.html.twig, where default is a namespace named with a layout theme name and understandable by inner \Twig\Loader\FilesystemLoader
.
To make \Oro\Bundle\LayoutBundle\Twig\EmailTemplateLoader\LayoutThemeEmailTemplateLoader
aware of available email templates, their paths are collected in \Oro\Bundle\LayoutBundle\DependencyInjection\OroLayoutExtension
by the following patterns:
%twig.default_path%/layouts/%theme_name%/email-templates/, where %twig.default_path% is a service container parameters that is by default equal to %kernel.project_dir%/templates
%bundle_dir%/Resources/views/layouts/%theme_name%/email-templates/
Limitations
Email templates loaded from a layout theme cannot be translated.
Email template uniqueness cannot be guaranteed. The email template with the highest priority is the one found in the application templates directory or, if it does not exist, then the one found in a bundle.