Rendering an Email Template
OroEmailBundle makes use of the TWIG engine to render an email template.
Note
For security reasons, an email template is :ref:` rendered in the sandbox mode <bundle-docs-platform-email-bundle-templates-rendering-sandbox>`.
Implementation Overview
The main entry point to render an email template is \Oro\Bundle\EmailBundle\Provider\EmailRenderer
. It expects a ready-to-be-rendered email template model, template parameters (further passed as TWIG variables) and email template context. More details about how to load an email template or get an email template context, see Loading Templates.
Examples
If you already have an email template entity to render, use \Oro\Bundle\EmailBundle\Provider\TranslatedEmailTemplateProvider
to translate and \Oro\Bundle\EmailBundle\Provider\EmailRenderer
to render it. Example:
use Oro\Bundle\EmailBundle\Entity\EmailTemplate as EmailTemplateEntity;
use Oro\Bundle\EmailBundle\Provider\EmailRenderer;
use Oro\Bundle\EmailBundle\Provider\EmailTemplateContextProvider;
use Oro\Bundle\EmailBundle\Provider\TranslatedEmailTemplateProvider;
use Oro\Bundle\NotificationBundle\Model\NotificationSettings;
use Oro\Bundle\UserBundle\Entity\User;
class Sample
{
private NotificationSettings $notificationSettings;
private TranslatedEmailTemplateProvider $translatedEmailTemplateProvider;
private EmailTemplateContextProvider $emailTemplateContextProvider;
private EmailRenderer $emailRenderer;
private User $user;
public function render(EmailTemplateEntity $emailTemplateEntity, array $templateParams)
{
// ...
$from = $this->notificationSettings->getSender();
$templateContext = $this->emailTemplateContextProvider
->getTemplateContext($from, $this->user, 'invite_user', $templateParams);
$translatedEmailTemplate = $this->translatedEmailTemplateProvider
->getTranslatedEmailTemplate($emailTemplateEntity, $templateContext['localization'] ?? null);
$renderedEmailTemplate = $this->emailRenderer->renderEmailTemplate($translatedEmailTemplate, $templateParams, $templateContext);
// ...
}
}
Note
To send an email with a rendered email template, see Send EmailBundle Templates.
If you have only an email template name, use \Oro\Bundle\EmailBundle\Provider\RenderedEmailTemplateProvider
that uses \Oro\Bundle\EmailBundle\Provider\EmailTemplateProvider
to load an email template and \Oro\Bundle\EmailBundle\Provider\EmailRenderer
to render it.
Example:
use Oro\Bundle\EmailBundle\Entity\EmailTemplate as EmailTemplateEntity;
use Oro\Bundle\EmailBundle\Model\EmailTemplateCriteria;
use Oro\Bundle\EmailBundle\Provider\EmailTemplateContextProvider;
use Oro\Bundle\EmailBundle\Provider\RenderedEmailTemplateProvider;
use Oro\Bundle\NotificationBundle\Model\NotificationSettings;
use Oro\Bundle\UserBundle\Entity\User;
class Sample
{
private NotificationSettings $notificationSettings;
private EmailTemplateContextProvider $emailTemplateContextProvider;
private RenderedEmailTemplateProvider $renderedEmailTemplateProvider;
private User $user;
public function render(EmailTemplateEntity $emailTemplateEntity, array $templateParams)
{
// ...
$from = $this->notificationSettings->getSender();
$emailTemplateCriteria = new EmailTemplateCriteria('invite_user', User::class);
$templateContext = $this->emailTemplateContextProvider
->getTemplateContext($from, $this->user, $emailTemplateCriteria, $templateParams);
$renderedEmailTemplate = $this->renderedEmailTemplateProvider
->findAndRenderEmailTemplate($emailTemplateCriteria, $templateParams, $templateContext);
// ...
}
}