1226 lines
45 KiB
PHP
1226 lines
45 KiB
PHP
<?php
|
|
/**
|
|
* @package JEM
|
|
* @subpackage JEM Mailer Plugin
|
|
* @copyright (C) 2013-2024 joomlaeventmanager.net
|
|
* @copyright (C) 2005-2009 Christoph Lukes
|
|
* @license https://www.gnu.org/licenses/gpl-3.0 GNU/GPL
|
|
*
|
|
* @todo: change onEventUserRegistered
|
|
* there is a check for the waitinglist and that one is looking
|
|
* at the option "reg_email_to". The onEventUnregistered function
|
|
* has no check for the waitinglist.
|
|
*
|
|
* @todo: check output time/date
|
|
* it's possible that there is no time or date for an event.
|
|
* add check for global time/date format. At the moment the output
|
|
* format is not respecting the global-setting
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\Language\Text;
|
|
use Joomla\CMS\Uri\Uri;
|
|
use Joomla\CMS\Plugin\CMSPlugin;
|
|
use Joomla\CMS\Log\Log;
|
|
use Joomla\CMS\Router\Route;
|
|
use Joomla\CMS\Filter\OutputFilter;
|
|
use Joomla\CMS\HTML\HTMLHelper;
|
|
// Import library dependencies
|
|
jimport('joomla.utilities.mail');
|
|
|
|
require_once(JPATH_SITE.'/components/com_jem/helpers/route.php');
|
|
require_once(JPATH_SITE.'/components/com_jem/helpers/helper.php');
|
|
require_once(JPATH_SITE.'/components/com_jem/factory.php');
|
|
|
|
|
|
class plgJemMailer extends CMSPlugin
|
|
{
|
|
private $_SiteName = '';
|
|
private $_MailFrom = '';
|
|
private $_FromName = '';
|
|
private $_AdminDBList = '';
|
|
private $_UseLoginName = false; // false: name true: username
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param object &$subject The object to observe
|
|
* @param array $config An array that holds the plugin configuration
|
|
*
|
|
*/
|
|
public function __construct(& $subject, $config)
|
|
{
|
|
parent::__construct($subject, $config);
|
|
$this->loadLanguage();
|
|
|
|
$app = Factory::getApplication();
|
|
$jemsettings = JemHelper::globalattribs();
|
|
|
|
$this->_SiteName = $app->get('sitename');
|
|
$this->_MailFrom = $app->get('mailfrom');
|
|
$this->_FromName = $app->get('fromname');
|
|
$this->_AdminDBList = $this->Adminlist();
|
|
$this->_UseLoginName = !$jemsettings->get('global_regname', 1); // regname == 1: name, 0: username (login name)
|
|
}
|
|
|
|
/**
|
|
* This method handles any mailings triggered by an event registration action
|
|
*
|
|
* @access public
|
|
* @param int $register_id Integer Registration record identifier
|
|
* @return boolean
|
|
*
|
|
*/
|
|
public function onEventUserRegistered($register_id, $registration = false)
|
|
{
|
|
####################
|
|
## DEFINING ARRAY ##
|
|
####################
|
|
|
|
$send_to = array(
|
|
'user' => $this->params->get('reg_mail_user', '1'),
|
|
'admin' => $this->params->get('reg_mail_admin', '0'),
|
|
'creator' => $this->params->get('reg_mail_creator', '0'),
|
|
'category' => $this->params->get('reg_mail_category', '0'),
|
|
'group' => $this->params->get('reg_mail_group', '0'),
|
|
);
|
|
|
|
// skip if processing not needed
|
|
if (!array_filter($send_to)) {
|
|
return true;
|
|
}
|
|
|
|
$uri = Uri::getInstance();
|
|
$user = JemFactory::getUser();
|
|
$userid = $user->get('id');
|
|
$username = empty($this->_UseLoginName) ? $user->name : $user->username;
|
|
|
|
// get data
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
|
|
$case_when = ' CASE WHEN ';
|
|
$case_when .= $query->charLength('a.alias');
|
|
$case_when .= ' THEN ';
|
|
$id = $query->castAsChar('a.id');
|
|
$case_when .= $query->concatenate(array($id, 'a.alias'), ':');
|
|
$case_when .= ' ELSE ';
|
|
$case_when .= $id.' END as slug';
|
|
|
|
$query->select(array('a.id', 'a.title', 'a.dates', 'a.times', 'a.locid', 'a.published', 'a.created', 'a.modified', 'a.created_by',
|
|
'r.waiting', $case_when, 'r.uid', 'r.status', 'r.comment', 'r.places'));
|
|
$query->select($query->concatenate(array('a.introtext', 'a.fulltext')).' AS text');
|
|
$query->select(array('v.venue', 'v.city'));
|
|
$query->from($db->quoteName('#__jem_register').' AS r');
|
|
$query->join('INNER', '#__jem_events AS a ON r.event = a.id');
|
|
$query->join('LEFT', '#__jem_venues AS v ON v.id = a.locid');
|
|
$query->where(array('r.id= '.$db->quote($register_id)));
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($event = $db->loadObject())) {
|
|
return false;
|
|
}
|
|
|
|
// check if currrent user handles on behalf of
|
|
$attendeeid = $event->uid;
|
|
if ($attendeeid != $userid) {
|
|
$attendee = JemFactory::getUser($attendeeid);
|
|
$attendeename = empty($this->_UseLoginName) ? $attendee->name : $attendee->username;
|
|
} else {
|
|
$attendee = $user;
|
|
$attendeename = $username;
|
|
}
|
|
|
|
//create link to event
|
|
$link = Route::_($uri->root() . JEMHelperRoute::getEventRoute($event->slug), false);
|
|
|
|
// Strip tags/scripts, etc. from description and comment
|
|
$text_description = OutputFilter::cleanText($event->text);
|
|
$comment = empty($event->comment) ? false : OutputFilter::cleanText($event->comment);
|
|
|
|
$recipients = $this->_getRecipients($send_to, array('user'), $event->id, $event->created_by, $attendeeid);
|
|
|
|
$waiting = $event->waiting ? '_WAITING' : '';
|
|
|
|
#####################
|
|
## SENDMAIL - USER ##
|
|
#####################
|
|
|
|
if (!empty($recipients['user'])) {
|
|
$data = new stdClass();
|
|
switch ($event->status) {
|
|
case -1: // not attanding
|
|
$txt_subject = 'PLG_JEM_MAILER_USER_REG_NOT_ATTEND_SUBJECT';
|
|
if ($attendeeid != $userid) {
|
|
$txt_body = 'PLG_JEM_MAILER_USER_REG_ONBEHALF_NOT_ATTEND_BODY_' . ($comment ? 'B' : 'A');
|
|
} else {
|
|
$txt_body = 'PLG_JEM_MAILER_USER_REG_NOT_ATTEND_BODY_' . ($comment ? 'A' : '9');
|
|
}
|
|
break;
|
|
case 1: // attending
|
|
$txt_subject = 'PLG_JEM_MAILER_USER_REG'.$waiting.'_SUBJECT';
|
|
if ($attendeeid != $userid) {
|
|
$txt_body = 'PLG_JEM_MAILER_USER_REG_ONBEHALF'.$waiting.'_BODY_' . ($comment ? 'B' : 'A');
|
|
} else {
|
|
$txt_body = 'PLG_JEM_MAILER_USER_REG'.$waiting.'_BODY_' . ($comment ? 'A' : '9');
|
|
}
|
|
break;
|
|
default: // whatever
|
|
if ($attendeeid != $userid) {
|
|
$txt_subject = 'PLG_JEM_MAILER_USER_REG_INVITATION_SUBJECT';
|
|
$txt_body = 'PLG_JEM_MAILER_USER_REG_INVITATION_BODY_' . ($comment ? 'B' : 'A');
|
|
} else {
|
|
$txt_subject = 'PLG_JEM_MAILER_USER_REG_UNKNOWN_SUBJECT';
|
|
$txt_body = 'PLG_JEM_MAILER_USER_REG_UNKNOWN_BODY_' . ($comment ? 'A' : '9');
|
|
}
|
|
break;
|
|
}
|
|
$data->subject = Text::sprintf($txt_subject, $this->_SiteName);
|
|
if ($attendeeid != $userid) {
|
|
if ($comment) {
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $username, $comment, $event->title, $event->dates, $event->times, $event->venue, $event->city, ($event->status<0?$registration:$event->places), $text_description, $link, $this->_SiteName);
|
|
} else {
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $username, $event->title, $event->dates, $event->times, $event->venue, $event->city, ($event->status<0?$registration:$event->places), $text_description, $link, $this->_SiteName);
|
|
}
|
|
} else {
|
|
if ($comment) {
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $comment, $event->title, $event->dates, $event->times, $event->venue, $event->city, ($event->status<0?$registration:$event->places), $text_description, $link, $this->_SiteName);
|
|
} else {
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $event->title, $event->dates, $event->times, $event->venue, $event->city, ($event->status<0?$registration:$event->places), $text_description, $link, $this->_SiteName);
|
|
}
|
|
}
|
|
$data->receivers = $recipients['user'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
#############################
|
|
## SENDMAIL - ALL THE REST ##
|
|
#############################
|
|
|
|
if (!empty($recipients['all'])) {
|
|
$data = new stdClass();
|
|
switch ($event->status) {
|
|
case -1: // not attanding
|
|
$txt_subject = 'PLG_JEM_MAILER_ADMIN_REG_NOT_ATTEND_SUBJECT';
|
|
if ($attendeeid != $userid) {
|
|
$txt_body = 'PLG_JEM_MAILER_ADMIN_REG_ONBEHALF_NOT_ATTEND_BODY_' . ($comment ? 'A' : '9');
|
|
} else {
|
|
$txt_body = 'PLG_JEM_MAILER_ADMIN_REG_NOT_ATTEND_BODY_' . ($comment ? '9' : '8');
|
|
}
|
|
break;
|
|
case 1: // attending
|
|
$txt_subject = 'PLG_JEM_MAILER_ADMIN_REG'.$waiting.'_SUBJECT';
|
|
if ($attendeeid != $userid) {
|
|
$txt_body = 'PLG_JEM_MAILER_ADMIN_REG_ONBEHALF'.$waiting.'_BODY_' . ($comment ? 'A' : '9');
|
|
} else {
|
|
$txt_body = 'PLG_JEM_MAILER_ADMIN_REG'.$waiting.'_BODY_' . ($comment ? '9' : '8');
|
|
}
|
|
break;
|
|
default: // whatever
|
|
if ($attendeeid != $userid) {
|
|
$txt_subject = 'PLG_JEM_MAILER_ADMIN_REG_INVITATION_SUBJECT';
|
|
$txt_body = 'PLG_JEM_MAILER_ADMIN_REG_INVITATION_BODY_' . ($comment ? 'A' : '9');
|
|
} else {
|
|
$txt_subject = 'PLG_JEM_MAILER_ADMIN_REG_UNKNOWN_SUBJECT';
|
|
$txt_body = 'PLG_JEM_MAILER_ADMIN_REG_UNKNOWN_BODY_' . ($comment ? '9' : '8');
|
|
}
|
|
break;
|
|
}
|
|
$data->subject = Text::sprintf($txt_subject, $this->_SiteName);
|
|
if ($attendeeid != $userid) {
|
|
if ($comment) {
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $username, $comment, $event->title, $event->dates, $event->times, $event->venue, $event->city, ($event->status<0?$registration:$event->places), $link, $this->_SiteName);
|
|
} else {
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $username, $event->title, $event->dates, $event->times, $event->venue, $event->city, ($event->status<0?$registration:$event->places), $link, $this->_SiteName);
|
|
}
|
|
} else {
|
|
if ($comment) {
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $comment, $event->title, $event->dates, $event->times, $event->venue, $event->city, ($event->status<0?$registration:$event->places), $link, $this->_SiteName);
|
|
} else {
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $event->title, $event->dates, $event->times, $event->venue, $event->city, ($event->status<0?$registration:$event->places), $link, $this->_SiteName);
|
|
}
|
|
}
|
|
$data->recipients = $recipients['all'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* This method handles any mailings triggered by an attendees being bumped on/off waiting list
|
|
*
|
|
* @access public
|
|
* @param int $register_id Integer Registration record identifier
|
|
* @return boolean
|
|
*
|
|
*/
|
|
public function onUserOnOffWaitinglist($register_id)
|
|
{
|
|
####################
|
|
## DEFINING ARRAY ##
|
|
####################
|
|
|
|
$send_to = array(
|
|
'user' => $this->params->get('reg_mail_user_onoff', '1'),
|
|
'admin' => $this->params->get('reg_mail_admin_onoff', '0'),
|
|
'creator' => $this->params->get('reg_mail_creator_onoff', '0'),
|
|
'category' => $this->params->get('reg_mail_category_onoff', '0'),
|
|
'group' => $this->params->get('reg_mail_group_onoff', '0'),
|
|
);
|
|
|
|
// skip if processing not needed
|
|
if (!array_filter($send_to)) {
|
|
return true;
|
|
}
|
|
|
|
$uri = Uri::getInstance();
|
|
|
|
// get data
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
|
|
$case_when = ' CASE WHEN ';
|
|
$case_when .= $query->charLength('a.alias');
|
|
$case_when .= ' THEN ';
|
|
$id = $query->castAsChar('a.id');
|
|
$case_when .= $query->concatenate(array($id, 'a.alias'), ':');
|
|
$case_when .= ' ELSE ';
|
|
$case_when .= $id.' END as slug';
|
|
|
|
$query->select(array('a.id', 'a.title', 'a.dates', 'a.times', 'a.locid', 'a.published', 'a.created', 'a.modified', 'a.created_by',
|
|
'r.waiting', $case_when, 'r.uid', 'r.status', 'r.comment', 'r.places'));
|
|
$query->select($query->concatenate(array('a.introtext', 'a.fulltext')).' AS text');
|
|
$query->select(array('v.venue', 'v.city'));
|
|
$query->from($db->quoteName('#__jem_register').' AS r');
|
|
$query->join('INNER', '#__jem_events AS a ON r.event = a.id');
|
|
$query->join('LEFT', '#__jem_venues AS v ON v.id = a.locid');
|
|
$query->where(array('r.id= '.$db->quote($register_id)));
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($event = $db->loadObject())) {
|
|
return false;
|
|
}
|
|
|
|
$attendee = JemFactory::getUser($event->uid);
|
|
$attendeename = empty($this->_UseLoginName) ? $attendee->name : $attendee->username;
|
|
|
|
// create link to event
|
|
$link = Route::_($uri->root() . JEMHelperRoute::getEventRoute($event->slug), false);
|
|
|
|
// Strip tags/scripts, etc. from description
|
|
$text_description = OutputFilter::cleanText($event->text);
|
|
|
|
$recipients = $this->_getRecipients($send_to, array('user'), $event->id, $event->created_by, $attendee->get('id'));
|
|
|
|
#####################
|
|
## SENDMAIL - USER ##
|
|
#####################
|
|
|
|
if (!empty($recipients['user'])) {
|
|
$data = new stdClass();
|
|
$txt_subject = $event->waiting ? 'PLG_JEM_MAILER_USER_REG_ON_WAITING_SUBJECT' : 'PLG_JEM_MAILER_USER_REG_ON_ATTENDING_SUBJECT';
|
|
$data->subject = Text::sprintf($txt_subject, $this->_SiteName);
|
|
$txt_body = $event->waiting ? 'PLG_JEM_MAILER_USER_REG_ON_WAITING_BODY_9' : 'PLG_JEM_MAILER_USER_REG_ON_ATTENDING_BODY_9';
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $event->title, $event->dates, $event->times, $event->venue, $event->city, $event->places, $text_description, $link, $this->_SiteName);
|
|
$data->receivers = $recipients['user'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
#############################
|
|
## SENDMAIL - ALL THE REST ##
|
|
#############################
|
|
|
|
if (!empty($recipients['all'])) {
|
|
$data = new stdClass();
|
|
$txt_subject = $event->waiting ? 'PLG_JEM_MAILER_ADMIN_REG_ON_WAITING_SUBJECT' : 'PLG_JEM_MAILER_ADMIN_REG_ON_ATTENDING_SUBJECT';
|
|
$data->subject = Text::sprintf($txt_subject, $this->_SiteName);
|
|
$txt_body = $event->waiting ? 'PLG_JEM_MAILER_ADMIN_REG_ON_WAITING_BODY_8' : 'PLG_JEM_MAILER_ADMIN_REG_ON_ATTENDING_BODY_8';
|
|
$data->body = Text::sprintf($txt_body, $attendeename, $event->title, $event->dates, $event->times, $event->venue, $event->city, $event->places, $link, $this->_SiteName);
|
|
$data->recipients = $recipients['all'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* This method handles any mailings triggered by an event unregister action
|
|
*
|
|
* @access public
|
|
* @param int $event_id Integer Event identifier
|
|
* @param object $registration Entry from register table deleted now (optional)
|
|
* @param int $register_id Integer Registration record identifier (optional)
|
|
* @return boolean
|
|
*
|
|
*/
|
|
public function onEventUserUnregistered($event_id, $registration = false, $register_id = 0)
|
|
{
|
|
####################
|
|
## DEFINING ARRAY ##
|
|
####################
|
|
|
|
$send_to = array(
|
|
'user' => $this->params->get('unreg_mail_user', '1'),
|
|
'admin' => $this->params->get('unreg_mail_admin', '0'),
|
|
'creator' => $this->params->get('unreg_mail_creator', '0'),
|
|
'category' => $this->params->get('unreg_mail_category', '0'),
|
|
'group' => $this->params->get('unreg_mail_group', '0'),
|
|
);
|
|
|
|
// skip if processing not needed
|
|
if (!array_filter($send_to)) {
|
|
return true;
|
|
}
|
|
|
|
$uri = Uri::getInstance();
|
|
|
|
$user = JemFactory::getUser();
|
|
$userid = $user->get('id');
|
|
$username = empty($this->_UseLoginName) ? $user->name : $user->username;
|
|
|
|
// get data
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
|
|
$case_when = ' CASE WHEN ';
|
|
$case_when .= $query->charLength('a.alias');
|
|
$case_when .= ' THEN ';
|
|
$id = $query->castAsChar('a.id');
|
|
$case_when .= $query->concatenate(array($id, 'a.alias'), ':');
|
|
$case_when .= ' ELSE ';
|
|
$case_when .= $id.' END as slug';
|
|
|
|
$query->select(array('a.id', 'a.title', 'a.dates', 'a.times', 'a.locid', 'a.published', 'a.created', 'a.modified', 'a.created_by', $case_when));
|
|
$query->select($query->concatenate(array('a.introtext', 'a.fulltext')).' AS text');
|
|
$query->select(array('v.venue', 'v.city'));
|
|
if (empty($registration) && ((int)$register_id > 0)) {
|
|
$query->select(array('r.uid', 'r.status', 'r.waiting', 'r.comment', 'r.places'));
|
|
$query->from($db->quoteName('#__jem_register').' AS r');
|
|
$query->join('INNER', '#__jem_events AS a ON r.event = a.id');
|
|
$query->join('LEFT', '#__jem_venues AS v ON v.id = a.locid');
|
|
$query->where(array('r.id= '.$db->quote($register_id)));
|
|
} else {
|
|
$query->from($db->quoteName('#__jem_events').' AS a');
|
|
$query->join('LEFT', '#__jem_venues AS v ON v.id = a.locid');
|
|
$query->where(array('a.id = '.$db->quote($event_id)));
|
|
}
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($event = $db->loadObject())) {
|
|
return false;
|
|
}
|
|
|
|
if (empty($registration)) {
|
|
$registration = $event;
|
|
}
|
|
|
|
// check if currrent user handles on behalf of
|
|
$attendeeid = (!empty($registration->uid) ? $registration->uid : $userid);
|
|
if ($attendeeid != $userid) {
|
|
$attendee = JemFactory::getUser($attendeeid);
|
|
$attendeename = empty($this->_UseLoginName) ? $attendee->name : $attendee->username;
|
|
} else {
|
|
$attendee = $user;
|
|
$attendeename = $username;
|
|
}
|
|
|
|
// create link to event
|
|
$link = Route::_($uri->root() . JEMHelperRoute::getEventRoute($event->slug), false);
|
|
|
|
// Strip tags/scripts, etc. from description
|
|
$text_description = OutputFilter::cleanText($event->text);
|
|
$comment = empty($event->comment) ? false : OutputFilter::cleanText($event->comment);
|
|
|
|
$recipients = $this->_getRecipients($send_to, array('user'), $event->id, $event->created_by, $attendeeid);
|
|
|
|
#####################
|
|
## SENDMAIL - USER ##
|
|
#####################
|
|
|
|
if (!empty($recipients['user'])) {
|
|
$data = new stdClass();
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_USER_UNREG_SUBJECT', $this->_SiteName);
|
|
if ($attendeeid != $userid) {
|
|
if ($comment) {
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_USER_UNREG_ONBEHALF_BODY_B', $attendeename, $username, $comment, $event->title, $event->dates, $event->times, $event->venue, $event->city, $registration->places, $text_description, $link, $this->_SiteName);
|
|
} else {
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_USER_UNREG_ONBEHALF_BODY_A', $attendeename, $username, $event->title, $event->dates, $event->times, $event->venue, $event->city, $registration->places, $text_description, $link, $this->_SiteName);
|
|
}
|
|
} else {
|
|
if ($comment) {
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_USER_UNREG_BODY_A', $username, $comment, $event->title, $event->dates, $event->times, $event->venue, $event->city, $registration->places, $text_description, $link, $this->_SiteName);
|
|
} else {
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_USER_UNREG_BODY_9', $username, $event->title, $event->dates, $event->times, $event->venue, $event->city, $registration->places, $text_description, $link, $this->_SiteName);
|
|
}
|
|
}
|
|
$data->receivers = $recipients['user'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
#############################
|
|
## SENDMAIL - ALL THE REST ##
|
|
#############################
|
|
|
|
if (!empty($recipients['all'])) {
|
|
$data = new stdClass();
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_ADMIN_UNREG_SUBJECT', $this->_SiteName);
|
|
if ($attendeeid != $userid) {
|
|
if ($comment) {
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_ADMIN_UNREG_ONBEHALF_BODY_A', $attendeename, $username, $comment, $event->title, $event->dates, $event->times, $event->venue, $event->city, $registration->places, $link, $this->_SiteName);
|
|
} else {
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_ADMIN_UNREG_ONBEHALF_BODY_9', $attendeename, $username, $event->title, $event->dates, $event->times, $event->venue, $event->city, $registration->places, $link, $this->_SiteName);
|
|
}
|
|
} else {
|
|
if ($comment) {
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_ADMIN_UNREG_BODY_9', $username, $comment, $event->title, $event->dates, $event->times, $event->venue, $event->city, $registration->places, $link, $this->_SiteName);
|
|
} else {
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_ADMIN_UNREG_BODY_8', $username, $event->title, $event->dates, $event->times, $event->venue, $event->city, $registration->places, $link, $this->_SiteName);
|
|
}
|
|
}
|
|
$data->recipients = $recipients['all'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* This method handles any mailings triggered by change of publishing state of events or venues.
|
|
*
|
|
* @access public
|
|
* @param string $context The context, i.e. 'com_jem.event'
|
|
* @param array $ids Array of Event or Venue identifiers
|
|
* @param int $value Publishing state ('publish' => 1, 'unpublish' => 0, 'archive' => 2, 'trash' => -2)
|
|
* @return boolean
|
|
*/
|
|
public function onContentChangeState($context, $ids, $value)
|
|
{
|
|
JemHelper::addLogEntry('context: ' . $context . ', ids: (' . implode(',', $ids) . '), value: ' . $value, __METHOD__, Log::DEBUG);
|
|
|
|
$ids = (array) $ids;
|
|
list($component, $item) = explode('.', $context);
|
|
if (($component === 'com_jem') && ($item === 'event')) {
|
|
foreach ($ids as $id) {
|
|
$this->onEventEdited($id, false);
|
|
}
|
|
} elseif (($component === 'com_jem') && ($item === 'venue')) {
|
|
foreach ($ids as $id) {
|
|
$this->onVenueEdited($id, false);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* This method handles any mailings triggered by an event store action
|
|
*
|
|
* @access public
|
|
* @param int $event_id Event identifier
|
|
* @param int $is_new Event new or edited
|
|
* @return boolean
|
|
*
|
|
*/
|
|
public function onEventEdited($event_id, $is_new)
|
|
{
|
|
####################
|
|
## DEFINING ARRAY ##
|
|
####################
|
|
|
|
$send_to = array(
|
|
'user' => $is_new ? $this->params->get('newevent_mail_user', '1') : $this->params->get('editevent_mail_user', '1'),
|
|
'admin' => $is_new ? $this->params->get('newevent_mail_admin', '0') : $this->params->get('editevent_mail_admin', '0'),
|
|
'creator' => !$is_new && $this->params->get('editevent_mail_creator', '0'),
|
|
'registered' => !$is_new && $this->params->get('editevent_mail_registered', '0'),
|
|
'category' => $is_new ? $this->params->get('newevent_mail_category', '0') : $this->params->get('editevent_mail_category', '0'),
|
|
'category_acl' => $is_new ? $this->params->get('newevent_mail_category_acl', '0') : $this->params->get('editevent_mail_category_acl', '0'),
|
|
'group' => $is_new ? $this->params->get('newevent_mail_group', '0') : $this->params->get('editevent_mail_group', '0'),
|
|
);
|
|
|
|
// skip if processing not needed
|
|
if (!array_filter($send_to)) {
|
|
return true;
|
|
}
|
|
|
|
$uri = Uri::getInstance();
|
|
|
|
$user = JemFactory::getUser();
|
|
$userid = $user->get('id');
|
|
$username = empty($this->_UseLoginName) ? $user->name : $user->username;
|
|
|
|
// get data
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
|
|
$case_when = ' CASE WHEN ';
|
|
$case_when .= $query->charLength('a.alias');
|
|
$case_when .= ' THEN ';
|
|
$id = $query->castAsChar('a.id');
|
|
$case_when .= $query->concatenate(array($id, 'a.alias'), ':');
|
|
$case_when .= ' ELSE ';
|
|
$case_when .= $id.' END as slug';
|
|
|
|
$query->select(array('a.id', 'a.title', 'a.dates', 'a.times', 'a.locid', 'a.published', 'a.created', 'a.modified', 'a.created_by'));
|
|
$query->select($query->concatenate(array('a.introtext', 'a.fulltext')).' AS text');
|
|
$query->select(array('v.venue', 'v.city'));
|
|
$query->select($case_when);
|
|
$query->from($db->quoteName('#__jem_events').' AS a');
|
|
$query->join('LEFT', '#__jem_venues AS v ON v.id = a.locid');
|
|
$query->where(array('a.id = '.$db->quote($event_id)));
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($event = $db->loadObject())) {
|
|
return false;
|
|
}
|
|
|
|
// Link for event
|
|
$link = Route::_($uri->root() . JEMHelperRoute::getEventRoute($event->slug), false);
|
|
|
|
// Strip tags/scripts, etc. from description
|
|
$text_description = OutputFilter::cleanText($event->text);
|
|
|
|
// Define published-state message
|
|
switch ($event->published) {
|
|
case 1:
|
|
$adminstate = Text::sprintf('PLG_JEM_MAILER_EVENT_PUBLISHED', $link);
|
|
$userstate = Text::sprintf('PLG_JEM_MAILER_USER_MAIL_EVENT_PUBLISHED', $link);
|
|
break;
|
|
case -2:
|
|
$adminstate = Text::_('PLG_JEM_MAILER_EVENT_TRASHED');
|
|
$userstate = Text::_('PLG_JEM_MAILER_USER_MAIL_EVENT_TRASHED');
|
|
break;
|
|
case 0:
|
|
$adminstate = Text::_('PLG_JEM_MAILER_EVENT_UNPUBLISHED');
|
|
$userstate = Text::_('PLG_JEM_MAILER_USER_MAIL_EVENT_UNPUBLISHED');
|
|
break;
|
|
case 2:
|
|
$adminstate = Text::_('PLG_JEM_MAILER_EVENT_ARCHIVED');
|
|
$userstate = Text::_('PLG_JEM_MAILER_USER_MAIL_EVENT_ARCHIVED');
|
|
break;
|
|
default: /* TODO: fallback unknown / undefined */
|
|
$adminstate = Text::_('PLG_JEM_MAILER_EVENT_UNKNOWN');
|
|
$userstate = Text::_('PLG_JEM_MAILER_USER_MAIL_EVENT_UNKNOWN');
|
|
break;
|
|
}
|
|
|
|
$recipients = $this->_getRecipients($send_to, array('user'), $event->id, ($event->created_by != $userid) ? $event->created_by : 0, $userid);
|
|
|
|
if ($event->modified == 0) { //when state switches modified date is not updated
|
|
$event->modified = 'now'; //set to now to avoid confusing email message
|
|
}
|
|
#####################
|
|
## SENDMAIL - USER ##
|
|
#####################
|
|
|
|
if (!empty($recipients['user'])) {
|
|
$data = new stdClass();
|
|
|
|
if ($is_new) {
|
|
$created = HtmlHelper::Date($event->created, Text::_('DATE_FORMAT_LC2'));
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_NEW_USER_EVENT_MAIL', $this->_SiteName, $event->title);
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_USER_MAIL_NEW_EVENT_9', $username, $created, $event->title, $event->dates, $event->times, $event->venue, $event->city, $text_description, $userstate);
|
|
} else {
|
|
$modified = HtmlHelper::Date($event->modified, Text::_('DATE_FORMAT_LC2'));
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_EDIT_USER_EVENT_MAIL', $this->_SiteName, $event->title);
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_USER_MAIL_EDIT_EVENT_9', $username, $modified, $event->title, $event->dates, $event->times, $event->venue, $event->city, $text_description, $userstate);
|
|
}
|
|
|
|
$data->receivers = $recipients['user'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
#############################
|
|
## SENDMAIL - ALL THE REST ##
|
|
#############################
|
|
|
|
if (!empty($recipients['all'])) {
|
|
$data = new stdClass();
|
|
|
|
if ($is_new) {
|
|
$created = HtmlHelper::Date($event->created, Text::_('DATE_FORMAT_LC2'));
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_NEW_EVENT_MAIL', $this->_SiteName, $event->title);
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_NEW_EVENT_9', $username, $created, $event->title, $event->dates, $event->times, $event->venue, $event->city, $text_description, $adminstate);
|
|
} else {
|
|
$modified = HtmlHelper::Date($event->modified, Text::_('DATE_FORMAT_LC2'));
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_EDIT_EVENT_MAIL', $this->_SiteName, $event->title);
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_EDIT_EVENT_9', $username, $modified, $event->title, $event->dates, $event->times, $event->venue, $event->city, $text_description, $adminstate);
|
|
}
|
|
|
|
$data->recipients = $recipients['all'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* This method handles any mailings triggered by an venue store action
|
|
*
|
|
* @access public
|
|
* @param int $venue_id Integer Venue identifier
|
|
* @param int $is_new Integer Venue new or edited
|
|
* @return boolean
|
|
*
|
|
*/
|
|
public function onVenueEdited($venue_id, $is_new)
|
|
{
|
|
// Sendto
|
|
$send_to = array(
|
|
'user' => $is_new ? $this->params->get('newvenue_mail_user', '1') : $this->params->get('editvenue_mail_user', '0'),
|
|
'admin' => $is_new ? $this->params->get('newvenue_mail_admin', '1') : $this->params->get('editvenue_mail_admin', '0'),
|
|
'creator' => !$is_new && $this->params->get('editvenue_mail_creator', '0'),
|
|
'ev-creator' => !$is_new && $this->params->get('editvenue_mail_ev-creator', '0'),
|
|
'registered' => !$is_new && $this->params->get('editvenue_mail_registered', '0'),
|
|
'category' => !$is_new && $this->params->get('editvenue_mail_category', '0'),
|
|
'group' => !$is_new && $this->params->get('editvenue_mail_group', '0'),
|
|
);
|
|
|
|
// Skip if processing not needed
|
|
if (!array_filter($send_to)) {
|
|
return true;
|
|
}
|
|
|
|
$uri = Uri::getInstance();
|
|
|
|
$user = JemFactory::getUser();
|
|
$userid = $user->get('id');
|
|
$username = empty($this->_UseLoginName) ? $user->name : $user->username;
|
|
|
|
// get data
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
|
|
$case_when = ' CASE WHEN ';
|
|
$case_when .= $query->charLength('alias');
|
|
$case_when .= ' THEN ';
|
|
$id = $query->castAsChar('id');
|
|
$case_when .= $query->concatenate(array($id, 'alias'), ':');
|
|
$case_when .= ' ELSE ';
|
|
$case_when .= $id.' END as slug';
|
|
|
|
$query->select(array('id', 'published', 'venue', 'city', 'street', 'postalCode', 'url', 'country', 'locdescription', 'created', 'created_by', 'modified' ,$case_when));
|
|
$query->from('#__jem_venues');
|
|
$query->where(array('id = '.$db->quote($venue_id)));
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($venue = $db->loadObject())) {
|
|
return false;
|
|
}
|
|
|
|
# at this point we do have a result
|
|
|
|
// Define link for venue
|
|
$link = Route::_($uri->root().JEMHelperRoute::getVenueRoute($venue->slug), false);
|
|
|
|
// Define published-state message
|
|
$adminstate = $venue->published ? Text::sprintf('PLG_JEM_MAILER_VENUE_PUBLISHED', $link) : Text::_('PLG_JEM_MAILER_VENUE_UNPUBLISHED');
|
|
$userstate = $venue->published ? Text::sprintf('PLG_JEM_MAILER_USER_MAIL_VENUE_PUBLISHED', $link) : Text::_('PLG_JEM_MAILER_USER_MAIL_VENUE_UNPUBLISHED');
|
|
|
|
// Strip tags/scripts,etc from description
|
|
$text_description = OutputFilter::cleanText($venue->locdescription);
|
|
|
|
$recipients = $this->_getRecipients($send_to, array('user'), 0, ($venue->created_by != $userid) ? $venue->created_by : 0, $userid, $venue_id);
|
|
if ($venue->modified == 0) { //when state switches modified date is not updated
|
|
$venue->modified = 'now'; //set to now to avoid confusing email message
|
|
}
|
|
#####################
|
|
## SENDMAIL - USER ##
|
|
#####################
|
|
|
|
# here we selected the option to send to a logged in user
|
|
# we make a selection between added/edited venue
|
|
|
|
if (!empty($recipients['user'])) {
|
|
$data = new stdClass();
|
|
|
|
if ($is_new) {
|
|
$created = HtmlHelper::Date($venue->created, Text::_('DATE_FORMAT_LC2'));
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_NEW_USER_VENUE_MAIL', $this->_SiteName, $venue->venue);
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_USER_MAIL_NEW_VENUE_A', $username, $created, $venue->venue, $venue->url, $venue->street, $venue->postalCode, $venue->city, $venue->country, $text_description, $userstate);
|
|
} else {
|
|
$modified = HtmlHelper::Date($venue->modified, Text::_('DATE_FORMAT_LC2'));
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_EDIT_USER_VENUE_MAIL', $this->_SiteName, $venue->venue);
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_USER_MAIL_EDIT_VENUE_A', $username, $modified, $venue->venue, $venue->url, $venue->street, $venue->postalCode, $venue->city, $venue->country, $text_description, $userstate);
|
|
}
|
|
|
|
$data->receivers = $recipients['user'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
#############################
|
|
## SENDMAIL - ALL THE REST ##
|
|
#############################
|
|
|
|
if (!empty($recipients['all'])) {
|
|
$data = new stdClass();
|
|
|
|
# is the venue new or edited?
|
|
if ($is_new) {
|
|
# the venue is new and we send a mail to adminDBList
|
|
$created = HtmlHelper::Date($venue->created, Text::_('DATE_FORMAT_LC2'));
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_NEW_VENUE_MAIL', $this->_SiteName, $venue->venue);
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_NEW_VENUE_A', $username, $created, $venue->venue, $venue->url, $venue->street, $venue->postalCode, $venue->city, $venue->country, $text_description, $adminstate);
|
|
} else {
|
|
# the venue is edited and we send a mail to adminDBList
|
|
$modified = HtmlHelper::Date($venue->modified, Text::_('DATE_FORMAT_LC2'));
|
|
$data->subject = Text::sprintf('PLG_JEM_MAILER_EDIT_VENUE_MAIL', $this->_SiteName, $venue->venue);
|
|
$data->body = Text::sprintf('PLG_JEM_MAILER_EDIT_VENUE_A', $username, $modified, $venue->venue, $venue->url, $venue->street, $venue->postalCode, $venue->city, $venue->country, $text_description, $adminstate);
|
|
}
|
|
|
|
$data->recipients = $recipients['all'];
|
|
$this->_mailer($data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Returns array of all the different email recipients.
|
|
*/
|
|
private function _getRecipients(array $send_to, array $skip, $eventid, $creatorid, $userid, $venueid = 0)
|
|
{
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
|
|
######################
|
|
## RECEIVERS - USER ##
|
|
######################
|
|
|
|
# in here we selected the option to send an email to the logged-in user
|
|
|
|
if (!empty($send_to['user'])) {
|
|
$user = JemFactory::getUser($userid);
|
|
$recipients['user'] = array($user->email);
|
|
} else {
|
|
$recipients['user'] = false;
|
|
}
|
|
|
|
#########################
|
|
## RECEIVERS - CREATOR ##
|
|
#########################
|
|
|
|
# in here we selected the option to send an email to the event's creator if different from editor.
|
|
|
|
if (!empty($send_to['creator'])) {
|
|
// get data
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('u.email'));
|
|
$query->from($db->quoteName('#__users').' AS u');
|
|
$query->where('u.block = 0');
|
|
$query->where(array('u.id = '.$db->quote($creatorid)));
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($recipients['creator'] = $db->loadColumn(0))) {
|
|
$recipients['creator'] = false;
|
|
} else {
|
|
$recipients['creator'] = array_unique($recipients['creator']);
|
|
}
|
|
} else {
|
|
$recipients['creator'] = false;
|
|
}
|
|
|
|
###############################
|
|
## RECEIVERS - EVENT CREATOR ##
|
|
###############################
|
|
|
|
# in here we selected the option to send an email to the creator of all events attached to changed venue.
|
|
|
|
if (!empty($send_to['ev-creator'])) {
|
|
// get data
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('u.email'));
|
|
$query->from($db->quoteName('#__users').' AS u');
|
|
$query->where('u.block = 0');
|
|
if (!empty($venueid)) {
|
|
$query->join('INNER', '#__jem_events AS a ON a.locid = ' . $db->quote($venueid) . ' AND a.created_by = u.id');
|
|
} else {
|
|
$query->where('0');
|
|
}
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($recipients['ev-creator'] = $db->loadColumn(0))) {
|
|
$recipients['ev-creator'] = false;
|
|
} else {
|
|
$recipients['ev-creator'] = array_unique($recipients['ev-creator']);
|
|
}
|
|
} else {
|
|
$recipients['ev-creator'] = false;
|
|
}
|
|
|
|
#######################
|
|
## RECEIVERS - ADMIN ##
|
|
#######################
|
|
|
|
# in here we selected the option to send to admin.
|
|
# we selected admin so we can use the adminDBList.
|
|
|
|
if (!empty($send_to['admin'])) {
|
|
$recipients['admin'] = array_unique($this->_AdminDBList);
|
|
} else {
|
|
$recipients['admin'] = false;
|
|
}
|
|
|
|
############################
|
|
## RECEIVERS - REGISTERED ##
|
|
############################
|
|
|
|
# in here we selected the option to send an email to all people registered to the event.
|
|
# there is no check for the waitinglist
|
|
|
|
if (!empty($send_to['registered'])) {
|
|
# get data
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('u.email'));
|
|
$query->from($db->quoteName('#__users').' AS u');
|
|
$query->where('u.block = 0');
|
|
$query->join('INNER', '#__jem_register AS reg ON reg.uid = u.id');
|
|
if (!empty($eventid)) {
|
|
$query->join('INNER', '#__jem_events AS a ON reg.event = a.id');
|
|
$query->where('reg.event= '.$db->quote($eventid));
|
|
$query->where('a.published = 1');
|
|
} elseif (!empty($venueid)) {
|
|
$query->join('INNER', '#__jem_events AS a ON a.locid = ' . $db->quote($venueid) . ' AND reg.event = a.id');
|
|
$query->join('LEFT', '#__jem_venues AS l ON a.locid = l.id');
|
|
$query->where('a.published = 1');
|
|
$query->where('l.published = 1');
|
|
} else {
|
|
$query->where('0');
|
|
}
|
|
|
|
# since 2.1.6/7 there is a registration status but we will ignore it here
|
|
# because it maybe usefull for "non-attendees" too to get information about changes, maybe they will attend now...
|
|
|
|
# inform attendees only if event had not finished since one or more hours
|
|
$query->where('((a.dates IS NULL) OR (TIMESTAMPDIFF(MINUTE, NOW(), CONCAT(IFNULL(a.enddates, a.dates), " ", IFNULL(a.endtimes, "23:59:59"))) > -60))');
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($recipients['registered'] = $db->loadColumn(0))) {
|
|
return array();
|
|
} else {
|
|
$recipients['registered'] = array_unique($recipients['registered']);
|
|
}
|
|
} else {
|
|
$recipients['registered'] = false;
|
|
}
|
|
|
|
##########################
|
|
## RECEIVERS - CATEGORY ##
|
|
##########################
|
|
|
|
# in here we selected the option to send an email to the email-address
|
|
# that's filled in the category-view.
|
|
|
|
# the data within categoryDBList needs to be validated.
|
|
# if the categoryDBList is empty we shoudln't send an email
|
|
|
|
if (!empty($send_to['category'])) {
|
|
// get data
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('c.email'));
|
|
$query->from($db->quoteName('#__jem_categories').' AS c');
|
|
$query->join('INNER', '#__jem_cats_event_relations AS rel ON rel.catid = c.id');
|
|
if (!empty($eventid)) {
|
|
$query->where('rel.itemid = '.$db->quote($eventid));
|
|
} elseif (!empty($venueid)) {
|
|
$query->join('INNER', '#__jem_events AS a ON a.locid = ' . $db->quote($venueid) . ' AND rel.itemid = a.id');
|
|
} else {
|
|
$query->where('0');
|
|
}
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($category_receivers = $db->loadColumn(0))) {
|
|
return array();
|
|
} else {
|
|
$recipients['category'] = array_unique($this->categoryDBList($category_receivers));
|
|
}
|
|
} else {
|
|
$recipients['category'] = false;
|
|
}
|
|
|
|
##############################
|
|
## RECEIVERS - CATEGORY ACL ##
|
|
##############################
|
|
|
|
# in here we selected the option to send an email to the email-address
|
|
# that's filled in the category-view.
|
|
|
|
# the data within categoryDBList needs to be validated.
|
|
# if the categoryDBList is empty we shoudln't send an email
|
|
|
|
if (!empty($send_to['category_acl'])) {
|
|
// get list groups associated of ACL category from event
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('vl.rules'));
|
|
$query->from($db->quoteName('#__jem_cats_event_relations').' AS cer');
|
|
$query->join('INNER', '#__jem_categories AS cat ON cat.id = cer.catid');
|
|
$query->join('INNER', '#__viewlevels AS vl ON vl.id = cat.access');
|
|
$query->where('cer.itemid = '.$db->quote($eventid));
|
|
$query->where('cat.emailacljl = 1');
|
|
$db->setQuery($query);
|
|
$list_groups_jl = $db->loadResult();
|
|
|
|
//List user emails of groups list
|
|
if($list_groups_jl) {
|
|
$list_groups_jl = substr ($list_groups_jl, 1, -1);
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('u.email'));
|
|
$query->from($db->quoteName('#__user_usergroup_map').' AS um');
|
|
$query->join('INNER', '#__users AS u ON u.id = um.user_id');
|
|
$query->where('um.group_id IN ('.$list_groups_jl.')');
|
|
$query->where('u.block = 0');
|
|
$db->setQuery($query);
|
|
if (is_null($category_acl_receivers = $db->loadColumn(0))) {
|
|
return array();
|
|
} else {
|
|
$recipients['category_acl'] = array_unique($category_acl_receivers);
|
|
}
|
|
}else{
|
|
$recipients['category_acl'] = false;
|
|
}
|
|
} else {
|
|
$recipients['category_acl'] = false;
|
|
}
|
|
|
|
#######################
|
|
## RECEIVERS - GROUP ##
|
|
#######################
|
|
|
|
# in here we selected the option to send an email to the email-address
|
|
# of the users within the maintainer-group of the category where
|
|
# the event is assigned too.
|
|
|
|
if (!empty($send_to['group'])) {
|
|
// get data
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('u.email'));
|
|
$query->from($db->quoteName('#__users').' AS u');
|
|
$query->where('u.block = 0');
|
|
$query->join('INNER', '#__jem_groupmembers AS gm ON gm.member = u.id');
|
|
$query->join('INNER', '#__jem_categories AS c ON c.groupid = gm.group_id');
|
|
$query->join('INNER', '#__jem_cats_event_relations AS rel ON rel.catid = c.id');
|
|
if (!empty($eventid)) {
|
|
$query->where('rel.itemid = '.$db->quote($eventid));
|
|
} elseif (!empty($venueid)) {
|
|
$query->join('INNER', '#__jem_events AS a ON a.locid = ' . $db->quote($venueid) . ' AND rel.itemid = a.id');
|
|
} else {
|
|
$query->where('0');
|
|
}
|
|
|
|
$db->setQuery($query);
|
|
if (is_null($recipients['group'] = $db->loadColumn(0))) {
|
|
return array();
|
|
} else {
|
|
$recipients['group'] = array_unique($recipients['group']);
|
|
}
|
|
} else {
|
|
$recipients['group'] = false;
|
|
}
|
|
|
|
foreach ($recipients as $k => $v) {
|
|
if (empty($v) || array_search($k, $skip) !== false) continue;
|
|
foreach ($v as $email) {
|
|
$recipients['all'][$email][] = $k;
|
|
}
|
|
}
|
|
return $recipients;
|
|
}
|
|
|
|
/**
|
|
* This method executes and send the mail
|
|
* info: https://docs.joomla.org/Sending_email_from_extensions
|
|
*
|
|
* @access private
|
|
* @param object $data mail data object
|
|
* @return boolean
|
|
*/
|
|
private function _mailer($data)
|
|
{
|
|
$app = Factory::getApplication();
|
|
$user = JemFactory::getUser();
|
|
$sent = array('ok' => 0, 'failed' => 0);
|
|
|
|
# $data->receivers contains single or array of email addresses
|
|
if (isset($data->receivers)) {
|
|
$receivers = is_array($data->receivers) ? $data->receivers : array($data->receivers);
|
|
|
|
# remove empty fields and duplicates
|
|
$receivers = array_filter($receivers);
|
|
$receivers = array_unique($receivers);
|
|
|
|
if ($receivers) {
|
|
foreach ($receivers as $receiver)
|
|
{
|
|
$ret = $this->_send($receiver, $data->subject, $data->body);
|
|
++$sent[$ret ? 'ok' : 'failed'];
|
|
}
|
|
|
|
# show a message if something failed and user is at least event editor
|
|
if (!empty($sent['failed']) && $user->can('edit', 'event')) {
|
|
$app->enqueueMessage(Text::sprintf('PLG_JEM_MAILER_MAILS_NOT_SENT_1', $sent['failed']), 'notice');
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
# $data->recipients contains email addresses as array keys with cause(s) as value
|
|
elseif (isset($data->recipients) && is_array($data->recipients)) {
|
|
$txt_because = array(
|
|
'admin' => Text::_('PLG_JEM_MAILER_RECIPIENT_BECAUSE_ADMIN'),
|
|
'creator' => Text::_('PLG_JEM_MAILER_RECIPIENT_BECAUSE_ITEM_CREATOR'),
|
|
'ev-creator' => Text::_('PLG_JEM_MAILER_RECIPIENT_BECAUSE_EVENT_CREATOR'),
|
|
'group' => Text::_('PLG_JEM_MAILER_RECIPIENT_BECAUSE_GROUP_MEMBER'),
|
|
'category' => Text::_('PLG_JEM_MAILER_RECIPIENT_BECAUSE_CATEGORY_LISTED'),
|
|
'registered' => Text::_('PLG_JEM_MAILER_RECIPIENT_BECAUSE_ATTENDEE')
|
|
);
|
|
|
|
# for all recipients...
|
|
# key is the email address
|
|
# value is an array of roles which cause this user to get this email
|
|
foreach ($data->recipients as $receiver => $causes)
|
|
{
|
|
# collect why tis user gets this email
|
|
$why = array();
|
|
foreach ($causes as $cause) {
|
|
if (array_key_exists($cause, $txt_because)) {
|
|
$why[] = $txt_because[$cause];
|
|
}
|
|
}
|
|
|
|
$body = $data->body;
|
|
if (!empty($why)) {
|
|
$body .= Text::sprintf('PLG_JEM_MAILER_RECIPIENT_BECAUSE_1', implode(', ', $why));
|
|
}
|
|
|
|
$ret = $this->_send($receiver, $data->subject, $body);
|
|
++$sent[$ret ? 'ok' : 'failed'];
|
|
}
|
|
|
|
# show a message if something failed and user is at least event editor
|
|
if (!empty($sent['failed']) && $user->can('edit', 'event')) {
|
|
$app->enqueueMessage(Text::sprintf('PLG_JEM_MAILER_MAILS_NOT_SENT_1', $sent['failed']), 'notice');
|
|
}
|
|
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method sends the mail
|
|
* info: https://docs.joomla.org/Sending_email_from_extensions
|
|
*
|
|
* @access private
|
|
* @param string $recipient mail recipient
|
|
* @param string $subject mail subject
|
|
* @param string $body mail body
|
|
* @return boolean true on success, false on error
|
|
*/
|
|
private function _send($recipient, $subject, $body)
|
|
{
|
|
$result = false;
|
|
|
|
try {
|
|
$mail = Factory::getMailer();
|
|
// $mail->set('exceptions', false);
|
|
$mail->setSender(array($this->_MailFrom, $this->_FromName));
|
|
$mail->setSubject($subject);
|
|
|
|
# check if we did select the option to output html mail
|
|
if ($this->params->get('send_html','0')== 1) {
|
|
$mail->isHTML(true);
|
|
$mail->Encoding = 'base64';
|
|
$body_html = nl2br ($body);
|
|
$mail->setBody($body_html);
|
|
} else {
|
|
$mail->setBody($body);
|
|
}
|
|
$mail->addRecipient($recipient);
|
|
$ret = $mail->send();
|
|
// Check for an error
|
|
if ($ret instanceof Exception) {
|
|
JemHelper::addLogEntry(Text::sprintf('PLG_JEM_MAILER_LOG_SEND_ERROR', $recipient) . ' : ' . $ret->getMessage(), __METHOD__ . '#' . __LINE__, Log::WARNING);
|
|
}
|
|
elseif (empty($ret)) {
|
|
JemHelper::addLogEntry(Text::sprintf('PLG_JEM_MAILER_LOG_SEND_ERROR', $recipient), __METHOD__ . '#' . __LINE__, Log::WARNING);
|
|
}
|
|
else {
|
|
$result = true;
|
|
}
|
|
}
|
|
catch (Exception $e) {
|
|
JemHelper::addLogEntry(Text::sprintf('PLG_JEM_MAILER_LOG_SEND_ERROR', $recipient) . ' : ' . $e->getMessage(), __METHOD__ . '#' . __LINE__, Log::WARNING);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* This method assembles the adminDBList
|
|
*/
|
|
private function Adminlist()
|
|
{
|
|
$admin_receiver = $this->params->get('admin_receivers');
|
|
$additional_mails =(!empty($admin_receiver) ? (array_filter(explode(',', ($admin_receiver ? trim($admin_receiver) : $admin_receiver)))) :array()) ;
|
|
// remove whitespaces around each entry, then check if valid email address
|
|
foreach ($additional_mails as $k => $v) {
|
|
$additional_mails[$k] = filter_var(trim($v), FILTER_VALIDATE_EMAIL);
|
|
}
|
|
$additional_mails = array_filter($additional_mails);
|
|
|
|
if ($this->params->get('fetch_admin_mails', '0')) {
|
|
|
|
// get data
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
|
|
$query->select(array('u.id','u.email','u.name'));
|
|
$query->from($db->quoteName('#__users').' AS u');
|
|
$query->where(array('u.sendEmail = 1'));
|
|
|
|
$db->setQuery($query);
|
|
|
|
if ($db->execute() === false) {
|
|
Factory::getApplication()->enqueueMessage($db->stderr(true), 'error');
|
|
return;
|
|
}
|
|
|
|
$admin_mails = $db->loadColumn(1);
|
|
$AdminList = array_merge($admin_mails, $additional_mails);
|
|
$AdminList = array_unique($AdminList);
|
|
} else {
|
|
$AdminList = array_unique($additional_mails);
|
|
}
|
|
|
|
return $AdminList;
|
|
}
|
|
|
|
/**
|
|
* This method checks the categoryDBList
|
|
*/
|
|
private function categoryDBlist($list)
|
|
{
|
|
if ($list) {
|
|
// maybe event has multiple categories - merge them
|
|
if (is_array($list)) {
|
|
$list = implode(',', $list);
|
|
}
|
|
$CategoryDBList = array_filter(explode(',', trim($list)));
|
|
// remove whitespaces around each entry, then check if valid email address
|
|
foreach ($CategoryDBList as $k => $v) {
|
|
$CategoryDBList[$k] = filter_var(trim($v), FILTER_VALIDATE_EMAIL);
|
|
}
|
|
$CategoryDBList = array_unique($CategoryDBList);
|
|
$CategoryDBList = array_filter($CategoryDBList);
|
|
} else {
|
|
$CategoryDBList = array();
|
|
}
|
|
|
|
return $CategoryDBList;
|
|
}
|
|
}
|
|
?>
|