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 @@
+<inp2:adm_SetPopupSize width="1000" height="750"/>
+<inp2:m_include t="incs/header" body_properties="" />
+
+<inp2:m_RenderElement name="combined_header" section="in-portal:email_events" prefix="emailevents" title_preset="email_event_edit"/>
+
+<!-- ToolBar --->
+<table class="toolbar" height="30" cellspacing="0" cellpadding="0" width="100%" border="0">
+<tbody>
+ <tr>
+ <td>
+ <script type="text/javascript">
+ a_toolbar = new ToolBar();
+ a_toolbar.AddButton( new ToolBarButton('select', '<inp2:m_phrase label="la_ToolTip_Save" escape="1"/>', function() {
+ submit_event('emailevents','<inp2:emailevents_SaveEvent/>');
+ }
+ ));
+ a_toolbar.AddButton( new ToolBarButton('cancel', '<inp2:m_phrase label="la_ToolTip_Cancel" escape="1"/>', function() {
+ cancel_edit('emailevents','OnCancelEdit','<inp2:emailevents_SaveEvent/>','<inp2:m_Phrase label="la_FormCancelConfirmation" escape="1"/>');
+ }
+ ));
+
+ a_toolbar.AddButton( new ToolBarButton('reset_edit', '<inp2:m_phrase label="la_ToolTip_Reset" escape="1"/>', function() {
+ reset_form('emailevents', 'OnReset', '<inp2:m_Phrase label="la_FormResetConfirmation" escape="1"/>');
+ }
+ ));
+
+ a_toolbar.AddButton( new ToolBarSeparator('sep1') );
+
+ a_toolbar.AddButton( new ToolBarButton('prev', '<inp2:m_phrase label="la_ToolTip_Prev" escape="1"/>', function() {
+ go_to_id('emailevents', '<inp2:emailevents_PrevId/>');
+ }
+ ));
+ a_toolbar.AddButton( new ToolBarButton('next', '<inp2:m_phrase label="la_ToolTip_Next" escape="1"/>', function() {
+ go_to_id('emailevents', '<inp2:emailevents_NextId/>');
+ }
+ ));
+
+ a_toolbar.Render();
+
+ <inp2:m_if check="emailevents_IsSingle">
+ a_toolbar.HideButton('prev');
+ a_toolbar.HideButton('next');
+ a_toolbar.HideButton('sep1');
+ <inp2:m_else/>
+ <inp2:m_if check="emailevents_IsLast">
+ a_toolbar.DisableButton('next');
+ </inp2:m_if>
+ <inp2:m_if check="emailevents_IsFirst">
+ a_toolbar.DisableButton('prev');
+ </inp2:m_if>
+ </inp2:m_if>
+ </script>
+
+
+ <!--<script src="js/swfobject.js" type="text/javascript"></script>
+ <script type="text/javascript" src="js/uploader.js"></script>-->
+ </td>
+
+ <!--<inp2:m_RenderElement name="ml_selector" prefix="emailevents"/>-->
+ </tr>
+</tbody>
+</table>
+
+<inp2:emailevents_SaveWarning name="grid_save_warning"/>
+<inp2:emailevents_ErrorWarning name="form_error_warning"/>
+<div id="scroll_container">
+ <table class="edit-form">
+ <inp2:m_RenderElement name="subsection" title="la_section_General"/>
+ <inp2:m_RenderElement name="inp_id_label" prefix="emailevents" field="EventId" title="la_fld_Id"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="emailevents" field="Event" title="la_fld_Event"/>
+ <inp2:m_RenderElement name="inp_edit_radio" prefix="emailevents" field="Enabled" title="la_fld_Status" />
+ <inp2:m_RenderElement name="inp_edit_checkbox" prefix="emailevents" field="FrontEndOnly" title="la_fld_FrontEndOnly" />
+ <inp2:m_RenderElement name="inp_edit_options" prefix="emailevents" field="Module" title="la_fld_Module" />
+ <inp2:m_RenderElement name="inp_edit_box" prefix="emailevents" field="Description" title="la_fld_DescriptionPhrase"/>
+ <inp2:m_RenderElement name="inp_edit_radio" prefix="emailevents" field="Type" title="la_fld_Type"/>
+ <inp2:m_RenderElement name="inp_edit_textarea" prefix="emailevents" field="Headers" title="la_fld_Headers" control_options="{height: 100}"/>
+ <inp2:m_RenderElement name="inp_edit_radio" prefix="emailevents" field="MessageType" title="la_fld_MessageType"/>
+
+ <inp2:m_RenderElement name="subsection" title="la_section_ReplacementTags"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="emailevents" field="Tag" title="la_fld_Tag"/>
+ <inp2:m_RenderElement name="inp_edit_textarea" prefix="emailevents" field="Replacement" title="la_fld_Replacement"control_options="{height: 60}"/>
+ <inp2:m_RenderElement name="inp_edit_minput" prefix="emailevents" field="ReplacementTagsXML" title="la_fld_ReplacementTags" format="#Tag# = #Replacement#" style="width: 600px; height: 100px;" />
+
+ <inp2:m_RenderElement name="subsection" title="la_section_EmailContent"/>
+ <inp2:m_DefineElement name="lang_element">
+ <inp2:Field name="LanguageId" result_to_var="l" />
+ <inp2:Field name="PackName" result_to_var="lang" />
+ <inp2:m_RenderElement name="inp_edit_box" prefix="emailevents" field="l{$l}_Subject" title="la_fld_Subject{$lang}"/>
+ <inp2:m_RenderElement name="inp_edit_textarea" prefix="emailevents" field="l{$l}_Body" title="la_fld_Body{$lang}" control_options="{height: 300}"/>
+ </inp2:m_DefineElement>
+ <inp2:lang_PrintList render_as="lang_element" />
+
+ <inp2:m_RenderElement name="inp_edit_filler"/>
+ </table>
+</div>
+
+<script type="text/javascript">
+ ReplacementTagsXML.registerControl('Tag', 'textbox', true);
+ ReplacementTagsXML.registerControl('Replacement', 'textbox', true);
+ ReplacementTagsXML.LoadValues();
+</script>
+
+<inp2:m_include t="incs/footer"/>
\ 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 @@
+<inp2:m_Store name="module" value="" />
+<inp2:m_include t="incs/header"/>
+<inp2:m_RenderElement name="combined_header" section="in-portal:email_events" prefix="emailevents" grid="EmailEventsConfiguration"/>
+
+<!-- ToolBar --->
+<table class="toolbar" height="30" cellspacing="0" cellpadding="0" width="100%" border="0">
+<tbody>
+ <tr>
+ <td>
+ <script type="text/javascript">
+ //do not rename - this function is used in default grid for double click!
+ a_toolbar = new ToolBar();
+
+ a_toolbar.AddButton( new ToolBarButton('new_item', '<inp2:m_phrase label="la_ToolTip_NewEmailEvent" escape="1"/>::<inp2:m_phrase label="la_Add" escape="1"/>',
+ function() {
+ std_precreate_item('emailevents', 'email_events/email_event_edit')
+ }
+ )
+ );
+
+ function edit()
+ {
+ std_edit_item('emailevents', 'email_events/email_event_edit');
+ }
+
+ a_toolbar.AddButton( new ToolBarButton('edit', '<inp2:m_phrase label="la_ToolTip_Edit" escape="1"/>::<inp2:m_phrase label="la_ShortToolTip_Edit" escape="1"/>', edit) );
+
+
+ // a_toolbar.AddButton( new ToolBarButton('delete', '<inp2:m_phrase label="la_ToolTip_Delete" escape="1"/>',
+ // function() {
+ // std_delete_items('emailevents');
+ // } ) );
+
+
+ a_toolbar.AddButton( new ToolBarSeparator('sep1') );
+
+
+ a_toolbar.AddButton( new ToolBarButton('view', '<inp2:m_phrase label="la_ToolTip_View" escape="1"/>', function(id) {
+ show_viewmenu(a_toolbar,'view');
+ }
+ ) );
+
+ a_toolbar.Render();
+ </script>
+ </td>
+ <inp2:m_RenderElement name="search_main_toolbar" prefix="emailevents" grid="EmailEventsConfiguration"/>
+ </tr>
+</tbody>
+</table>
+
+<inp2:m_RenderElement name="grid" PrefixSpecial="emailevents" IdField="EventId" grid="EmailEventsConfiguration" menu_filters="yes"/>
+<script type="text/javascript">
+ Grids['emailevents'].SetDependantToolbarButtons( new Array('edit','delete') );
+</script>
+
+<inp2:m_include t="incs/footer"/>
\ 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 = '<records>';
+ foreach ($replacement_tags as $tag => $replacement) {
+ $replacement_tags_xml .= '<record>';
+ $replacement_tags_xml .= '<field name="Tag">'.htmlspecialchars($tag).'</field>';
+ $replacement_tags_xml .= '<field name="Replacement">'.htmlspecialchars($replacement).'</field>';
+ $replacement_tags_xml .= '</record>';
+ }
+ $replacement_tags_xml .= '</records>';
+ $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