Files
lichterei-web/kirby/src/Cms/Email.php
Bastian Allgeier 9c89153d35 Upgrade to 3.2.0
2019-06-25 09:56:08 +02:00

161 lines
4.5 KiB
PHP
Executable File

<?php
namespace Kirby\Cms;
use Kirby\Exception\NotFoundException;
/**
* Wrapper around our PHPMailer package, which
* handles all the magic connections between Kirby
* and sending emails, like email templates, file
* attachments, etc.
*
* @package Kirby Cms
* @author Bastian Allgeier <bastian@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier GmbH
* @license https://getkirby.com/license
*/
class Email
{
protected $options;
protected $preset;
protected $props;
protected static $transform = [
'from' => 'user',
'replyTo' => 'user',
'to' => 'user',
'cc' => 'user',
'bcc' => 'user',
'attachments' => 'file'
];
public function __construct($preset = [], array $props = [])
{
$this->options = App::instance()->option('email');
// load presets from options
$this->preset = $this->preset($preset);
$this->props = array_merge($this->preset, $props);
// add transport settings
$this->props['transport'] = $this->options['transport'] ?? [];
// transform model objects to values
foreach (static::$transform as $prop => $model) {
$this->transformProp($prop, $model);
}
// load template for body text
$this->template();
}
/**
* @param string|array $preset
* @return array
*/
protected function preset($preset): array
{
// only passed props, not preset name
if (is_string($preset) !== true) {
return $preset;
}
// preset does not exist
if (isset($this->options['presets'][$preset]) === false) {
throw new NotFoundException([
'key' => 'email.preset.notFound',
'data' => ['name' => $preset]
]);
}
return $this->options['presets'][$preset];
}
protected function template(): void
{
if (isset($this->props['template']) === true) {
// prepare data to be passed to template
$data = $this->props['data'] ?? [];
// check if html/text templates exist
$html = $this->getTemplate($this->props['template'], 'html');
$text = $this->getTemplate($this->props['template'], 'text');
if ($html->exists()) {
$this->props['body'] = [
'html' => $html->render($data)
];
if ($text->exists()) {
$this->props['body']['text'] = $text->render($data);
}
// fallback to single email text template
} elseif ($text->exists()) {
$this->props['body'] = $text->render($data);
} else {
throw new NotFoundException('The email template "' . $this->props['template'] . '" cannot be found');
}
}
}
/**
* Undocumented function
*
* @param string $name
* @param string|null $type
* @return Kirby\Cms\Template
*/
protected function getTemplate(string $name, string $type = null)
{
return App::instance()->template('emails/' . $name, $type, 'text');
}
public function toArray(): array
{
return $this->props;
}
protected function transformFile($file)
{
return $this->transformModel($file, 'Kirby\Cms\File', 'root');
}
protected function transformModel($value, $class, $content)
{
// value is already a string
if (is_string($value) === true) {
return $value;
}
// value is a model object, get value through content method
if (is_a($value, $class) === true) {
return $value->$content();
}
// value is an array or collection, call transform on each item
if (is_array($value) === true || is_a($value, 'Kirby\Cms\Collection') === true) {
$models = [];
foreach ($value as $model) {
$models[] = $this->transformModel($model, $class, $content);
}
return $models;
}
}
protected function transformProp(string $prop, string $model): void
{
if (isset($this->props[$prop]) === true) {
$this->props[$prop] = $this->{'transform' . ucfirst($model)}($this->props[$prop]);
}
}
protected function transformUser($user)
{
return $this->transformModel($user, 'Kirby\Cms\User', 'email');
}
}