Index: branches/5.1.x/core/units/email_events/email_events_event_handler.php =================================================================== diff -u -N -r13086 -r13140 --- branches/5.1.x/core/units/email_events/email_events_event_handler.php (.../email_events_event_handler.php) (revision 13086) +++ branches/5.1.x/core/units/email_events/email_events_event_handler.php (.../email_events_event_handler.php) (revision 13140) @@ -1,6 +1,6 @@ getObject(); + /* @var $object kDBList */ + if ($event->Special == 'module') { - $object =& $event->getObject(); $module = $this->Application->GetVar('module'); $object->addFilter('module_filter', '%1$s.Module = '.$this->Conn->qstr($module)); } + + if (!$event->Special && !$this->Application->isDebugMode()) { + // no special + $object->addFilter('enabled_filter', '%1$s.Enabled <> ' . STATUS_DISABLED); + } } /** + * Sets event id + * + * @param kEvent $event + */ + function OnPreCreate(&$event) + { + parent::OnPreCreate($event); + + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $object->SetDBField('Headers', $this->Application->ConfigValue('Smtp_DefaultHeaders')); + } + + /** * Sets status Front-End Only to selected email events * * @param kEvent $event @@ -147,55 +168,65 @@ } /** - * Returns sender & recipients ids plus event_id (as parameter by reference) + * Returns email event object based on given kEvent object * * @param kEvent $event - * @param int $event_id id of email event used - * - * @return mixed + * @return kDBItem */ - function GetMessageRecipients(&$event, &$event_id) + function &_getEmailEvent(&$event) { - $email_event =& $event->getObject( Array('skip_autoload' => true) ); - /* @var $email_event kDBItem */ + $false = false; + $name = $event->getEventParam('EmailEventName'); + $type = $event->getEventParam('EmailEventType'); - // get event parameters by name & type - $load_keys = Array ( - 'Event' => $event->getEventParam('EmailEventName'), - 'Type' => $event->getEventParam('EmailEventType'), - ); - $email_event->Load($load_keys); + $object =& $event->getObject( Array('skip_autoload' => true) ); + /* @var $object kDBItem */ - if (!$email_event->isLoaded()) { - // event record not found - return false; - } + if (!$object->isLoaded() || (($object->GetDBField('Event') != $name) && ($object->GetDBField('Type') != $type))) { + // get event parameters by name & type + $load_keys = Array ('Event' => $name, 'Type' => $type); + $object->Load($load_keys); - if ($email_event->GetDBField('Enabled') == STATUS_DISABLED) { - return false; - } + if (!$object->isLoaded() || ($object->GetDBField('Enabled') == STATUS_DISABLED)) { + // event record not found OR is disabled + return $false; + } - if ($email_event->GetDBField('FrontEndOnly') && $this->Application->isAdmin) { - return false; + if ($object->GetDBField('FrontEndOnly') && $this->Application->isAdmin) { + return $false; + } } + return $object; + } + + /** + * Returns sender & recipients ids plus event_id (as parameter by reference) + * + * @param kEvent $event + * + * @return mixed + */ + function GetMessageRecipients(&$event) + { + $object =& $this->_getEmailEvent($event); + /* @var $object kDBItem */ + // initial values $to_user_id = $event->getEventParam('EmailEventToUserId'); if ( !is_numeric($to_user_id) ) { $to_user_id = -1; // when not specified, then send to "root" } - $from_user_id = $email_event->GetDBField('FromUserId'); + $from_user_id = $object->GetDBField('FromUserId'); - if ($email_event->GetDBField('Type') == EVENT_TYPE_ADMIN) { + if ($object->GetDBField('Type') == EVENT_TYPE_ADMIN) { // For type "Admin" recipient is a user from field FromUserId which means From/To user in Email events list if ($to_user_id == -1) { $to_user_id = $from_user_id; } $from_user_id = -1; } - $event_id = $email_event->GetDBField('EventId'); - return Array ($from_user_id, $to_user_id); } @@ -245,56 +276,28 @@ /** * Returns email event message by ID (headers & body in one piece) * - * @param int $event_id - * @param string $message_type contains message type = {text,html} + * @param kEvent $event * @param int $language_id */ - function GetMessageBody($event_id, &$message_type, $language_id = null) + function GetMessageBody(&$event, $language_id = null) { if (!isset($language_id)) { $language_id = $this->Application->GetVar('m_lang'); } - $message =& $this->Application->recallObject('emailmessages', null, Array('skip_autoload' => true)); - /* @var $message kDBItem */ + $object =& $this->_getEmailEvent($event); - $message->Load( Array('EventId' => $event_id, 'LanguageId' => $language_id) ); - if (!$message->isLoaded()) { - // event translation on required language not found - return false; - } - - $message_type = $message->GetDBField('MessageType'); - // 1. get message body - $message_body = $message->GetDBField('Template'); + $message_body = $this->_formMessageBody($object, $language_id, $object->GetDBField('MessageType')); - // 2. add footer - $sql = 'SELECT em.Template - FROM '.$message->TableName.' em - LEFT JOIN '.TABLE_PREFIX.'Events e ON e.EventId = em.EventId - WHERE em.LanguageId = '.$language_id.' AND e.Event = "COMMON.FOOTER"'; - - list (, $footer) = explode("\n\n", $this->Conn->GetOne($sql)); - if ($message_type == 'text') { - $esender =& $this->Application->recallObject('EmailSender'); - /* @var $esender kEmailSendingHelper */ - - $footer = $esender->ConvertToText($footer); - } - - if ($footer) { - $message_body .= "\r\n".$footer; - } - - // 3. replace tags if needed + // 2. replace tags if needed $default_replacement_tags = Array ( ' ' ' 'GetDBField('ReplacementTags'); + $replacement_tags = $object->GetDBField('ReplacementTags'); $replacement_tags = $replacement_tags ? unserialize($replacement_tags) : Array (); $replacement_tags = array_merge_recursive2($default_replacement_tags, $replacement_tags); @@ -306,6 +309,90 @@ } /** + * Prepare email message body + * + * @param kDBItem $object + * @param int $language_id + * @return string + */ + function _formMessageBody(&$object, $language_id) + { + $default_language_id = $this->Application->GetDefaultLanguageId(); + + $fields_hash = Array ( + 'Headers' => $object->GetDBField('Headers'), + ); + + // prepare subject + $subject = $object->GetDBField('l' . $language_id . '_Subject'); + + if (!$subject) { + $subject = $object->GetDBField('l' . $default_language_id . '_Subject'); + } + + $fields_hash['Subject'] = $subject; + + // prepare body + $body = $object->GetDBField('l' . $language_id . '_Body'); + + if (!$body) { + $body = $object->GetDBField('l' . $default_language_id . '_Body'); + } + + $fields_hash['Body'] = $body; + + $email_message_helper =& $this->Application->recallObject('EmailMessageHelper'); + /* @var $email_message_helper EmailMessageHelper */ + + $ret = $email_message_helper->buildTemplate($fields_hash); + + // add footer + $footer = $this->_getFooter($language_id, $object->GetDBField('MessageType')); + + if ($ret && $footer) { + $ret .= "\r\n" . $footer; + } + + return $ret; + } + + /** + * Returns email footer + * + * @param int $language_id + * @param string $message_type + * @return string + */ + function _getFooter($language_id, $message_type) + { + static $footer = null; + + if (!isset($footer)) { + $default_language_id = $this->Application->GetDefaultLanguageId(); + + $sql = 'SELECT l' . $language_id . '_Body, l' . $default_language_id . '_Body + FROM ' . $this->Application->getUnitOption('emailevents', 'TableName') . ' em + WHERE Event = "COMMON.FOOTER"'; + $footer_data = $this->Conn->GetRow($sql); + + $footer = $footer_data['l' . $language_id . '_Body']; + + if (!$footer) { + $footer = $footer_data['l' . $default_language_id . '_Body']; + } + + if ($message_type == 'text') { + $esender =& $this->Application->recallObject('EmailSender'); + /* @var $esender kEmailSendingHelper */ + + $footer = $esender->ConvertToText($footer); + } + } + + return $footer; + } + + /** * Parse message template and return headers (as array) and message body part * * @param string $message @@ -365,23 +452,26 @@ trigger_error('Invalid email event name '.$email_event_name.'. Use only UPPERCASE characters and dots as email event names', E_USER_ERROR); } + $object =& $this->_getEmailEvent($event); + + if (!is_object($object)) { + // email event not found OR it's won't be send under given circumstances + return false; + } + // additional parameters from kApplication->EmailEvent $send_params = $event->getEventParam('DirectSendParams'); // 1. get information about message sender and recipient - $recipients = $this->GetMessageRecipients($event, $event_id); - if ($recipients === false) { - // if not valid recipients found, then don't send event - return false; - } + $recipients = $this->GetMessageRecipients($event); list ($from_id, $to_id) = $recipients; list ($from_email, $from_name) = $this->GetRecipientInfo($from_id, 'from', $send_params); list ($to_email, $to_name) = $this->GetRecipientInfo($to_id, 'to', $send_params); // 2. prepare message to be sent $message_language = $this->_getSendLanguage($send_params); - $message_template = $this->GetMessageBody($event_id, $message_type, $message_language); + $message_template = $this->GetMessageBody($event, $message_language); if (!trim($message_template)) { trigger_error('Message template is empty', E_USER_WARNING); return false; @@ -405,18 +495,18 @@ if ($this->Application->isDebugMode()) { // set special header with event name, so it will be easier to determite what's actually was received - $message_headers['X-Event-Name'] = $email_event_name . ' - ' . ($event->getEventParam('EmailEventType') == 1 ? 'ADMIN' : 'USER'); + $message_headers['X-Event-Name'] = $email_event_name . ' - ' . ($event->getEventParam('EmailEventType') == EVENT_TYPE_ADMIN ? 'ADMIN' : 'USER'); } foreach ($message_headers as $header_name => $header_value) { $esender->SetEncodedHeader($header_name, $header_value); } - $esender->CreateTextHtmlPart($message_body, $message_type == 'html'); + $esender->CreateTextHtmlPart($message_body, $object->GetDBField('MessageType') == 'html'); $event->status = $esender->Deliver() ? erSUCCESS : erFAIL; - if ($event->status == erSUCCESS){ + if ($event->status == erSUCCESS) { // all keys, that are not used in email sending are written to log record $send_keys = Array ('from_email', 'from_name', 'to_email', 'to_name', 'message'); foreach ($send_keys as $send_key) { @@ -534,4 +624,39 @@ echo ($emails_sent / $total_emails) * 100; } } + + /** + * Prefills module dropdown + * + * @param kEvent $event + */ + function OnAfterConfigRead(&$event) + { + parent::OnAfterConfigRead($event); + + $options = Array ('Core:Users' => 'Core - Users', 'Core:Category' => 'Core - Categories'); + + foreach ($this->Application->ModuleInfo as $module_name => $module_info) { + if (($module_name == 'In-Portal') || ($module_name == 'Core')) { + continue; + } + + $options[$module_name] = $module_name; + } + + $fields = $this->Application->getUnitOption($event->Prefix, 'Fields'); + $fields['Module']['options'] = $options; + $this->Application->setUnitOption($event->Prefix, 'Fields', $fields); + + // make grid on "Email Events" tab in "Regional" section show columns of editable language, not admin language + $language_id = $this->Application->GetVar('lang_id'); + + if ($language_id) { + $grids = $this->Application->getUnitOption($event->Prefix, 'Grids'); + // used by column picker to track column position + $grids['Default']['Fields']['Description']['formatter_renamed'] = true; + array_rename_key($grids['Default']['Fields'], 'Description', 'l' . $language_id . '_Description'); + $this->Application->setUnitOption($event->Prefix, 'Grids', $grids); + } + } } \ No newline at end of file