Attached Files |
email_event_design_templates.patch [^] (32,630 bytes) 2012-03-20 04:44
[Show Content]
Index: admin_templates/regional/languages_edit.tpl
===================================================================
--- admin_templates/regional/languages_edit.tpl (revision 15165)
+++ admin_templates/regional/languages_edit.tpl (working copy)
@@ -107,6 +107,10 @@
<inp2:m_RenderElement name="inp_edit_checkboxes" prefix="lang" field="SynchronizationModes"/>
+ <inp2:m_RenderElement name="subsection" title="la_section_EmailDesignTemplates"/>
+ <inp2:m_RenderElement name="inp_edit_textarea" prefix="lang" field="HtmlEmailTemplate" title="la_fld_HtmlEmailTemplate" control_options="{min_height: 200}" style="width: 100%; height: 200px;"/>
+ <inp2:m_RenderElement name="inp_edit_textarea" prefix="lang" field="TextEmailTemplate" title="la_fld_TextEmailTemplate" allow_html="0" control_options="{min_height: 200}" style="width: 100%; height: 200px;"/>
+
<inp2:m_RenderElement name="inp_edit_filler"/>
</table>
</div>
Index: install/english.lang
===================================================================
--- install/english.lang (revision 15222)
+++ install/english.lang (working copy)
@@ -1,5 +1,8 @@
-<LANGUAGES Version="5">
+<LANGUAGES Version="6">
<LANGUAGE Encoding="base64" PackName="English" LocalName="English" DateFormat="m/d/Y" TimeFormat="g:i A" InputDateFormat="m/d/Y" InputTimeFormat="g:i:s A" DecimalPoint="." ThousandSep="," Charset="utf-8" UnitSystem="2" Locale="en-US" UserDocsUrl="http://docs.in-portal.org/eng/index.php">
+ <EMAILDESIGNS>
+ <HTML>JGJvZHkNCjxici8+PGJyLz4NCg0KU2luY2VyZWx5LDxici8+PGJyLz4NCg0KV2Vic2l0ZSBhZG1pbmlzdHJhdGlvbi4=</HTML>
+ </EMAILDESIGNS>
<PHRASES>
<PHRASE Label="la_Active" Module="Core" Type="1">QWN0aXZl</PHRASE>
<PHRASE Label="la_Add" Module="Core" Type="1">QWRk</PHRASE>
@@ -253,6 +256,7 @@
<PHRASE Label="la_error_ConnectionFailed" Module="Core" Type="1">Q29ubmVjdGlvbiBGYWlsZWQ=</PHRASE>
<PHRASE Label="la_error_copy_subcategory" Module="Core" Type="1">RXJyb3IgY29weWluZyBzdWJzZWN0aW9ucw==</PHRASE>
<PHRASE Label="la_error_CustomExists" Module="Core" Type="1">Q3VzdG9tIGZpZWxkIHdpdGggaWRlbnRpY2FsIG5hbWUgYWxyZWFkeSBleGlzdHM=</PHRASE>
+ <PHRASE Label="la_error_EmailTemplateBodyMissing" Module="Core" Type="1">RW1haWwgRGVzaWduIFRlbXBsYXRlIHNob3VsZCBjb250YWluIGF0IGxlYXN0ICIkYm9keSIgdGFnIGluIGl0Lg==</PHRASE>
<PHRASE Label="la_error_FileTooLarge" Module="Core" Type="1">RmlsZSBpcyB0b28gbGFyZ2U=</PHRASE>
<PHRASE Label="la_error_GroupNotFound" Module="Core" Type="1">Z3JvdXAgbm90IGZvdW5k</PHRASE>
<PHRASE Label="la_error_InvalidFieldName" Module="Core" Type="1">RmllbGQgZG9lc24ndCBleGlzdCBpbiAiJXMiIHVuaXQgY29uZmln</PHRASE>
@@ -448,6 +452,7 @@
<PHRASE Label="la_fld_HintTranslation" Module="Core" Type="1" Hint="QXNzb2NpYXRlZCBmaWVsZCB1c2FnZSB0cmFuc2xhdGlvbg==">SGludCBQaHJhc2U=</PHRASE>
<PHRASE Label="la_fld_Hits" Module="Core" Type="1" Column="SGl0cw==">SGl0cw==</PHRASE>
<PHRASE Label="la_fld_Hot" Module="Core" Type="1">SG90</PHRASE>
+ <PHRASE Label="la_fld_HtmlEmailTemplate" Module="Core" Type="1" Hint="VGhpcyBmaWVsZCBoYXMgYW4gSFRNTCB2ZXJzaW9uIG9mIEVtYWlsIERlc2lnbiBUZW1wbGF0ZSBhbmQgbXVzdCBjb250YWlucyBhdCBsZWFzdCBhICIkYm9keSIgdGFnIHVubGVzcyBUZXh0IFZlcnNpb24gZmllbGQgaXMgcG9wdWxhdGVkIGFscmVhZHkuIEl0IHdpbGwgYmUgdXNlZCBhcyBhIGRlc2lnbiBmb3IgYWxsIGVtYWlscyBzZW5kIG91dCBieSB0aGUgd2Vic2l0ZS4=">SFRNTCBWZXJzaW9u</PHRASE>
<PHRASE Label="LA_FLD_HTMLVERSION" Module="Core" Type="1">SFRNTCBWZXJzaW9u</PHRASE>
<PHRASE Label="la_fld_IconDisabledURL" Module="Core" Type="1">SWNvbiBVUkwgKGRpc2FibGVkKQ==</PHRASE>
<PHRASE Label="la_fld_IconURL" Module="Core" Type="1">SWNvbiBVUkw=</PHRASE>
@@ -630,6 +635,7 @@
<PHRASE Label="la_fld_Text" Module="Core" Type="1">VGV4dA==</PHRASE>
<PHRASE Label="la_fld_TextAlign" Module="Core" Type="1">VGV4dCBBbGlnbg==</PHRASE>
<PHRASE Label="la_fld_TextDecoration" Module="Core" Type="1">VGV4dCBEZWNvcmF0aW9u</PHRASE>
+ <PHRASE Label="la_fld_TextEmailTemplate" Module="Core" Type="1" Hint="VGhpcyBmaWVsZCBoYXMgYSBQbGFpbiBUZXh0IHZlcnNpb24gb2YgRW1haWwgRGVzaWduIFRlbXBsYXRlIGFuZCBtdXN0IGNvbnRhaW5zIGF0IGxlYXN0IGEgIiRib2R5IiB0YWcgdW5sZXNzIEhUTUwgVmVyc2lvbiBmaWVsZCBpcyBwb3B1bGF0ZWQgYWxyZWFkeS4gSXQgd2lsbCBiZSB1c2VkIGFzIGEgZGVzaWduIGZvciBhbGwgZW1haWxzIHNlbmQgb3V0IGJ5IHRoZSB3ZWJzaXRlLg==">VGV4dCBWZXJzaW9u</PHRASE>
<PHRASE Label="LA_FLD_TEXTVERSION" Module="Core" Type="1">VGV4dCBWZXJzaW9u</PHRASE>
<PHRASE Label="la_fld_Theme" Module="Core" Type="1" Column="VGhlbWU=">VGhlbWU=</PHRASE>
<PHRASE Label="la_fld_Themes" Module="Core" Type="1">VGhlbWVz</PHRASE>
@@ -1031,6 +1037,7 @@
<PHRASE Label="la_section_Counters" Module="Core" Type="1">Q291bnRlcnM=</PHRASE>
<PHRASE Label="la_section_CustomFields" Module="Core" Type="1">Q3VzdG9tIEZpZWxkcw==</PHRASE>
<PHRASE Label="la_section_Data" Module="Core" Type="1">U3VibWlzc2lvbiBEYXRh</PHRASE>
+ <PHRASE Label="la_section_EmailDesignTemplates" Module="Core" Type="1">RS1tYWlsIERlc2lnbiBUZW1wbGF0ZXM=</PHRASE>
<PHRASE Label="la_section_FrontEnd" Module="Core" Type="1">RnJvbnQtZW5k</PHRASE>
<PHRASE Label="la_section_FullSizeImage" Module="Core" Type="1">RnVsbCBTaXplIEltYWdl</PHRASE>
<PHRASE Label="la_section_General" Module="Core" Type="1">R2VuZXJhbA==</PHRASE>
@@ -1609,10 +1616,6 @@
<SUBJECT>WW91ciBDYXRlZ29yeSAiPGlucDI6Y19GaWVsZCBuYW1lPSJOYW1lIi8+IiBoYXMgYmVlbiBEZW5pZWQ=</SUBJECT>
<HTMLBODY>WW91ciBjYXRlZ29yeSBzdWdnZXN0aW9uICI8aW5wMjpjX0ZpZWxkIG5hbWU9Ik5hbWUiLz4iIGhhcyBiZWVuIGRlbmllZC4=</HTMLBODY>
</EVENT>
- <EVENT Event="COMMON.FOOTER" Type="1">
- <SUBJECT>Q29tbW9uIEZvb3RlciBUZW1wbGF0ZQ==</SUBJECT>
- <HTMLBODY>PGJyLz48YnIvPg0KDQpTaW5jZXJlbHksPGJyLz48YnIvPg0KDQpXZWJzaXRlIGFkbWluaXN0cmF0aW9uLg==</HTMLBODY>
- </EVENT>
<EVENT Event="FORM.SUBMISSION.REPLY.FROM.USER" Type="1">
<SUBJECT>TmV3IEVtYWlsIFJFUExZIFJlY2VpdmVkIGluICJGZWVkYmFjayBNYW5hZ2VyIiAoPGlucDI6Zm9ybXN1YnMuLWl0ZW1fRmllbGQgbmFtZT0iRm9ybVN1Ym1pc3Npb25JZCIvPik=</SUBJECT>
<HTMLBODY>TmV3IEVtYWlsIFJFUExZIFJlY2VpdmVkIGluICZxdW90O0ZlZWRiYWNrIE1hbmFnZXImcXVvdDsuPGJyIC8+DQo8YnIgLz4NCk9yaWdpbmFsIEZlZWRiYWNrSWQ6IDxpbnAyOmZvcm1zdWJzLi1pdGVtX0ZpZWxkIG5hbWU9IkZvcm1TdWJtaXNzaW9uSWQiLz4gPGJyIC8+DQpPcmlnaW5hbCBTdWJqZWN0OiA8aW5wMjpmb3Jtc3Vicy4taXRlbV9Gb3JtRmllbGQgcm9sZT0ic3ViamVjdCIvPiA8YnIgLz4NCjxiciAvPg0KUGxlYXNlIHByb2NlZWQgdG8gdGhlIEFkbWluIENvbnNvbGUgaW4gb3JkZXIgdG8gcmV2aWV3IGFuZCByZXBseSB0byB0aGUgdXNlci4=</HTMLBODY>
Index: install/install_schema.sql
===================================================================
--- install/install_schema.sql (revision 15223)
+++ install/install_schema.sql (working copy)
@@ -165,6 +165,8 @@
Locale varchar(10) NOT NULL DEFAULT 'en-US',
UserDocsUrl varchar(255) NOT NULL DEFAULT '',
SynchronizationModes varchar(255) NOT NULL DEFAULT '',
+ HtmlEmailTemplate text,
+ TextEmailTemplate text,
PRIMARY KEY (LanguageId),
KEY Enabled (Enabled),
KEY PrimaryLang (PrimaryLang),
Index: install/upgrades.php
===================================================================
--- install/upgrades.php (revision 15222)
+++ install/upgrades.php (working copy)
@@ -1482,8 +1482,8 @@
$languages = $ml_helper->getLanguages();
if ($this->Conn->TableFound(TABLE_PREFIX . 'EmailMessage', true)) {
- $email_message_helper = $this->Application->recallObject('EmailMessageHelper');
- /* @var $email_message_helper EmailMessageHelper */
+ $email_message_helper = $this->Application->recallObject('kEmailMessageHelper');
+ /* @var $email_message_helper kEmailMessageHelper */
foreach ($languages as $language_id) {
$sql = 'SELECT EmailMessageId, Template, EventId
@@ -2034,51 +2034,116 @@
}
if ( $mode == 'after' ) {
- $id_field = $this->Application->getUnitOption('emailevents', 'IDField');
- $table_name = $this->Application->getUnitOption('emailevents', 'TableName');
- $fields = $this->Conn->Query('DESCRIBE ' . $table_name, 'Field');
+ $this->_splitEmailBody();
+ $this->_migrateCommonFooter();
+ }
+ }
- if ( !isset($fields['l1_Body']) ) {
- // column dropped - nothing to convert anymore
- return;
- }
+ /**
+ * Splits e-mail body into HTML and Text fields
+ *
+ * @return void
+ * @access private
+ */
+ private function _splitEmailBody()
+ {
+ $id_field = $this->Application->getUnitOption('emailevents', 'IDField');
+ $table_name = $this->Application->getUnitOption('emailevents', 'TableName');
+ $fields = $this->Conn->Query('DESCRIBE ' . $table_name, 'Field');
- $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
- /* @var $ml_helper kMultiLanguageHelper */
+ if ( !isset($fields['l1_Body']) ) {
+ // column dropped - nothing to convert anymore
+ return;
+ }
- $languages = $ml_helper->getLanguages();
- $ml_helper->createFields('emailevents');
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
- $sql = 'SELECT *
- FROM ' . $table_name;
- $email_events = $this->Conn->Query($sql);
+ $languages = $ml_helper->getLanguages();
+ $ml_helper->createFields('emailevents');
- // 1. move data to new columns
- foreach ($email_events as $email_event) {
- $fields_hash = Array ();
- $translation_field = $email_event['MessageType'] == 'html' ? 'HtmlBody' : 'PlainTextBody';
+ $sql = 'SELECT *
+ FROM ' . $table_name;
+ $email_events = $this->Conn->Query($sql);
- foreach ($languages as $language_id) {
- $fields_hash['l' . $language_id . '_' . $translation_field] = $email_event['l' . $language_id . '_Body'];
- }
+ // 1. move data to new columns
+ foreach ($email_events as $email_event) {
+ $fields_hash = Array ();
+ $translation_field = $email_event['MessageType'] == 'html' ? 'HtmlBody' : 'PlainTextBody';
- if ( $fields_hash ) {
- $this->Conn->doUpdate($fields_hash, $table_name, $id_field . ' = ' . $email_event[$id_field]);
- }
+ foreach ($languages as $language_id) {
+ $fields_hash['l' . $language_id . '_' . $translation_field] = $email_event['l' . $language_id . '_Body'];
}
- // 2. drop old columns
- $drops = Array ('DROP COLUMN MessageType');
+ if ( $fields_hash ) {
+ $this->Conn->doUpdate($fields_hash, $table_name, $id_field . ' = ' . $email_event[$id_field]);
+ }
+ }
- foreach ($languages as $language_id) {
- $lang_field = 'l' . $language_id . '_Body';
+ // 2. drop old columns
+ $drops = Array ('DROP COLUMN MessageType');
- if ( isset($fields[$lang_field]) ) {
- $drops[] = 'DROP COLUMN ' . $lang_field;
- }
+ foreach ($languages as $language_id) {
+ $lang_field = 'l' . $language_id . '_Body';
+
+ if ( isset($fields[$lang_field]) ) {
+ $drops[] = 'DROP COLUMN ' . $lang_field;
}
+ }
- $this->Conn->Query('ALTER TABLE ' . $table_name . ' ' . implode(', ', $drops));
+ $this->Conn->Query('ALTER TABLE ' . $table_name . ' ' . implode(', ', $drops));
+ }
+
+ /**
+ * Transforms COMMON.FOOTER e-mail event into new field in Languages table
+ */
+ private function _migrateCommonFooter()
+ {
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ $languages = $ml_helper->getLanguages();
+
+ $event_table = $this->Application->getUnitOption('emailevents', 'TableName');
+
+ $sql = 'SELECT *
+ FROM ' . $event_table . '
+ WHERE Event = "COMMON.FOOTER"';
+ $footer_data = $this->Conn->GetRow($sql);
+
+ if ( !$footer_data ) {
+ return;
}
+
+ $table_name = $this->Application->getUnitOption('lang', 'TableName');
+
+ foreach ($languages as $language_id) {
+ $fields_hash = Array (
+ 'HtmlEmailTemplate' => $this->_appendEmailDesignBody($footer_data['l' . $language_id . '_HtmlBody']),
+ 'TextEmailTemplate' => $this->_appendEmailDesignBody($footer_data['l' . $language_id . '_PlainTextBody']),
+ );
+
+ $this->Conn->doUpdate($fields_hash, $table_name, 'LanguageId = ' . $language_id);
+ }
+
+ $sql = 'DELETE FROM ' . $event_table . '
+ WHERE EventId = ' . $footer_data['EventId'];
+ $this->Conn->Query($sql);
}
+
+ /**
+ * Adds "$body" to given string
+ *
+ * @param string $string
+ * @return string
+ * @access private
+ */
+ private function _appendEmailDesignBody($string)
+ {
+ if ( !$string ) {
+ return $string;
+ }
+
+ return '$body' . "\n" . str_replace(Array ("\r\n", "\r"), "\n", $string);
+ }
}
\ No newline at end of file
Index: install/upgrades.sql
===================================================================
--- install/upgrades.sql (revision 15215)
+++ install/upgrades.sql (working copy)
@@ -2660,3 +2660,6 @@
CHANGE CategoryId CategoryId INT(11) NULL;
# ===== v 5.2.0-B3 =====
+ALTER TABLE Languages
+ ADD HtmlEmailTemplate TEXT NULL,
+ ADD TextEmailTemplate TEXT NULL;
Index: kernel/utility/email.php
===================================================================
--- kernel/utility/email.php (revision 15222)
+++ kernel/utility/email.php (working copy)
@@ -203,7 +203,7 @@
protected function _getCustomParams()
{
$ret = $this->params;
- $send_keys = Array ('from_email', 'from_name', 'to_email', 'to_name', 'overwrite_to_email', 'language_id');
+ $send_keys = Array ('from_email', 'from_name', 'to_email', 'to_name', 'overwrite_to_email', 'language_id', 'use_custom_design');
foreach ($send_keys as $send_key) {
unset($ret[$send_key]);
@@ -691,21 +691,16 @@
$design_key = $is_html ? 'html' : 'text';
if ( !isset($design_templates[$design_key]) ) {
- $footer_email = $this->Application->recallObject('emailevents.footer', null, Array ('skip_autoload' => true));
- /* @var $footer_email kDBItem */
+ $language = $this->Application->recallObject('lang.current');
+ /* @var $language LanguagesItem */
- $footer_email->Load('COMMON.FOOTER', 'Event');
- $footer = $footer_email->GetField($is_html ? 'HtmlBody' : 'PlainTextBody');
+ $design_template = $language->GetDBField($is_html ? 'HtmlEmailTemplate' : 'TextEmailTemplate');
- if ( !$is_html && !$footer ) {
- $footer = $this->sender->ConvertToText($footer_email->GetField('HtmlBody'));
+ if ( !$is_html && !$design_template ) {
+ $design_template = $this->sender->ConvertToText($language->GetDBField('HtmlEmailTemplate'));
}
- $design_templates[$design_key] = '$body';
-
- if ( $footer ) {
- $design_templates[$design_key] .= "\r\n" . $footer;
- }
+ $design_templates[$design_key] = $design_template;
}
return $this->_parseText(str_replace('$body', $text, $design_templates[$design_key]));
@@ -731,7 +726,12 @@
return false;
}
- $message_body = $this->_applyMessageDesign($message_body, $is_html);
+ if ( isset($this->params['use_custom_design']) && $this->params['use_custom_design'] ) {
+ $message_body = $this->_parseText($message_body);
+ }
+ else {
+ $message_body = $this->_applyMessageDesign($message_body, $is_html);
+ }
return trim($message_body) ? $message_body : false;
}
Index: units/email_events/email_events_event_handler.php
===================================================================
--- units/email_events/email_events_event_handler.php (revision 15222)
+++ units/email_events/email_events_event_handler.php (working copy)
@@ -380,15 +380,6 @@
$object = $event->getObject();
/* @var $object kDBItem */
- // validate email subject and body for parsing errors
- $this->_validateEmailTemplate($object);
-
- // validate sender and recipient addresses
- if ( $object->GetDBField('CustomSender') ) {
- $this->_validateAddress($event, 'Sender');
- }
- $this->_validateAddress($event, 'Recipient');
-
if ( !$this->Application->isDebugMode(false) ) {
// only allow to enable/disable event while in debug mode
$to_restore = Array ('Enabled', 'AllowChangingSender', 'AllowChangingRecipient');
@@ -475,53 +466,6 @@
}
/**
- * Validates address using given field prefix
- *
- * @param kEvent $event
- * @param string $field_prefix
- */
- function _validateAddress($event, $field_prefix)
- {
- $object = $event->getObject();
- /* @var $object kDBItem */
-
- $address_type = $object->GetDBField($field_prefix . 'AddressType');
- $object->setRequired($field_prefix . 'Address', $address_type > 0);
- $address = $object->GetDBField($field_prefix . 'Address');
-
- if ( !$address ) {
- // don't validate against empty address
- return;
- }
-
- switch ($address_type) {
- case EmailEvent::ADDRESS_TYPE_EMAIL:
- if ( !preg_match('/^(' . REGEX_EMAIL_USER . '@' . REGEX_EMAIL_DOMAIN . ')$/i', $address) ) {
- $object->SetError($field_prefix . 'Address', 'invalid_email');
- }
- break;
-
- case EmailEvent::ADDRESS_TYPE_USER:
- $sql = 'SELECT PortalUserId
- FROM ' . TABLE_PREFIX . 'Users
- WHERE Username = ' . $this->Conn->qstr($address);
- if ( !$this->Conn->GetOne($sql) ) {
- $object->SetError($field_prefix . 'Address', 'invalid_user');
- }
- break;
-
- case EmailEvent::ADDRESS_TYPE_GROUP:
- $sql = 'SELECT GroupId
- FROM ' . TABLE_PREFIX . 'UserGroups
- WHERE Name = ' . $this->Conn->qstr($address);
- if ( !$this->Conn->GetOne($sql) ) {
- $object->SetError($field_prefix . 'Address', 'invalid_group');
- }
- break;
- }
- }
-
- /**
* Don't allow to enable/disable events in non-debug mode
*
* @param kEvent $event
@@ -611,6 +555,31 @@
}
/**
+ * Does custom validation
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnBeforeItemValidate(kEvent $event)
+ {
+ parent::OnBeforeItemValidate($event);
+
+ $object = $event->getObject();
+ /* @var $object kDBItem */
+
+ // validate email subject and body for parsing errors
+ $this->_validateEmailTemplate($object);
+
+ // validate sender and recipient addresses
+ if ( $object->GetDBField('CustomSender') ) {
+ $this->_validateAddress($event, 'Sender');
+ }
+
+ $this->_validateAddress($event, 'Recipient');
+ }
+
+ /**
* Validates subject and body fields of Email template
*
* @param kDBItem $object
@@ -619,31 +588,60 @@
*/
protected function _validateEmailTemplate($object)
{
- $this->parseField($object, 'Subject');
- $this->parseField($object, 'HtmlBody');
- $this->parseField($object, 'PlainTextBody');
+ $email_message_helper = $this->Application->recallObject('kEmailMessageHelper');
+ /* @var $email_message_helper kEmailMessageHelper */
+
+ $email_message_helper->parseField($object, 'Subject');
+ $email_message_helper->parseField($object, 'HtmlBody');
+ $email_message_helper->parseField($object, 'PlainTextBody');
}
/**
- * Parses contents of given object field and sets error, when invalid in-portal tags found
- * @param kDBItem $object
- * @param string $field
+ * Validates address using given field prefix
+ *
+ * @param kEvent $event
+ * @param string $field_prefix
* @return void
* @access protected
*/
- protected function parseField($object, $field)
+ protected function _validateAddress($event, $field_prefix)
{
- $this->Application->InitParser();
+ $object = $event->getObject();
+ /* @var $object kDBItem */
- try {
- $this->Application->Parser->CompileRaw($object->GetField($field), 'email_template');
+ $address_type = $object->GetDBField($field_prefix . 'AddressType');
+ $object->setRequired($field_prefix . 'Address', $address_type > 0);
+ $address = $object->GetDBField($field_prefix . 'Address');
+
+ if ( !$address ) {
+ // don't validate against empty address
+ return;
}
- catch (ParserException $e) {
- if ( $this->Application->isDebugMode() ) {
- $this->Application->Debugger->appendHTML('<b style="color: red;">Error in Email Template:</b> ' . $e->getMessage() . ' (line: ' . $e->getLine() . ')');
- }
- $object->SetError($field, 'parsing_error');
+ switch ($address_type) {
+ case EmailEvent::ADDRESS_TYPE_EMAIL:
+ if ( !preg_match('/^(' . REGEX_EMAIL_USER . '@' . REGEX_EMAIL_DOMAIN . ')$/i', $address) ) {
+ $object->SetError($field_prefix . 'Address', 'invalid_email');
+ }
+ break;
+
+ case EmailEvent::ADDRESS_TYPE_USER:
+ $sql = 'SELECT PortalUserId
+ FROM ' . TABLE_PREFIX . 'Users
+ WHERE Username = ' . $this->Conn->qstr($address);
+ if ( !$this->Conn->GetOne($sql) ) {
+ $object->SetError($field_prefix . 'Address', 'invalid_user');
+ }
+ break;
+
+ case EmailEvent::ADDRESS_TYPE_GROUP:
+ $sql = 'SELECT GroupId
+ FROM ' . TABLE_PREFIX . 'UserGroups
+ WHERE Name = ' . $this->Conn->qstr($address);
+ if ( !$this->Conn->GetOne($sql) ) {
+ $object->SetError($field_prefix . 'Address', 'invalid_group');
+ }
+ break;
}
}
Index: units/helpers/email_message_helper.php
===================================================================
--- units/helpers/email_message_helper.php (revision 15222)
+++ units/helpers/email_message_helper.php (working copy)
@@ -14,7 +14,7 @@
defined('FULL_PATH') or die('restricted access!');
-class EmailMessageHelper extends kHelper {
+class kEmailMessageHelper extends kHelper {
/**
* Extracts Subject, Headers, Body fields from email message translation
@@ -67,37 +67,25 @@
}
/**
- * Prepares email event content for language pack export
- *
- * @param Array $fields_hash
- * @return string
+ * Parses contents of given object field and sets error, when invalid in-portal tags found
+ * @param kDBItem $object
+ * @param string $field
+ * @return void
+ * @access public
*/
- function buildTemplate($fields_hash)
+ public function parseField($object, $field)
{
- if (!implode('', $fields_hash)) {
- return '';
- }
+ $this->Application->InitParser();
- $ret = array_key_exists('Headers', $fields_hash) ? $fields_hash['Headers'] : '';
- if ($ret) {
- $ret .= "\n";
+ try {
+ $this->Application->Parser->CompileRaw($object->GetField($field), 'email_template');
}
+ catch (ParserException $e) {
+ if ( $this->Application->isDebugMode() ) {
+ $this->Application->Debugger->appendHTML('<b style="color: red;">Error in Email Template:</b> ' . $e->getMessage() . ' (line: ' . $e->getLine() . ')');
+ }
- $ret = $this->_removeTrailingCRLF($ret);
- $ret .= 'Subject: ' . $fields_hash['Subject'] . "\n\n";
- $ret .= $fields_hash['Body'];
-
- return $ret;
+ $object->SetError($field, 'parsing_error');
+ }
}
-
- /**
- * Remove trailing CR/LF chars from string
- *
- * @param string $string
- * @return string
- */
- function _removeTrailingCRLF($string)
- {
- return preg_replace('/(\n|\r)+/',"\\1",$string);
- }
}
\ No newline at end of file
Index: units/helpers/helpers_config.php
===================================================================
--- units/helpers/helpers_config.php (revision 15165)
+++ units/helpers/helpers_config.php (working copy)
@@ -57,7 +57,7 @@
Array ('pseudo' => 'BracketsHelper', 'class' => 'kBracketsHelper', 'file' => 'brackets_helper.php', 'build_event' => ''),
Array ('pseudo' => 'kXMLHelper', 'class' => 'kXMLHelper', 'file' => 'xml_helper.php', 'build_event' => ''),
Array ('pseudo' => 'CatItemExportHelper', 'class' => 'kCatDBItemExportHelper', 'file' => 'cat_dbitem_export_helper.php', 'build_event' => ''),
- Array ('pseudo' => 'EmailMessageHelper', 'class' => 'EmailMessageHelper', 'file' => 'email_message_helper.php', 'build_event' => ''),
+ Array ('pseudo' => 'kEmailMessageHelper', 'class' => 'kEmailMessageHelper', 'file' => 'email_message_helper.php', 'build_event' => ''),
Array ('pseudo' => 'ListHelper', 'class' => 'ListHelper', 'file' => 'list_helper.php', 'build_event' => ''),
Array ('pseudo' => 'FormSubmissionHelper', 'class' => 'FormSubmissionHelper', 'file' => 'form_submission_helper.php', 'build_event' => ''),
Index: units/helpers/language_import_helper.php
===================================================================
--- units/helpers/language_import_helper.php (revision 15224)
+++ units/helpers/language_import_helper.php (working copy)
@@ -33,6 +33,10 @@
* ==========
* Use separate xml nodes for subject, headers, html & plain translations
*
+ * v6
+ * ==========
+ * Added e-mail design templates
+ *
*/
defined('FULL_PATH') or die('restricted access!');
@@ -121,7 +125,7 @@
*
* @var int
*/
- var $_latestVersion = 5;
+ var $_latestVersion = 6;
/**
* Prefix-based serial numbers, that should be changed after import is finished
@@ -324,12 +328,25 @@
// filename replacements
$replacements = $language_info['FilenameReplacements'];
- if ($replacements) {
- $ret .= "\t\t" . '<REPLACEMENTS>';
- $ret .= $this->_exportEncoding == 'base64' ? base64_encode($replacements) : '<![CDATA[' . $replacements . ']]>';
- $ret .= '</REPLACEMENTS>' . "\n";
+ if ( $replacements ) {
+ $ret .= "\t\t" . '<REPLACEMENTS>' . $this->_exportConvert($replacements) . '</REPLACEMENTS>' . "\n";
}
+ // e-mail design templates
+ if ( $language_info['HtmlEmailTemplate'] || $language_info['TextEmailTemplate'] ) {
+ $ret .= "\t\t" . '<EMAILDESIGNS>' . "\n";
+
+ if ( $language_info['HtmlEmailTemplate'] ) {
+ $ret .= "\t\t\t" . '<HTML>' . $this->_exportConvert($language_info['HtmlEmailTemplate']) . '</HTML>' . "\n";
+ }
+
+ if ( $language_info['TextEmailTemplate'] ) {
+ $ret .= "\t\t\t" . '<TEXT>' . $this->_exportConvert($language_info['TextEmailTemplate']) . '</TEXT>' . "\n";
+ }
+
+ $ret .= "\t\t" . '</EMAILDESIGNS>' . "\n";
+ }
+
// phrases
if ($phrases) {
$ret .= "\t\t" . '<PHRASES>' . "\n";
@@ -344,12 +361,10 @@
}
if ( $this->_exportEncoding == 'base64' ) {
- $data = base64_encode($translation);
$hint_translation = base64_encode($hint_translation);
$column_translation = base64_encode($column_translation);
}
else {
- $data = '<![CDATA[' . $translation . ']]>';
$hint_translation = htmlspecialchars($hint_translation);
$column_translation = htmlspecialchars($column_translation);
}
@@ -368,7 +383,7 @@
$attributes[] = 'Column="' . $column_translation . '"';
}
- $ret .= "\t\t\t" . '<PHRASE ' . implode(' ', $attributes) . '>' . $data . '</PHRASE>' . "\n";
+ $ret .= "\t\t\t" . '<PHRASE ' . implode(' ', $attributes) . '>' . $this->_exportConvert($translation) . '</PHRASE>' . "\n";
}
$ret .= "\t\t" . '</PHRASES>' . "\n";
@@ -774,6 +789,7 @@
'Encoding' => (string)$language_node['Encoding'],
'Charset' => 'utf-8',
'SynchronizationModes' => Language::SYNCHRONIZE_DEFAULT,
+ 'HtmlEmailTemplate' => '$body',
);
if ( $version > 1 ) {
@@ -823,6 +839,12 @@
$fields_hash['FilenameReplacements'] = $replacements;
break;
+ case 'EMAILDESIGNS':
+ // added since v6
+ $this->_decodeEmailDesignTemplate($fields_hash, 'HtmlEmailTemplate', (string)$sub_node->HTML);
+ $this->_decodeEmailDesignTemplate($fields_hash, 'TextEmailTemplate', (string)$sub_node->TEXT);
+ break;
+
default:
if ( $version == 1 ) {
$fields_hash[$field_mapping[$sub_node->Name]] = (string)$sub_node;
@@ -834,6 +856,24 @@
}
/**
+ * Decodes e-mail template design from language pack
+ *
+ * @param Array $fields_hash
+ * @param string $field
+ * @param string $design_template
+ */
+ protected function _decodeEmailDesignTemplate(&$fields_hash, $field, $design_template)
+ {
+ if ( $fields_hash['Encoding'] != 'plain' ) {
+ $design_template = base64_decode($design_template);
+ }
+
+ if ( $design_template ) {
+ $fields_hash[$field] = $design_template;
+ }
+ }
+
+ /**
* Performs phases import
*
* @param SimpleXMLElement $phrases
@@ -913,8 +953,8 @@
$this->Application->Debugger->profileStart('L[' . $language_id . ']E', 'Language: ' . $language_id . '; Events Import');
}
- $email_message_helper = $this->Application->recallObject('EmailMessageHelper');
- /* @var $email_message_helper EmailMessageHelper */
+ $email_message_helper = $this->Application->recallObject('kEmailMessageHelper');
+ /* @var $email_message_helper kEmailMessageHelper */
foreach ($events as $event_node) {
/* @var $event_node SimpleXMLElement */
Index: units/languages/languages_config.php
===================================================================
--- units/languages/languages_config.php (revision 15165)
+++ units/languages/languages_config.php (working copy)
@@ -212,6 +212,16 @@
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_SynchronizeToOthers', 2 => 'la_opt_SynchronizeFromOthers'), 'use_phrases' => 1, 'multiple' => 1,
'not_null' => 1, 'default' => ''
),
+ 'HtmlEmailTemplate' => Array (
+ 'type' => 'string',
+ 'error_msgs' => Array ('parsing_error' => '!la_error_ParsingError!', 'body_missing' => '!la_error_EmailTemplateBodyMissing!'),
+ 'default' => NULL
+ ),
+ 'TextEmailTemplate' => Array (
+ 'type' => 'string',
+ 'error_msgs' => Array ('parsing_error' => '!la_error_ParsingError!', 'body_missing' => '!la_error_EmailTemplateBodyMissing!'),
+ 'default' => NULL
+ ),
),
'VirtualFields' => Array (
Index: units/languages/languages_event_handler.php
===================================================================
--- units/languages/languages_event_handler.php (revision 15222)
+++ units/languages/languages_event_handler.php (working copy)
@@ -211,6 +211,20 @@
}
/**
+ * Occurs before creating item
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnBeforeItemCreate(kEvent $event)
+ {
+ parent::OnBeforeItemCreate($event);
+
+ $this->_itemChanged($event);
+ }
+
+ /**
* Occurs before updating item
*
* @param kEvent $event
@@ -230,9 +244,68 @@
if ( $object->GetDBField('PrimaryLang') == 1 && $object->GetDBField($status_field) == 0 ) {
$object->SetDBField($status_field, 1);
}
+
+ $this->_itemChanged($event);
}
+
/**
+ * Dynamically changes required fields
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function _itemChanged(kEvent $event)
+ {
+ $this->setRequired($event);
+ }
+
+ /**
+ * Dynamically changes required fields
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnBeforeItemValidate(kEvent $event)
+ {
+ parent::OnBeforeItemValidate($event);
+
+ $object = $event->getObject();
+ /* @var $object kDBItem */
+
+ $email_message_helper = $this->Application->recallObject('kEmailMessageHelper');
+ /* @var $email_message_helper kEmailMessageHelper */
+
+ $email_message_helper->parseField($object, 'HtmlEmailTemplate');
+ $email_message_helper->parseField($object, 'TextEmailTemplate');
+
+ $check_field = $object->GetDBField('TextEmailTemplate') ? 'TextEmailTemplate' : 'HtmlEmailTemplate';
+ $check_value = $object->GetDBField($check_field);
+
+ if ( $check_value && strpos($check_value, '$body') === false ) {
+ $object->SetError($check_field, 'body_missing');
+ }
+ }
+
+ /**
+ * Dynamically changes required fields
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function setRequired(kEvent $event)
+ {
+ $object = $event->getObject();
+ /* @var $object kDBItem */
+
+ $object->setRequired('HtmlEmailTemplate', !$object->GetDBField('TextEmailTemplate'));
+ $object->setRequired('TextEmailTemplate', !$object->GetDBField('HtmlEmailTemplate'));
+ }
+
+ /**
* Shows only enabled languages on front
*
* @param kEvent $event
@@ -376,9 +449,28 @@
$object->SetDBField('CopyFromLanguage', $primary_lang_id);
$object->SetDBField('SynchronizationModes', Language::SYNCHRONIZE_DEFAULT);
+ $object->SetDBField('HtmlEmailTemplate', '$body');
+
+ $this->setRequired($event);
}
/**
+ * Sets dynamic required fields
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnAfterItemLoad(kEvent $event)
+ {
+ parent::OnAfterItemLoad($event);
+
+ $object = $event->getObject();
+ /* @var $object kDBItem */
+
+ $this->setRequired($event);
+ }
+ /**
* Sets new language mark
*
* @param kEvent $event
html_design_template_ignored_during_clean_install.patch [^] (1,547 bytes) 2012-03-26 12:23
[Show Content]
Index: units/helpers/language_import_helper.php
===================================================================
--- units/helpers/language_import_helper.php (revision 15237)
+++ units/helpers/language_import_helper.php (working copy)
@@ -790,7 +790,6 @@
'Encoding' => (string)$language_node['Encoding'],
'Charset' => 'utf-8',
'SynchronizationModes' => Language::SYNCHRONIZE_DEFAULT,
- 'HtmlEmailTemplate' => '$body',
);
if ( $version > 1 ) {
Index: units/languages/languages_config.php
===================================================================
--- units/languages/languages_config.php (revision 15225)
+++ units/languages/languages_config.php (working copy)
@@ -215,7 +215,7 @@
'HtmlEmailTemplate' => Array (
'type' => 'string',
'error_msgs' => Array ('parsing_error' => '!la_error_ParsingError!', 'body_missing' => '!la_error_EmailTemplateBodyMissing!'),
- 'default' => NULL
+ 'default' => '$body'
),
'TextEmailTemplate' => Array (
'type' => 'string',
Index: units/languages/languages_event_handler.php
===================================================================
--- units/languages/languages_event_handler.php (revision 15225)
+++ units/languages/languages_event_handler.php (working copy)
@@ -449,7 +449,6 @@
$object->SetDBField('CopyFromLanguage', $primary_lang_id);
$object->SetDBField('SynchronizationModes', Language::SYNCHRONIZE_DEFAULT);
- $object->SetDBField('HtmlEmailTemplate', '$body');
$this->setRequired($event);
}
email_event_design_upgrade_fix.patch [^] (1,561 bytes) 2012-07-16 07:37
[Show Content]
Index: install/upgrades.php
===================================================================
--- install/upgrades.php (revision 15449)
+++ install/upgrades.php (working copy)
@@ -2122,12 +2122,15 @@
return;
}
+ $primary_language_id = $this->Application->GetDefaultLanguageId();
$table_name = $this->Application->getUnitOption('lang', 'TableName');
foreach ($languages as $language_id) {
+ $is_primary = $language_id == $primary_language_id;
+
$fields_hash = Array (
- 'HtmlEmailTemplate' => $this->_appendEmailDesignBody($footer_data['l' . $language_id . '_HtmlBody']),
- 'TextEmailTemplate' => $this->_appendEmailDesignBody($footer_data['l' . $language_id . '_PlainTextBody']),
+ 'HtmlEmailTemplate' => $this->_appendEmailDesignBody($footer_data['l' . $language_id . '_HtmlBody'], $is_primary),
+ 'TextEmailTemplate' => $this->_appendEmailDesignBody($footer_data['l' . $language_id . '_PlainTextBody'], $is_primary),
);
$this->Conn->doUpdate($fields_hash, $table_name, 'LanguageId = ' . $language_id);
@@ -2142,13 +2145,14 @@
* Adds "$body" to given string
*
* @param string $string
+ * @param bool $is_primary for primary language
* @return string
* @access private
*/
- private function _appendEmailDesignBody($string)
+ private function _appendEmailDesignBody($string, $is_primary)
{
if ( !$string ) {
- return $string;
+ return $is_primary ? '$body' : $string;
}
return '$body' . "\n" . str_replace(Array ("\r\n", "\r"), "\n", $string);
|