Back to Top

Add your Own Entity, for Email Templating in Oro Commerce

Updated 24 January 2020

To make entity available for the email template you need to make it configurable with the Config Annotation.

To make the SellerReview entity available for templating, simply import the @Config annotation and use it in the class.

<?php

namespace Webkul\MarketplaceBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Oro\Bundle\EntityConfigBundle\Metadata\Annotation\Config;

/**
 * SellerReview.
 *
 * @ORM\Entity
 * @ORM\Table(name="wk_mp_seller_reviews")
 * @Config()
 */
class SellerReview
{
    /**
     * @var int
     */
    private $id;

    /**
     * @var string
     */
    private $heading;

    /**
     * @var string
     */
    private $text;

    /**
     * @var \DateTime
     */
    private $createdAt;

You can also change the default value of each configurable option using the default values argument:

<?php
 
namespace MarketplaceBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
use Oro\Bundle\EntityConfigBundle\Metadata\Annotation\Config;
use Oro\Bundle\EntityConfigBundle\Metadata\Annotation\ConfigField;
 
/**
 * SellerReview.
 *
 * @ORM\Entity
 * @ORM\Table(name="wk_mp_seller_reviews")
 * @Config(
 *     defaultValues={
 *         "wk_mp_seller_reviews"={
 *             "comment"="reviews"
 *         }
 *     }
 * )
 */
class SellerReview
{
    /**
     * @var int
     */
    private $id;
 
    /**
     * @var string
     */
    private $heading;
 
    /**
     * @var string
     */
    private $text;
 
    /**
     * @var \DateTime
     */
    private $createdAt;
 
    /**
     * @var bool
     */

Then you need to register this function in the Email templates using the Twig environment.

<?php

namespace Webkul\MarketplaceBundle\Twig;

use Twig\Extension\AbstractExtension;
use Webkul\MarketplaceBundle\Entity\Transaction;
use Twig\TwigFunction;

class EmailTwigExtension extends AbstractExtension
{
    public function getFunctions()
    {
        return [new TwigFunction('getseller', [$this, 'getSomeVariableValue'])];
    }

    public function getSomeVariableValue(Transaction $entity): array
    {
        $result[] = [
                'seller' => $entity->getAmount(),
            ];

        return $result;
    }
}

Register the Twig extension in the DI container:

Start your headless eCommerce
now.
Find out More
wk_seller_product.twig.my_extension:
        class: Webkul\MarketplaceBundle\Twig\EmailTwigExtension
        public: false
        tags:
            - { name: twig.extension }

Create a DI compiler pass to register the created extension and function in the Email Twig Environment:

<?php

namespace Webkul\MarketplaceBundle\DependencyInjection\CompilerPass;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

class TwigSandboxConfigurationPass implements CompilerPassInterface
{
    const EMAIL_TEMPLATE_SANDBOX_SECURITY_POLICY_SERVICE_KEY = 'oro_email.twig.email_security_policy';
    const EMAIL_TEMPLATE_RENDERER_SERVICE_KEY = 'oro_email.email_renderer';

    /**
     * {@inheritdoc}
     */
    public function process(ContainerBuilder $container)
    {
        $securityPolicyDef = $container->getDefinition('oro_email.twig.email_security_policy');

        $securityPolicyDef->replaceArgument(
            4,
            array_merge($securityPolicyDef->getArgument(4), ['getseller'])
        );

        $container->getDefinition('oro_email.email_renderer')
            ->addMethodCall('addExtension', [new Reference('wk_seller_product.twig.my_extension')]);
    }
}

Register the created compiler pass:

<?php

namespace Webkul\MarketplaceBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use Webkul\MarketplaceBundle\DependencyInjection\CompilerPass\TwigSandboxConfigurationPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class WebkulMarketplaceBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new TwigSandboxConfigurationPass());

        parent::build($container);
    }
}

Once you complete these steps, “your entity function” becomes available in Email templates.

I have explored these things while creating module for OroCommerce Multi-Vendor Marketplace.

Thanks for reading me. I hope you’ll get an idea of how you can use your entity for email templating in Oro-Commerce, please share your reviews on this, that will support me to write more.

. . .

Leave a Comment

Your email address will not be published. Required fields are marked*


Be the first to comment.

Back to Top

Message Sent!

If you have more details or questions, you can reply to the received confirmation email.

Back to Home