Skip to content
Snippets Groups Projects
Commit de65272a authored by Piotr Potrebka's avatar Piotr Potrebka
Browse files

feat: email abstract

parent 82b8ba8d
No related branches found
No related tags found
1 merge request!2Devel
Pipeline #150946 passed with stages
in 56 seconds
......@@ -2,55 +2,44 @@
namespace WPDesk\Library\WPEmail\Abstracts;
use WPDesk\View\Renderer\Renderer;
abstract class EmailAbstract implements EmailGettersInterface {
abstract class EmailAbstract implements EmailInterface {
/**
* @var array
*/
private $recipients = [];
protected $recipients = [];
/**
* @var array
*/
private $placeholders = [];
protected $placeholders = [];
/**
* @var string
*/
private $subject = '';
protected $subject = '';
/**
* @var string
*/
private $heading = '';
protected $heading = '';
/**
* @var array
*/
private $attachments = [];
protected $attachments = [];
/**
* @var string
*/
private $content = '';
protected $content = '';
/**
* @var string
*/
private $type = 'text/html';
protected $type = 'text/html';
/**
* @var array
*/
private $headers;
/**
* @var Renderer
*/
private $renderer;
public function __construct( Renderer $renderer ) {
$this->renderer = $renderer;
}
protected $headers;
/**
* Define unique email ID.
......@@ -147,13 +136,4 @@ abstract class EmailAbstract implements EmailGettersInterface {
return '';
}
/**
* Get email content.
*
* @return string
*/
public function render(): string {
return $this->renderer->render( dirname( __DIR__ ) . '/html/default.php', [ 'content' => $this->get_content(), 'heading' => $this->get_heading(), 'object' => $this->get_object() ] );
}
}
......@@ -2,7 +2,7 @@
namespace WPDesk\Library\WPEmail\Abstracts;
interface EmailGettersInterface {
interface EmailInterface {
/**
* Define unique email ID.
......@@ -11,6 +11,13 @@ interface EmailGettersInterface {
*/
public function get_id(): string;
/**
* Is enable.
*
* @return bool
*/
public function get_is_enable(): bool;
/**
* Get defined placeholders.
*
......
......@@ -2,35 +2,56 @@
namespace WPDesk\Library\WPEmail;
use WPDesk\Library\WPEmail\Abstracts\EmailGettersInterface;
use WPDesk\Library\WPEmail\Abstracts\EmailInterface;
use WPDesk\Library\WPEmail\Parser\HTMLDecorator;
use WPDesk\View\Renderer\Renderer;
use WPDesk\View\Renderer\SimplePhpRenderer;
use WPDesk\View\Resolver\ChainResolver;
use WPDesk\View\Resolver\DirResolver;
use WPDesk\View\Resolver\WPThemeResolver;
class EmailSender {
/**
* @var EmailGettersInterface[]
* @var EmailInterface[]
*/
private $emails = [];
/**
* @var string
*/
private $from;
private $from = 'wordpress@wordpress.org';
/**
* @var string
*/
private $from_name;
private $from_name = 'WordPress';
/**
* @var Renderer
*/
private $renderer;
/**
* @param $from
* @param $from_name
*/
public function __construct( $from = '', $from_name = '' ) {
$this->from = $from;
$this->from_name = $from_name;
public function __construct() {
$this->init_renderer();
}
public function add_email( Email $email ) {
public function init_renderer() {
$resolver = new ChainResolver();
$resolver->appendResolver( new DirResolver( __DIR__ ) );
$this->renderer = new SimplePhpRenderer( $resolver );
}
public function set_renderer( Renderer $renderer ) {
$this->renderer = $renderer;
}
public function add_email( EmailInterface $email ) {
$this->emails[ $email->get_id() ] = $email;
}
......@@ -38,6 +59,11 @@ class EmailSender {
return $this->emails;
}
public function set_from( string $from ) {
$this->from = $from;
}
/**
* WordPress callback for setting the from email
*
......@@ -45,7 +71,7 @@ class EmailSender {
*
* @return string
*/
public function from( $email ) {
public function from( $email ): string {
if ( ! empty( $this->from ) && is_email( $this->from ) ) {
$email = $this->from;
}
......@@ -53,6 +79,12 @@ class EmailSender {
return $email;
}
public function set_from_name( string $from_name ) {
$this->from_name = $from_name;
}
/**
* WordPress callback for setting the from name
*
......@@ -78,16 +110,42 @@ class EmailSender {
add_filter( 'wp_mail_from_name', array( $this, 'from_name' ) );
}
public function send() {
public function send( array $placeholders = [] ) {
foreach ( $this->get_emails() as $email ) {
$this->before_wp_mail();
wp_mail(
$email->get_recipients(), $email->get_subject(), $email->render(), $email->get_headers(), $email->get_attachments()
);
$this->after_wp_mail();
$content = $this->renderer->render( $email->get_id(), [] );
$content = $this->replace_placeholders( $content, $placeholders );
if ( $email->get_is_enable() ) {
$this->before_wp_mail();
wp_mail(
$email->get_recipients(), $email->get_subject(), $this->get_html_content( $content ), $email->get_headers(), $email->get_attachments()
);
$this->after_wp_mail();
}
}
}
/**
* @param string $content
* @param array $placeholders
*
* @return array|string|string[]
*/
private function replace_placeholders( string $content, array $placeholders = [] ): string {
return str_replace( array_keys( $placeholders ), array_values( $placeholders ), $content );
}
/**
* @param string $content
*
* @return mixed|string
*/
private function get_html_content( string $content ): string {
$styles = $this->renderer->render( 'styles', [] );
return HTMLDecorator::style_inline( $content, $styles );
}
/**
* Remove filters after fire wp_mail.
*
......
<?php
namespace WPDesk\Library\WPEmail;
use WPDesk\Library\WPEmail\Emails\AdminEmail;
use WPDesk\Library\WPEmail\Emails\Email;
use WPDesk\Library\WPEmail\Emails\EmailSender;
use WPDesk\Persistence\Adapter\WordPress\WordpressOptionsContainer;
use WPDesk\Persistence\Adapter\WordPress\WordpressTransientContainer;
use WPDesk\View\Renderer\SimplePhpRenderer;
use WPDesk\View\Resolver\ChainResolver;
use WPDesk\View\Resolver\DirResolver;
use WPDesk\View\Resolver\WPThemeResolver;
class Integration {
public function __construct() {
$chain_resolver = new ChainResolver();
$chain_resolver->appendResolver( new WPThemeResolver( 'email_templates' ) );
$chain_resolver->appendResolver( new DirResolver( __DIR__ . '/templates' ) );
$renderer = new SimplePhpRenderer( $chain_resolver );
$email_sender = new EmailSender( 'email@mojastron.pl', 'Moj sklep' );
$email = new Email( $renderer, [] );
$email->set_subject( 'Tytuł')->set_heading( 'Nowa wiadomość' );
$email_sender->add_email( $email );
$email_sender->send();
}
}
......@@ -2,38 +2,26 @@
namespace WPDesk\Library\WPEmail\Parser;
use Pelago\Emogrifier\CssInliner;
use Pelago\Emogrifier\HtmlProcessor\CssToAttributeConverter;
use Pelago\Emogrifier\HtmlProcessor\HtmlPruner;
class HTMLDecorator {
public static function style_inline( $content ) {
if ( in_array( $this->get_content_type(), array( 'text/html', 'multipart/alternative' ), true ) ) {
ob_start();
wc_get_template( 'emails/email-styles.php' );
$css = apply_filters( 'woocommerce_email_styles', ob_get_clean(), $this );
$css_inliner_class = \Pelago\Emogrifier\CssInliner::class;
if ( $this->supports_emogrifier() && class_exists( $css_inliner_class ) ) {
try {
$css_inliner = \Pelago\Emogrifier\CssInliner::fromHtml( $content )->inlineCss( $css );
do_action( 'woocommerce_emogrifier', $css_inliner, $this );
$dom_document = $css_inliner->getDomDocument();
HtmlPruner::fromDomDocument( $dom_document )->removeElementsWithDisplayNone();
$content = CssToAttributeConverter::fromDomDocument( $dom_document )
->convertCssToVisualAttributes()
->render();
} catch ( \Exception $e ) {
$logger = wc_get_logger();
$logger->error( $e->getMessage(), array( 'source' => 'emogrifier' ) );
}
} else {
$content = '<style type="text/css">' . $css . '</style>' . $content;
public static function style_inline( $content, $styles = '' ) {
if ( class_exists( 'DOMDocument' ) ) {
try {
$css_inliner = CssInliner::fromHtml( $content )->inlineCss( $styles );
$dom_document = $css_inliner->getDomDocument();
HtmlPruner::fromDomDocument( $dom_document )->removeElementsWithDisplayNone();
$content = CssToAttributeConverter::fromDomDocument( $dom_document )
->convertCssToVisualAttributes()
->render();
} catch ( \Exception $e ) {
error_log( $e->getMessage() );
}
} else {
$content = '<style type="text/css">' . strip_tags( $styles ) . '</style>' . $content;
}
return $content;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment