Zend Framework 2 Module for MJML Responsive email
PHP
Latest commit 5bbec64 Oct 11, 2016 @kachar committed on GitHub Updated service factory code style

README.md

ZF2 Module for MJML to HTML rendering

This module is based on: MJML The only open-source framework that makes responsive-email easy https://mjml.io

With this module you can define your email templates as MJML files and render them using Zend ViewModel. The MJML markup will be sent to https://mjml.io/try-it-live in order to be transformed to HTML.

The package supports:

  • simple variable replacement after the markup has been converted. (*.mjml files)
  • complex templating system using PHP inside the mjml markup. (*.pmjml files)

You can send the complete emails using a pre-defined email transport method.

Requirements

Installation

  1. Add "kachar/zend-mjml": "dev-master" to your composer.json file and run php composer.phar update.

    "require": {
        "kachar/zend-mjml": "dev-master"
    }
    $ php composer.phar update
  2. Add ZendMjml to your config/application.config.php file under the modules key.

    'modules' => [
        'ZendMjml',
    ],

Configuration

Under the key mjml you can set the following options in the configuration:

mjmlServiceUrl: Sets the MJML endpoint (default https://mjml.io)

timeout: Float describing the timeout of the request in seconds. Use 0 to wait indefinitely (default value 10).

connectTimeout: Float describing the number of seconds to wait while trying to connect to a server. Use 0 to wait indefinitely (default value 1.5).

transportAdapter: The adapter that will be used to send the actual email. Two possible configurations:

  • as a string - Any service that implements Zend\Mail\Transport\TransportInterface and can be fetched from ServiceLocator.
    'mjml' => [
        'transportAdapter' => [
            'type' => 'sendmail',
            'options' => [
                // see http://www.sendmail.org/~ca/email/man/sendmail.html
            ],
        ],
    ],
    'mjml' => [
        'transportAdapter' => 'Zend\Mail\Transport\Sendmail',
    ],
    'service_manager' => [
        'invokables' => [
            'Zend\Mail\Transport\Sendmail' => 'Zend\Mail\Transport\Sendmail',
        ],
    ],

Usage

Inline MJML makrup


    $service = $this->getServiceLocator()->get('Service\Mjml');
    $mjml = '
    <mj-body>
      <mj-section>
        <mj-column>
          <mj-image width="100" src="https://mjml.io/assets/img/logo-small.png"></mj-image>
          <mj-divider border-color="#F45E43"></mj-divider>
          <mj-text font-size="20px" color="#F45E43" font-family="helvetica">Hello {{ name }}</mj-text>
        </mj-column>
      </mj-section>
    </mj-body>
    ';

    // This is the final html to be sent to the recipients
    $body = $service->renderMjml($mjml);

    // You can replace simple variables inside the final output
    $body = $service->renderMjml($mjml, [
        'name' => 'direct example',
    ]);

    // Sending the email
    $email = $service->composeEmail($body);
    $email->setTo('email@example.com');
    $email->setSubject('Sample responsive MJML email');
    $service->sendEmail($email);
    // or
    echo $body;

Using ViewModel that loads MJML makrup file


    $service = $this->getServiceLocator()->get('Service\Mjml');

    $view = new ViewModel();
    $view->name = 'John Doe';
    $view->setTemplate('mjml/plain.mjml');
    // This is the final html to be sent to the recipients
    $body = $service->renderView($view);

    // Sending the email
    $email = $service->composeEmail($body);
    $email->setTo('email@example.com');
    $email->setSubject('Sample responsive MJML email using ViewModel');
    $service->sendEmail($email);

Using ViewModel that loads PHP-MJML makrup file


    $view = new ViewModel();
    // This will be replaced using str_replace in the final template
    $view->name = 'PHP MJML Template';

    // This will be replaced using php in the initial mjml template
    $view->products = [
        [
            'name' => 'Ham',
            'price' => '1.50',
            'quantity' => 5,
        ],
        [
            'name' => 'Cheese',
            'price' => '3.75',
            'quantity' => 3,
        ],
        [
            'name' => 'Bread',
            'price' => '5.00',
            'quantity' => 10,
        ],
    ];
    $view->setTemplate('mjml/php-mjml.pmjml');
    // This is the final html to be sent to the recipients
    $body = $service->renderView($view);

    // Sending the email
    $email = $service->composeEmail($body);
    $email->setTo('email@example.com');
    $email->setSubject('Sample responsive MJML email using PhpRenderer');
    $service->sendEmail($email);