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