224 lines
5.6 KiB
PHP
224 lines
5.6 KiB
PHP
<?php namespace RainLab\Notify\NotifyRules;
|
|
|
|
use Illuminate\Support\Facades\Log;
|
|
use Mail;
|
|
use Lang;
|
|
use Config;
|
|
use System\Models\MailTemplate;
|
|
use RainLab\Notify\Classes\ActionBase;
|
|
use Backend\Models\User as AdminUserModel;
|
|
use Backend\Models\UserGroup as AdminGroupModel;
|
|
use ApplicationException;
|
|
|
|
class SendMailTemplateAction extends ActionBase
|
|
{
|
|
public $recipientModes = [
|
|
'system' => 'System default',
|
|
'user' => 'User email address (if applicable)',
|
|
'sender' => 'Sender user email address (if applicable)',
|
|
'admin' => 'Back-end administrators',
|
|
'custom' => 'Specific email address',
|
|
];
|
|
|
|
/**
|
|
* Returns information about this event, including name and description.
|
|
*/
|
|
public function actionDetails()
|
|
{
|
|
return [
|
|
'name' => 'Compose a mail message',
|
|
'description' => 'Send a message to a recipient',
|
|
'icon' => 'icon-envelope'
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Triggers this action.
|
|
* @param array $params
|
|
* @return void
|
|
*/
|
|
public function triggerAction($params)
|
|
{
|
|
if($this->host->send_to_mode == 'user' && $params['user']) {
|
|
if(!$params['user']['email_verified'])
|
|
return;
|
|
}
|
|
$template = $this->host->mail_template;
|
|
|
|
$recipient = $this->getRecipientAddress($params);
|
|
|
|
$replyTo = $this->getReplyToAddress($params);
|
|
|
|
if (!$recipient || !$template) {
|
|
throw new ApplicationException('Missing valid recipient or mail template');
|
|
}
|
|
|
|
Mail::sendTo($recipient, $template, $params, function($message) use ($replyTo) {
|
|
if ($replyTo) {
|
|
$message->replyTo($replyTo);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Field configuration for the action.
|
|
*/
|
|
public function defineFormFields()
|
|
{
|
|
return 'fields.yaml';
|
|
}
|
|
|
|
/**
|
|
* Defines validation rules for the custom fields.
|
|
* @return array
|
|
*/
|
|
public function defineValidationRules()
|
|
{
|
|
return [
|
|
'mail_template' => 'required',
|
|
'send_to_mode' => 'required',
|
|
];
|
|
}
|
|
|
|
public function getTitle()
|
|
{
|
|
if ($this->isAdminMode()) {
|
|
return 'Compose mail to administrators';
|
|
}
|
|
|
|
return parent::getTitle();
|
|
}
|
|
|
|
public function getActionIcon()
|
|
{
|
|
if ($this->isAdminMode()) {
|
|
return 'icon-envelope-square';
|
|
}
|
|
|
|
return parent::getActionIcon();
|
|
}
|
|
|
|
public function getText()
|
|
{
|
|
$hostObj = $this->host;
|
|
|
|
$recipient = array_get($this->recipientModes, $hostObj->send_to_mode);
|
|
|
|
if ($this->isAdminMode()) {
|
|
if ($groupId = $this->host->send_to_admin) {
|
|
if ($group = AdminGroupModel::find($groupId)) {
|
|
$adminText = $group->name;
|
|
}
|
|
else {
|
|
$adminText = '?';
|
|
}
|
|
|
|
$adminText .= ' admin group';
|
|
}
|
|
else {
|
|
$adminText = 'all admins';
|
|
}
|
|
return sprintf(
|
|
'Send a message to %s using template %s',
|
|
$adminText,
|
|
$hostObj->mail_template
|
|
);
|
|
}
|
|
|
|
if ($hostObj->mail_template) {
|
|
return sprintf(
|
|
'Send a message to %s using template %s',
|
|
mb_strtolower($recipient),
|
|
$hostObj->mail_template
|
|
);
|
|
}
|
|
|
|
return parent::getText();
|
|
}
|
|
|
|
public function getSendToAdminOptions()
|
|
{
|
|
$options = ['' => '- All administrators -'];
|
|
|
|
$groups = AdminGroupModel::lists('name', 'id');
|
|
|
|
return $options + $groups;
|
|
}
|
|
|
|
public function getSendToModeOptions()
|
|
{
|
|
$modes = $this->recipientModes;
|
|
|
|
unset($modes['system']);
|
|
|
|
return $modes;
|
|
}
|
|
|
|
public function getReplyToModeOptions()
|
|
{
|
|
$modes = $this->recipientModes;
|
|
|
|
unset($modes['admin']);
|
|
|
|
return $modes;
|
|
}
|
|
|
|
public function getMailTemplateOptions()
|
|
{
|
|
$codes = array_keys(MailTemplate::listAllTemplates());
|
|
$result = array_combine($codes, $codes);
|
|
return $result;
|
|
}
|
|
|
|
protected function getReplyToAddress($params)
|
|
{
|
|
$mode = $this->host->reply_to_mode;
|
|
|
|
if ($mode == 'custom') {
|
|
return $this->host->reply_to_custom;
|
|
}
|
|
|
|
if ($mode == 'user' || $mode == 'sender') {
|
|
$obj = array_get($params, $mode);
|
|
return $obj->email;
|
|
}
|
|
}
|
|
|
|
protected function getRecipientAddress($params)
|
|
{
|
|
$mode = $this->host->send_to_mode;
|
|
|
|
if ($mode == 'custom') {
|
|
return $this->host->send_to_custom;
|
|
}
|
|
|
|
if ($mode == 'system') {
|
|
$name = Config::get('mail.from.name', 'Your Site');
|
|
$address = Config::get('mail.from.address', 'admin@domain.tld');
|
|
return [$address => $name];
|
|
}
|
|
|
|
if ($mode == 'admin') {
|
|
if ($groupId = $this->host->send_to_admin) {
|
|
if (!$group = AdminGroupModel::find($groupId)) {
|
|
throw new ApplicationException('Unable to find admin group with ID: '.$groupId);
|
|
}
|
|
|
|
return $group->users->lists('full_name', 'email');
|
|
}
|
|
else {
|
|
return AdminUserModel::all()->lists('full_name', 'email');
|
|
}
|
|
}
|
|
|
|
if ($mode == 'user' || $mode == 'sender') {
|
|
return array_get($params, $mode);
|
|
}
|
|
}
|
|
|
|
protected function isAdminMode()
|
|
{
|
|
return $this->host->send_to_mode == 'admin';
|
|
}
|
|
}
|