Index: admin_templates/email_events/email_event_edit.tpl =================================================================== --- admin_templates/email_events/email_event_edit.tpl (revision 0) +++ admin_templates/email_events/email_event_edit.tpl (revision 0) @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file Index: admin_templates/email_events/email_event_list.tpl =================================================================== --- admin_templates/email_events/email_event_list.tpl (revision 0) +++ admin_templates/email_events/email_event_list.tpl (revision 0) @@ -0,0 +1,56 @@ + + + + + + + + + + + + +
+ +
+ + + + + \ No newline at end of file Index: units/email_events/email_events_config.php =================================================================== --- units/email_events/email_events_config.php (revision 10) +++ units/email_events/email_events_config.php (working copy) @@ -50,10 +50,29 @@ 'email_prepare' => Array ('prefixes' => Array (), 'format' => '!la_title_PreparingEmailsForSending!. !la_title_PleaseWait!'), 'email_send' => Array ('prefixes' => Array (), 'format' => '!la_title_SendingPreparedEmails!. !la_title_PleaseWait!'), 'email_send_complete' => Array ('prefixes' => Array (), 'format' => '!la_title_SendMailComplete!'), + + 'email_event_edit' => Array( + 'prefixes' => Array('emailevents'), + 'format' => '#emailevents_status# #emailevents_titlefield#' + ), ), - 'PermSection' => Array ('main' => 'in-portal:configure_lang'), + 'PermSection' => Array ('main' => 'in-portal:email_events'), + + 'Sections' => Array( + 'in-portal:email_events' => Array( + 'parent' => 'in-portal:website_setting_folder', + 'icon' => 'in-portal:email_events', + 'label' => 'la_tab_EmailEventConfiguration', + 'url' => Array('t' => 'email_events/email_event_list', 'pass' => 'm'), + 'permissions' => Array('view', 'add', 'edit', 'delete'), + 'priority' => 11.35, + 'type' => stTREE, + 'show_mode' => smDEBUG, + ), + ), + 'FilterMenu' => Array ( 'Groups' => Array ( Array ('mode' => 'AND', 'filters' => Array ('show_enabled', 'show_disabled', 'show_frontonly'), 'type' => WHERE_FILTER), @@ -62,7 +81,7 @@ 'Filters' => Array ( 'show_enabled' => Array ('label' =>'la_Enabled', 'on_sql' => '', 'off_sql' => '%1$s.Enabled != 1' ), 'show_disabled' => Array ('label' => 'la_Disabled', 'on_sql' => '', 'off_sql' => '%1$s.Enabled != 0' ), - 'show_frontonly' => Array ('label' => 'la_Text_FrontOnly', 'on_sql' => '', 'off_sql' => '%1$s.Enabled != 2' ), + 'show_frontonly' => Array ('label' => 'la_Text_FrontOnly', 'on_sql' => '', 'off_sql' => '%1$s.FrontEndOnly != 1' ), ) ), @@ -108,7 +127,13 @@ 'default' => NULL ), - 'Module' => Array ('type' => 'string', 'not_null' => 1, 'required' => 1, 'default' => ''), + 'Module' => Array ( + 'type' => 'string', 'not_null' => '1', 'default' => '', + 'formatter' => 'kOptionsFormatter', + 'options_sql' => 'SELECT %1$s FROM '.TABLE_PREFIX.'Modules UNION SELECT Module AS Name, Module AS Name FROM '.TABLE_PREFIX.'Events', + 'option_key_field' => 'Name', 'option_title_field' => 'Name' + ), + 'Description' => Array ('type' => 'string', 'not_null' => 1, 'required' => 1, 'default' => ''), 'Type' => Array ( 'type' => 'int', @@ -119,6 +144,11 @@ 'VirtualFields' => Array ( 'FromUser' => Array ('type' => 'string', 'default' => ''), + 'Headers' => Array('type' => 'string', 'default' => ''), + 'MessageType' => Array('type' => 'string', 'default' => 'html', 'formatter' => 'kOptionsFormatter', 'options' => Array('html' => 'html', 'text' => 'text')), + 'ReplacementTagsXML' => Array('type' => 'string', 'default' => ''), + 'Tag' => Array('type' => 'string', 'default' => ''), + 'Replacement' => Array('type' => 'string', 'default' => ''), ), 'Grids' => Array ( @@ -153,5 +183,23 @@ 'Enabled' => Array ('title' => 'la_col_Enabled', 'filter_block' => 'grid_options_filter', 'width' => 80, ), ), ), + + 'EmailEventsConfiguration' => Array ( + 'Icons' => Array( + 'default' => 'icon16_item.png', + 0 => 'icon16_disabled.png', + 1 => 'icon16_item.png', + ), + 'Fields' => Array( + 'EventId' => Array( 'title'=>'la_col_Id', 'filter_block' => 'grid_range_filter'), + 'Event' => Array( 'title'=>'la_col_Event'), + 'Description' => Array( 'title'=>'la_col_Description', 'data_block' => 'label_grid_checkbox_td'), + 'ReplacementTags' => Array( 'title'=>'la_col_ReplacementTags'), + 'Module' => Array( 'title'=>'la_col_Module', 'filter_block' => 'grid_options_filter'), + 'Type' => Array( 'title'=>'la_col_Type', 'filter_block' => 'grid_options_filter'), + 'Enabled' => Array( 'title'=>'la_col_Status', 'filter_block' => 'grid_options_filter'), + 'FrontEndOnly' => Array ('title' => 'la_col_FrontEndOnly', 'filter_block' => 'grid_options_filter'), + ), + ), ), ); \ No newline at end of file Index: units/email_events/email_events_event_handler.php =================================================================== --- units/email_events/email_events_event_handler.php (revision 10) +++ units/email_events/email_events_event_handler.php (working copy) @@ -312,12 +312,17 @@ // 1. parse template $this->Application->InitParser(); $parser_params = $this->Application->Parser->Params; // backup parser params - + $parser_pattern = $this->Application->Parser->Pattern; + $parser_values = $this->Application->Parser->Values; + $this->Application->Parser->Pattern = Array(); // fixes bug in TemplateParser::SortParams + $this->Application->Parser->Values = Array(); // fixes bug in TemplateParser::SortParams $this->Application->Parser->SetParams( array_merge_recursive2($parser_params, $direct_params) ); $message = implode('&|&', explode("\n\n", $message, 2)); // preserves double \n in case when tag is located in subject field $message = $this->Application->Parser->Parse($message, 'email_template', 0); + $this->Application->Parser->Pattern = $parser_pattern; + $this->Application->Parser->Values = $parser_values; $this->Application->Parser->SetParams($parser_params); // restore parser params // 2. replace line endings, that are send with data submitted via request @@ -519,4 +524,189 @@ echo ($emails_sent / $total_emails) * 100; } } - } \ No newline at end of file + + /** + * Enter description here... + * + * @param kEvent $event + */ + function OnAfterConfigRead(&$event) + { + $virtual_fields = $this->Application->getUnitOption($event->Prefix, 'VirtualFields'); + + $sql = 'SELECT LanguageId FROM '.TABLE_PREFIX.'Language'; + $lang_ids = $this->Conn->GetCol($sql); + + foreach ($lang_ids as $l) { + $virtual_fields['l'.$l.'_Subject'] = Array('type' => 'string', 'default' => ''); + $virtual_fields['l'.$l.'_Body'] = Array('type' => 'string', 'default' => ''); + } + + $this->Application->setUnitOption($event->Prefix, 'VirtualFields', $virtual_fields); + } + + /** + * Enter description here... + * + * @param kEvent $event + */ + function OnAfterItemLoad(&$event) + { + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $sql = 'SELECT EmailMessageId + FROM '.TABLE_PREFIX.'EmailMessage + WHERE EventId = '.$object->GetID(); + $message_ids = $this->Conn->GetCol($sql); + + if (is_array($message_ids) && count($message_ids)) { + $message_obj =& $this->Application->recallObject('emailmessages.-dummy', 'emailmessages', Array('skip_autoload' => true)); + /* @var $message_obj kDBItem */ + + foreach ($message_ids as $msg_id) { + $message_obj->Clear(); + $message_obj->Load($msg_id); + $l = $message_obj->GetDBField('LanguageId'); + if (!isset($object->Fields['l'.$l.'_Subject'])) continue; + + $object->SetDBField('MessageType', $message_obj->GetDBField('MessageType')); + $object->SetDBField('Headers', $message_obj->GetDBField('Headers')); + $object->SetDBField('l'.$l.'_Subject', $message_obj->GetDBField('Subject')); + $object->SetDBField('l'.$l.'_Body', $message_obj->GetDBField('Body')); + } + } + + $replacement_tags = $object->GetDBField('ReplacementTags'); + $replacement_tags = $replacement_tags ? unserialize($replacement_tags) : Array(); + + $replacement_tags_xml = ''; + foreach ($replacement_tags as $tag => $replacement) { + $replacement_tags_xml .= ''; + $replacement_tags_xml .= ''.htmlspecialchars($tag).''; + $replacement_tags_xml .= ''.htmlspecialchars($replacement).''; + $replacement_tags_xml .= ''; + } + $replacement_tags_xml .= ''; + $object->SetDBField('ReplacementTagsXML', $replacement_tags_xml); + } + + function OnAfterItemCreate(&$event) + { + $this->processEmailMessages($event); + } + + function OnAfterItemUpdate(&$event) + { + $this->processEmailMessages($event); + } + + /** + * Enter description here... + * + * @param kEvent $event + */ + function processEmailMessages(&$event) + { + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $sql = 'SELECT LanguageId FROM '.TABLE_PREFIX.'Language'; + $lang_ids = $this->Conn->GetCol($sql); + + $message_obj =& $this->Application->recallObject('emailmessages.-dummy', 'emailmessages', Array('skip_autoload' => true)); + /* @var $message_obj kDBItem */ + + foreach ($lang_ids as $l) { + if (!isset($object->Fields['l'.$l.'_Subject'])) continue; + + $message_obj->Clear(); + $message_obj->Load( Array('LanguageId' => $l, 'EventId' => $object->GetID()) ); + + $message_obj->SetDBField('LanguageId', $l); + $message_obj->SetDBField('EventId', $object->GetID()); + $message_obj->SetDBField('MessageType', $object->GetDBField('MessageType')); + $message_obj->SetDBField('Headers', $object->GetDBField('Headers')); + $message_obj->SetDBField('Subject', $object->GetDBField('l'.$l.'_Subject')); + $message_obj->SetDBField('Body', $object->GetDBField('l'.$l.'_Body')); + + $message_obj->IgnoreValidation = true; + $message_obj->isLoaded() ? $message_obj->Update() : $message_obj->Create(); + } + } + + function OnBeforeItemUpdate(&$event) + { + $this->processReplacementTags($event); + } + + function OnBeforeItemCreate(&$event) + { + $this->processReplacementTags($event); + } + + function processReplacementTags(&$event) + { + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $replacement_tags_xml = $object->GetDBField('ReplacementTagsXML'); + + $replacement_tags = Array(); + if ($replacement_tags_xml) { + $xml_helper =& $this->Application->recallObject('kXMLHelper'); + /* @var $xml_helper kXMLHelper */ + + $root_node =& $xml_helper->Parse($replacement_tags_xml, XML_NO_TEXT_NODES, true); + /* @var $root_node kXMLNode */ + if ($root_node && preg_match('/^kxmlnode/i', get_class($root_node)) && $root_node->Name == 'RECORDS') { + $record_node =& $root_node->firstChild; + while ($record_node && preg_match('/^kxmlnode/i', get_class($record_node))) { + $current_tag = false; + $current_replacement = false; + + $field_node =& $record_node->firstChild; + while ($field_node && preg_match('/^kxmlnode/i', get_class($field_node))) { + if ($field_node->Name == 'FIELD' && $field_node->GetAttribute('name') == 'Tag') { + $current_tag = $field_node->Data; + } + if ($field_node->Name == 'FIELD' && $field_node->GetAttribute('name') == 'Replacement') { + $current_replacement = $field_node->Data; + } + + $field_node =& $field_node->NextSibling(); + } + + if ($current_tag && $current_replacement) { + $replacement_tags[$current_tag] = $current_replacement; + } + + $record_node =& $record_node->NextSibling(); + } + } + } + + $object->SetDBField('ReplacementTags', serialize($replacement_tags)); + } + + function OnAfterCopyToLive(&$event) + { + if ( !($id = $event->getEventParam('id')) ) return; + + $sql = 'SELECT EmailMessageId FROM '.TABLE_PREFIX.'EmailMessage WHERE EventId = 0'; + $msg_ids = $this->Conn->GetCol($sql); + if (!$msg_ids) return; + + $message_obj =& $this->Application->recallObject('emailmessages.-dummy', 'emailmessages', Array('skip_autoload' => true)); + /* @var $message_obj kDBItem */ + + foreach ($msg_ids as $msg_id) { + $message_obj->Clear(); + $message_obj->Load($msg_id); + $message_obj->SetDBField('EventId', $id); + $message_obj->IgnoreValidation = true; + $message_obj->Update(); + } + } + } +?> \ No newline at end of file