Browse Source

Render methods removed from 'yii\mail\MessageInterface'.

Method 'yii\mail\MailerInterface::compose()' reworked allowing rendering message body.
tags/2.0.0-beta
Paul Klimov 11 years ago
parent
commit
1aafa73e15
  1. 2
      extensions/swiftmailer/yii/swiftmailer/Mailer.php
  2. 58
      framework/yii/mail/BaseMailer.php
  3. 48
      framework/yii/mail/BaseMessage.php
  4. 13
      framework/yii/mail/MailerInterface.php
  5. 43
      framework/yii/mail/MessageInterface.php
  6. 2
      tests/unit/extensions/swiftmailer/MessageTest.php
  7. 70
      tests/unit/framework/mail/BaseMailerTest.php
  8. 51
      tests/unit/framework/mail/BaseMessageTest.php

2
extensions/swiftmailer/yii/swiftmailer/Mailer.php

@ -36,7 +36,7 @@ use Yii;
* *
* @see http://swiftmailer.org * @see http://swiftmailer.org
* *
* @method Message message(array $config = []) creates new message instance from given configuration. * @method Message compose($view = null, array $params = []) creates new message optionally filling up its body via view rendering.
* *
* @author Paul Klimov <klimov.paul@gmail.com> * @author Paul Klimov <klimov.paul@gmail.com>
* @since 2.0 * @since 2.0

58
framework/yii/mail/BaseMailer.php

@ -33,7 +33,7 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
/** /**
* @var string directory containing view files for this email messages. * @var string directory containing view files for this email messages.
*/ */
public $viewPath = '@app/mailviews'; public $viewPath = '@app/mails';
/** /**
* @var string HTML layout view name. * @var string HTML layout view name.
*/ */
@ -54,17 +54,12 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
* - 'subject' argument for [[MessageInterface::subject()]] * - 'subject' argument for [[MessageInterface::subject()]]
* - 'text' argument for [[MessageInterface::text()]] * - 'text' argument for [[MessageInterface::text()]]
* - 'html' argument for [[MessageInterface::html()]] * - 'html' argument for [[MessageInterface::html()]]
* - 'body' argument for [[MessageInterface::body()]]
* - 'renderText' list of arguments for [[MessageInterface::renderText()]]
* - 'renderHtml' list of arguments for [[MessageInterface::renderHtml()]]
* - 'renderBody' list of arguments for [[MessageInterface::renderBody()]]
* For example: * For example:
* ~~~ * ~~~
* array( * array(
* 'charset' => 'UTF-8', * 'charset' => 'UTF-8',
* 'from' => 'noreply@mydomain.com', * 'from' => 'noreply@mydomain.com',
* 'bcc' => 'email.test@mydomain.com', * 'bcc' => 'developer@mydomain.com',
* 'renderText' => ['default/text', ['companyName' => 'YiiApp']],
* ) * )
* ~~~ * ~~~
*/ */
@ -111,16 +106,37 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
} }
/** /**
* Creates new message instance from given configuration. * @inheritdoc
* Message configuration will be merged with [[messageConfig]]. */
* If 'class' parameter is omitted [[messageClass]], will be used. public function compose($view = null, array $params = [])
* @param array $config message configuration. See [[messageConfig]] {
* for the configuration format details. $message = $this->createMessage();
if ($view !== null) {
$params['message'] = $message;
if (is_array($view)) {
if (array_key_exists('html', $view)) {
$message->html($this->render($view['html'], $params, $this->htmlLayout));
}
if (array_key_exists('text', $view)) {
$message->text($this->render($view['text'], $params, $this->textLayout));
}
} else {
$html = $this->render($view, $params, $this->htmlLayout);
$message->html($html);
$message->text(strip_tags($html));
}
}
return $message;
}
/**
* Creates mew message instance using configuration from [[messageConfig]].
* If 'class' parameter is omitted, [[messageClass]] will be used.
* @return MessageInterface message instance. * @return MessageInterface message instance.
*/ */
public function message(array $config = []) protected function createMessage()
{ {
$config = array_merge($this->messageConfig, $config); $config = $this->messageConfig;
if (!array_key_exists('class', $config)) { if (!array_key_exists('class', $config)) {
$config['class'] = $this->messageClass; $config['class'] = $this->messageClass;
} }
@ -133,32 +149,18 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
'subject', 'subject',
'text', 'text',
'html', 'html',
'body',
];
$setupMethodNames = [
'renderText',
'renderHtml',
'renderBody',
]; ];
$directSetterConfig = []; $directSetterConfig = [];
$setupMethodConfig = [];
foreach ($config as $name => $value) { foreach ($config as $name => $value) {
if (in_array($name, $directSetterNames, true)) { if (in_array($name, $directSetterNames, true)) {
$directSetterConfig[$name] = $value; $directSetterConfig[$name] = $value;
unset($config[$name]); unset($config[$name]);
} }
if (in_array($name, $setupMethodNames, true)) {
$setupMethodConfig[$name] = $value;
unset($config[$name]);
}
} }
$message = Yii::createObject($config); $message = Yii::createObject($config);
foreach ($directSetterConfig as $name => $value) { foreach ($directSetterConfig as $name => $value) {
$message->$name($value); $message->$name($value);
} }
foreach ($setupMethodConfig as $method => $arguments) {
call_user_func_array(array($message, $method), $arguments);
}
return $message; return $message;
} }

48
framework/yii/mail/BaseMessage.php

@ -44,54 +44,6 @@ abstract class BaseMessage extends Object implements MessageInterface
} }
/** /**
* @inheritdoc
*/
public function body($body)
{
if (is_array($body)) {
$this->html($body['html']);
$this->text($body['text']);
} else {
$this->html($body);
$this->text(strip_tags($body));
}
return $this;
}
/**
* @inheritdoc
*/
public function renderHtml($view, $params = [])
{
$this->html($this->getMailer()->render($view, $params, $this->getMailer()->htmlLayout));
return $this;
}
/**
* @inheritdoc
*/
public function renderText($view, $params = [])
{
$this->text($this->getMailer()->render($view, $params, $this->getMailer()->textLayout));
return $this;
}
/**
* @inheritdoc
*/
public function renderBody($view, $params = [])
{
if (is_array($view)) {
$this->renderHtml($view['html'], $params);
$this->renderText($view['text'], $params);
} else {
$html = $this->getMailer()->render($view, $params, $this->getMailer()->htmlLayout);
$this->body($html);
}
return $this;
}
/**
* PHP magic method that returns the string representation of this object. * PHP magic method that returns the string representation of this object.
* @return string the string representation of this object. * @return string the string representation of this object.
*/ */

13
framework/yii/mail/MailerInterface.php

@ -18,11 +18,18 @@ namespace yii\mail;
interface MailerInterface interface MailerInterface
{ {
/** /**
* Creates new message instance from given configuration. * Creates new message optionally filling up its body via view rendering.
* @param array $config message configuration. * The view to be rendered can be specified in one of the following formats:
* - path alias (e.g. "@app/mails/contact/body");
* - relative path (e.g. "contact"): the actual view file will be resolved by [[\yii\base\ViewContextInterface]].
* @param string|array $view view, which should be used to render message body
* - if string - the view name or the path alias of the HTML body view file, in this case
* text body will be composed automatically from html one.
* - if array - list of views for each body type in format: ['html' => 'htmlView', 'text' => 'textView']
* @param array $params the parameters (name-value pairs) that will be extracted and made available in the view file.
* @return MessageInterface message instance. * @return MessageInterface message instance.
*/ */
public function message(array $config = []); public function compose($view = null, array $params = []);
/** /**
* Sends the given email message. * Sends the given email message.

43
framework/yii/mail/MessageInterface.php

@ -97,16 +97,6 @@ interface MessageInterface
public function html($html); public function html($html);
/** /**
* Sets message HTML and plain text content.
* @param string|array $body varies method behavior depending on type:
* - string - the HTML body content, in this case text body will be composed from
* html one using [[strip_tags()]] function.
* - array - list of body contents for each body type in format: ['html' => 'htmlContent', 'text' => 'textContent']
* @return static self reference.
*/
public function body($body);
/**
* Attaches existing file to the email message. * Attaches existing file to the email message.
* @param string $fileName full file name * @param string $fileName full file name
* @param array $options options for embed file. Valid options are: * @param array $options options for embed file. Valid options are:
@ -155,39 +145,6 @@ interface MessageInterface
public function send(); public function send();
/** /**
* Fills up HTML body rendering a view.
* The view to be rendered can be specified in one of the following formats:
* - path alias (e.g. "@app/mails/contact/body");
* - relative path (e.g. "contact"): the actual view file will be resolved by [[\yii\base\ViewContextInterface]].
* @param string $view the view name or the path alias of the view file.
* @param array $params the parameters (name-value pairs) that will be extracted and made available in the view file.
* @return static self reference.
*/
public function renderHtml($view, $params = []);
/**
* Fills up plain text body rendering a view.
* The view to be rendered can be specified in one of the following formats:
* - path alias (e.g. "@app/mails/contact/body");
* - relative path (e.g. "contact"): the actual view file will be resolved by [[\yii\base\ViewContextInterface]].
* @param string $view the view name or the path alias of the view file.
* @param array $params the parameters (name-value pairs) that will be extracted and made available in the view file.
* @return static self reference.
*/
public function renderText($view, $params = []);
/**
* Composes the message HTML and plain text body.
* @param string|array $view varies method behavior depending on type:
* - string - the view name or the path alias of the HTML body view file, in this case
* text body will be composed from html one using [[strip_tags()]] function.
* - array - list of views for each body type in format: ['html' => 'htmlView', 'text' => 'textView']
* @param array $params the parameters (name-value pairs) that will be extracted and made available in the view file.
* @return static self reference.
*/
public function renderBody($view, $params = []);
/**
* Returns string representation of this message. * Returns string representation of this message.
* @return string the string representation of this message. * @return string the string representation of this message.
*/ */

2
tests/unit/extensions/swiftmailer/MessageTest.php

@ -63,7 +63,7 @@ class MessageTest extends VendorTestCase
*/ */
protected function createTestMessage() protected function createTestMessage()
{ {
return Yii::$app->getComponent('mail')->message(); return Yii::$app->getComponent('mail')->compose();
} }
/** /**

70
tests/unit/framework/mail/BaseMailerTest.php

@ -93,26 +93,16 @@ class BaseMailerTest extends TestCase
$this->assertTrue(is_object($view), 'Unable to get default view!'); $this->assertTrue(is_object($view), 'Unable to get default view!');
} }
public function testComposeMessage() public function testCreateMessage()
{ {
$mailer = new Mailer(); $mailer = new Mailer();
$message = $mailer->message(); $message = $mailer->compose();
$this->assertTrue(is_object($message), 'Unable to create message instance!'); $this->assertTrue(is_object($message), 'Unable to create message instance!');
$this->assertEquals($mailer->messageClass, get_class($message), 'Invalid message class!'); $this->assertEquals($mailer->messageClass, get_class($message), 'Invalid message class!');
$messageConfig = array(
'id' => 'test-id',
'encoding' => 'test-encoding',
);
$message = $mailer->message($messageConfig);
foreach ($messageConfig as $name => $value) {
$this->assertEquals($value, $message->$name, 'Unable to apply message config!');
}
} }
/** /**
* @depends testComposeMessage * @depends testCreateMessage
*/ */
public function testDefaultMessageConfig() public function testDefaultMessageConfig()
{ {
@ -135,7 +125,7 @@ class BaseMailerTest extends TestCase
$messageConfig = array_merge($notPropertyConfig, $propertyConfig); $messageConfig = array_merge($notPropertyConfig, $propertyConfig);
$mailer->messageConfig = $messageConfig; $mailer->messageConfig = $messageConfig;
$message = $mailer->message(); $message = $mailer->compose();
foreach ($notPropertyConfig as $name => $value) { foreach ($notPropertyConfig as $name => $value) {
$this->assertEquals($value, $message->{'_' . $name}); $this->assertEquals($value, $message->{'_' . $name});
@ -165,48 +155,58 @@ class BaseMailerTest extends TestCase
} }
/** /**
* @depends testComposeMessage
* @depends testRender * @depends testRender
*/ */
public function testComposeSetupMethods() public function testRenderLayout()
{ {
$mailer = $this->getTestMailComponent(); $mailer = $this->getTestMailComponent();
$mailer->textLayout = false;
$filePath = $this->getTestFilePath();
$viewName = 'test_view'; $viewName = 'test_view';
$viewFileName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $viewName . '.php'; $viewFileName = $filePath . DIRECTORY_SEPARATOR . $viewName . '.php';
$viewFileContent = 'view file content'; $viewFileContent = 'view file content';
file_put_contents($viewFileName, $viewFileContent); file_put_contents($viewFileName, $viewFileContent);
$messageConfig = array( $layoutName = 'test_layout';
'renderText' => [$viewName], $layoutFileName = $filePath . DIRECTORY_SEPARATOR . $layoutName . '.php';
); $layoutFileContent = 'Begin Layout <?php echo $content; ?> End Layout';
$message = $mailer->message($messageConfig); file_put_contents($layoutFileName, $layoutFileContent);
$this->assertEquals($viewFileContent, $message->_text); $renderResult = $mailer->render($viewName, [], $layoutName);
$this->assertEquals('Begin Layout ' . $viewFileContent . ' End Layout', $renderResult);
} }
/** /**
* @depends testCreateMessage
* @depends testRender * @depends testRender
*/ */
public function testRenderLayout() public function testCompose()
{ {
$mailer = $this->getTestMailComponent(); $mailer = $this->getTestMailComponent();
$mailer->htmlLayout = false;
$mailer->textLayout = false;
$filePath = $this->getTestFilePath(); $htmlViewName = 'test_html_view';
$htmlViewFileName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $htmlViewName . '.php';
$htmlViewFileContent = 'HTML <b>view file</b> content';
file_put_contents($htmlViewFileName, $htmlViewFileContent);
$viewName = 'test_view'; $textViewName = 'test_text_view';
$viewFileName = $filePath . DIRECTORY_SEPARATOR . $viewName . '.php'; $textViewFileName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $textViewName . '.php';
$viewFileContent = 'view file content'; $textViewFileContent = 'Plain text view file content';
file_put_contents($viewFileName, $viewFileContent); file_put_contents($textViewFileName, $textViewFileContent);
$layoutName = 'test_layout'; $message = $mailer->compose([
$layoutFileName = $filePath . DIRECTORY_SEPARATOR . $layoutName . '.php'; 'html' => $htmlViewName,
$layoutFileContent = 'Begin Layout <?php echo $content; ?> End Layout'; 'text' => $textViewName,
file_put_contents($layoutFileName, $layoutFileContent); ]);
$this->assertEquals($htmlViewFileContent, $message->_html, 'Unable to render html!');
$this->assertEquals($textViewFileContent, $message->_text, 'Unable to render text!');
$renderResult = $mailer->render($viewName, [], $layoutName); $message = $mailer->compose($htmlViewName);
$this->assertEquals('Begin Layout ' . $viewFileContent . ' End Layout', $renderResult); $this->assertEquals($htmlViewFileContent, $message->_html, 'Unable to render html by direct view!');
$this->assertEquals(strip_tags($htmlViewFileContent), $message->_text, 'Unable to render text by direct view!');
} }
} }

51
tests/unit/framework/mail/BaseMessageTest.php

@ -40,52 +40,26 @@ class BaseMessageTest extends TestCase
// Tests : // Tests :
public function testRender() public function testGetMailer()
{ {
$mailer = $this->getMailer(); $mailer = $this->getMailer();
$message = $mailer->message(); $message = $mailer->compose();
$this->assertEquals($mailer, $message->getMailer());
$viewName = 'test/text/view';
$message->renderText($viewName);
$expectedText = 'view=' . $viewName . ' layout=' . $mailer->textLayout;
$this->assertEquals($expectedText, $message->text, 'Unable to render text!');
$viewName = 'test/html/view';
$message->renderHtml($viewName);
$expectedHtml = 'view=' . $viewName . ' layout=' . $mailer->htmlLayout;
$this->assertEquals($expectedHtml, $message->html, 'Unable to render html!');
} }
/** public function testSend()
* @depends testRender
*/
public function testComposeBody()
{ {
$mailer = $this->getMailer(); $mailer = $this->getMailer();
$message = $mailer->message(); $message = $mailer->compose();
$message->send();
$viewName = 'test/html/view'; $this->assertEquals($message, $mailer->sentMessages[0], 'Unable to send message!');
$message->renderBody($viewName);
$expectedHtml = 'view=' . $viewName . ' layout=' . $mailer->htmlLayout;
$this->assertEquals($expectedHtml, $message->html, 'Unable to compose html!');
$expectedText = strip_tags($expectedHtml);
$this->assertEquals($expectedText, $message->text, 'Unable to compose text from html!');
$textViewName = 'test/text/view';
$htmlViewName = 'test/html/view';
$message->renderBody(['text' => $textViewName, 'html' => $htmlViewName]);
$expectedHtml = 'view=' . $htmlViewName . ' layout=' . $mailer->htmlLayout;
$this->assertEquals($expectedHtml, $message->html, 'Unable to compose html from separated view!');
$expectedText = 'view=' . $textViewName . ' layout=' . $mailer->textLayout;
$this->assertEquals($expectedText, $message->text, 'Unable to compose text from separated view!');
} }
public function testSend() public function testToString()
{ {
$mailer = $this->getMailer(); $mailer = $this->getMailer();
$message = $mailer->message(); $message = $mailer->compose();
$message->send(); $this->assertEquals($message->toString(), '' . $message);
$this->assertEquals($message, $mailer->sentMessages[0], 'Unable to send message!');
} }
} }
@ -97,11 +71,6 @@ class TestMailer extends BaseMailer
public $messageClass = 'yiiunit\framework\mail\TestMessage'; public $messageClass = 'yiiunit\framework\mail\TestMessage';
public $sentMessages = array(); public $sentMessages = array();
public function render($view, $params = [], $layout = false)
{
return 'view=' . $view . ' layout=' . $layout;
}
public function send($message) public function send($message)
{ {
$this->sentMessages[] = $message; $this->sentMessages[] = $message;

Loading…
Cancel
Save