Attached Files |
unmatched_email_to_form_submissions.patch [^] (20,255 bytes) 2010-07-07 04:30
[Show Content]
Index: admin_templates/forms/form_edit_emails.tpl
===================================================================
--- admin_templates/forms/form_edit_emails.tpl (revision 13756)
+++ admin_templates/forms/form_edit_emails.tpl (working copy)
@@ -60,6 +60,7 @@
<table class="edit-form">
<inp2:m_RenderElement name="subsection" title="la_title_General"/>
<inp2:m_RenderElement name="inp_edit_checkbox" prefix="form" field="EnableEmailCommunication" title="la_fld_Enable" onclick="reflectFromFields();"/>
+ <inp2:m_RenderElement name="inp_edit_checkbox" prefix="form" field="ProcessUnmatchedEmails" title="la_fld_ProcessUnmatchedEmails"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="form" field="ReplyFromName" title="la_fld_ReplyFromName"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="form" field="ReplyCc" title="la_fld_ReplyCc"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="form" field="ReplyBcc" title="la_fld_ReplyBcc"/>
@@ -97,6 +98,8 @@
for (var $i = 0; $i < $fields.length; $i++) {
get_control($field_mask, $fields[$i]).disabled = !$enabled;
}
+
+ get_control($field_mask, 'ProcessUnmatchedEmails', undefined, '_cb').disabled = !$enabled;
}
reflectFromFields();
Index: admin_templates/submissions/submission_view.tpl
===================================================================
--- admin_templates/submissions/submission_view.tpl (revision 13756)
+++ admin_templates/submissions/submission_view.tpl (working copy)
@@ -109,6 +109,23 @@
<inp2:SubmissionTag tag="PredefinedOptions" field="$field" block="form_radio_item" selected="checked"/>
</inp2:m_DefineElement>
+<inp2:m_DefineElement name="inp_edit_merge_to" caption_render_as="default_field_caption_element" is_last="" field_class="" onchange="" hint_label="" onclick="">
+ <inp2:m_if check="{$prefix}_FieldVisible" field="$field">
+ <tr class="<inp2:m_odd_even odd='edit-form-odd' even='edit-form-even'/>" id="<inp2:$prefix_InputName field='$field'/>_row">
+ <inp2:m_RenderElement name="inp_edit_field_caption" caption_render_as="$caption_render_as" prefix="$prefix" field="$field" title="$title" hint_label="$hint_label" is_last="$is_last" NamePrefix="_cb_"/>
+ <td class="control-cell">
+ <input type="hidden" id="<inp2:{$prefix}_InputName field='Is{$field}'/>" name="<inp2:{$prefix}_InputName field='Is{$field}'/>" value="<inp2:{$prefix}_Field field='Is{$field}' db='db'/>">
+ <input tabindex="<inp2:m_get param='tab_index'/>" type="checkbox" id="_cb_<inp2:{$prefix}_InputName field='Is{$field}'/>" name="_cb_<inp2:{$prefix}_InputName field='Is{$field}'/>" <inp2:{$prefix}_Field field="Is{$field}" checked="checked" db="db"/> class="<inp2:m_param name='field_class'/>" onchange="update_checkbox(this, document.getElementById('<inp2:{$prefix}_InputName field='Is{$field}'/>'));<inp2:m_param name='onchange'/>" onclick="<inp2:m_param name='onclick'/>">
+
+ <select tabindex="<inp2:m_get param='tab_index'/>" name="<inp2:{$prefix}_InputName field='$field'/>" id="<inp2:{$prefix}_InputName field='$field'/>" onchange="<inp2:m_Param name='onchange'/>" style="width: 400px;">
+ <inp2:{$prefix}_PredefinedOptions field="$field" block="inp_option_item" selected="selected" has_empty="1"/>
+ </select>
+ </td>
+ <inp2:m_RenderElement name="inp_edit_error" pass_params="1"/>
+ </tr>
+ </inp2:m_if>
+</inp2:m_DefineElement>
+
<inp2:formsubs_SaveWarning name="grid_save_warning"/>
<inp2:formsubs_ErrorWarning name="form_error_warning"/>
@@ -130,6 +147,11 @@
<inp2:m_RenderElement name="inp_label" prefix="formsubs" field="LastUpdatedOn" title="la_fld_LastUpdatedOn" />
</inp2:m_if>
+ <inp2:m_if check="form_Field" name="EnableEmailCommunication" db="db">
+ <inp2:m_ifnot check="submission-log_TotalRecords">
+ <inp2:m_RenderElement name="inp_edit_merge_to" prefix="formsubs" field="MergeToSubmission" title="la_fld_MergeToSubmission"/>
+ </inp2:m_ifnot>
+ </inp2:m_if>
<inp2:m_RenderElement name="subsection" title="la_section_Data"/>
<inp2:m_DefineElement name="form_field" prefix="formsubs">
@@ -163,4 +185,35 @@
</table>
</div>
+<inp2:m_ifnot check="submission-log_TotalRecords">
+ <script language="javascript" type="text/javascript">
+ var $field_mask = '<inp2:formsubs_InputName name="#FIELD_NAME#" js_escape="1"/>';
+
+ $(document).ready(
+ function () {
+ processMergeToSubmission();
+ $( get_control($field_mask, 'IsMergeToSubmission', undefined, '_cb') ).click(processMergeToSubmission);
+ }
+ );
+
+ function processMergeToSubmission() {
+ var $do_merge = get_control($field_mask, 'IsMergeToSubmission', undefined, '_cb').checked;
+ var $merge_to_submission = get_control($field_mask, 'MergeToSubmission');
+
+ if (!$do_merge) {
+ $merge_to_submission.selectedIndex = 0;
+ }
+
+ $merge_to_submission.disabled = !$do_merge;
+
+ if ($do_merge) {
+ $('#merge_submission').removeClass('button-disabled').addClass('button').attr('disabled', '');
+ }
+ else {
+ $('#merge_submission').removeClass('button').addClass('button-disabled').attr('disabled', 'disabled');
+ }
+ }
+ </script>
+</inp2:m_ifnot>
+
<inp2:m_include t="incs/footer"/>
\ No newline at end of file
Index: install/english.lang
===================================================================
--- install/english.lang (revision 13789)
+++ install/english.lang (working copy)
@@ -520,6 +520,7 @@
<PHRASE Label="la_fld_MaxCategories" Module="Core" Type="1">TWF4aW11bSBudW1iZXIgb2YgU2VjdGlvbnMgb24gSXRlbSBjYW4gYmUgYWRkZWQgdG8=</PHRASE>
<PHRASE Label="la_fld_MenuIcon" Module="Core" Type="1">Q3VzdG9tIE1lbnUgSWNvbiAoaWUuIGltZy9tZW51X3Byb2R1Y3RzLmdpZik=</PHRASE>
<PHRASE Label="la_fld_MenuStatus" Module="Core" Type="1">TWVudSBTdGF0dXM=</PHRASE>
+ <PHRASE Label="la_fld_MergeToSubmission" Module="Core" Type="1">TWVyZ2UgdG8gU3VibWlzc2lvbg==</PHRASE>
<PHRASE Label="la_fld_Message" Module="Core" Type="1">TWVzc2FnZQ==</PHRASE>
<PHRASE Label="la_fld_MessageBody" Module="Core" Type="1">TWVzc2FnZSBCb2R5</PHRASE>
<PHRASE Label="la_fld_MessageText" Module="Core" Type="1">UGxhaW4gVGV4dCBWZXJzaW9u</PHRASE>
@@ -566,6 +567,7 @@
<PHRASE Label="la_fld_PrimaryLang" Module="Core" Type="1">UHJpbWFyeQ==</PHRASE>
<PHRASE Label="la_fld_PrimaryTranslation" Module="Core" Type="1">UHJpbWFyeSBMYW5ndWFnZSBQaHJhc2U=</PHRASE>
<PHRASE Label="la_fld_Priority" Module="Core" Type="1">T3JkZXI=</PHRASE>
+ <PHRASE Label="la_fld_ProcessUnmatchedEmails" Module="Core" Type="1">Q29udmVydCB1bm1hdGNoZWQgZS1tYWlscyBpbnRvIG5ldyBzdWJtaXNzaW9ucw==</PHRASE>
<PHRASE Label="la_fld_Qty" Module="Core" Type="1">UXVhbnRpdHk=</PHRASE>
<PHRASE Label="la_fld_Rating" Module="Core" Type="1">UmF0aW5n</PHRASE>
<PHRASE Label="la_fld_RecipientAddress" Module="Core" Type="1">UmVjaXBpZW50J3MgQWRkcmVzcw==</PHRASE>
Index: install/install_schema.sql
===================================================================
--- install/install_schema.sql (revision 13780)
+++ install/install_schema.sql (working copy)
@@ -1105,11 +1105,13 @@
LogStatus tinyint(3) unsigned NOT NULL DEFAULT '2',
LastUpdatedOn int(10) unsigned DEFAULT NULL,
Notes text,
+ MessageId varchar(255) DEFAULT NULL,
PRIMARY KEY (FormSubmissionId),
KEY FormId (FormId),
KEY SubmissionTime (SubmissionTime),
KEY LogStatus (LogStatus),
- KEY LastUpdatedOn (LastUpdatedOn)
+ KEY LastUpdatedOn (LastUpdatedOn),
+ KEY MessageId (MessageId)
);
CREATE TABLE SubmissionLog (
@@ -1162,6 +1164,7 @@
RequireLogin tinyint(4) NOT NULL DEFAULT '0',
UseSecurityImage tinyint(4) NOT NULL DEFAULT '0',
EnableEmailCommunication tinyint(4) NOT NULL DEFAULT '0',
+ ProcessUnmatchedEmails tinyint(4) NOT NULL DEFAULT '0',
ReplyFromName varchar(255) NOT NULL DEFAULT '',
ReplyFromEmail varchar(255) NOT NULL DEFAULT '',
ReplyCc varchar(255) NOT NULL DEFAULT '',
@@ -1179,7 +1182,8 @@
PRIMARY KEY (FormId),
KEY UseSecurityImage (UseSecurityImage),
KEY RequireLogin (RequireLogin),
- KEY EnableEmailCommunication (EnableEmailCommunication)
+ KEY EnableEmailCommunication (EnableEmailCommunication),
+ KEY ProcessUnmatchedEmails (ProcessUnmatchedEmails)
);
CREATE TABLE Semaphores (
Index: install/upgrades.sql
===================================================================
--- install/upgrades.sql (revision 13789)
+++ install/upgrades.sql (working copy)
@@ -1922,3 +1922,12 @@
UPDATE ConfigurationValues
SET DisplayOrder = DisplayOrder - 0.01
WHERE ModuleOwner = 'In-Portal' AND `Section` = 'in-portal:configure_categories' AND DisplayOrder > 10.07;
+
+# ===== v 5.1.0 =====
+ALTER TABLE Forms
+ ADD ProcessUnmatchedEmails TINYINT NOT NULL DEFAULT '0' AFTER EnableEmailCommunication,
+ ADD INDEX (ProcessUnmatchedEmails);
+
+ALTER TABLE FormSubmissions
+ ADD MessageId VARCHAR(255) NULL DEFAULT NULL AFTER Notes,
+ ADD INDEX (MessageId);
\ No newline at end of file
Index: units/forms/form_submissions/form_submissions_config.php
===================================================================
--- units/forms/form_submissions/form_submissions_config.php (revision 13756)
+++ units/forms/form_submissions/form_submissions_config.php (working copy)
@@ -133,8 +133,20 @@
'LastUpdatedOn' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => NULL),
'Notes' => Array ('type' => 'string', 'default' => NULL),
+ 'MessageId' => Array ('type' => 'string', 'max_len' => 255, 'default' => NULL),
),
- 'VirtualFields' => Array(
+ 'VirtualFields' => Array (
+ 'MergeToSubmission' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (),
+ 'default' => NULL
+ ),
+
+ 'IsMergeToSubmission' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'default' => 0
+ ),
),
'CalculatedFields' => Array(
),
Index: units/forms/form_submissions/form_submissions_eh.php
===================================================================
--- units/forms/form_submissions/form_submissions_eh.php (revision 13756)
+++ units/forms/form_submissions/form_submissions_eh.php (working copy)
@@ -238,6 +238,21 @@
}
/**
+ * Checks, that target submission was selected for merging
+ *
+ * @param kEvent $event
+ */
+ function OnBeforeItemUpdate(&$event)
+ {
+ parent::OnBeforeItemUpdate($event);
+
+ $object =& $event->getObject();
+ /* @var $object kDBItem */
+
+ $object->setRequired('MergeToSubmission', $object->GetDBField('IsMergeToSubmission'));
+ }
+
+ /**
* Passes form_id, when using "Prev"/"Next" toolbar buttons
*
* @param kEvent $event
@@ -265,4 +280,159 @@
$event->SetRedirectParam('pass', 'm,form,formsubs');
}
}
+
+ /**
+ * Fills merge-to dropdown
+ *
+ * @param kEvent $event
+ */
+ function OnAfterItemLoad(&$event)
+ {
+ parent::OnAfterItemLoad($event);
+
+ $object =& $event->getObject();
+ /* @var $object kDBItem */
+
+ $form_id = $object->GetDBField('FormId');
+ $email_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_EMAIL);
+
+ if (!$email_field) {
+ return ;
+ }
+
+ $sql = 'SELECT *
+ FROM ' . $this->Application->getUnitOption($event->Prefix, 'TableName') . '
+ WHERE (FormId = ' . $form_id . ') AND (' . $email_field . ' = ' . $this->Conn->qstr( $object->GetDBField($email_field) ) . ')';
+ $submissions = $this->Conn->Query($sql, 'FormSubmissionId');
+
+ // remove this submission
+ unset($submissions[ $object->GetID() ]);
+
+ if (!$submissions) {
+ return ;
+ }
+
+ $options = Array ();
+
+ $name_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_NAME);
+ $subject_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_SUBJECT);
+
+ $language =& $this->Application->recallObject('lang.current');
+ /* @var $language kDBItem */
+
+ $date_format = $language->GetDBField('DateFormat');
+
+ foreach ($submissions as $submission_id => $submission_data) {
+ $option_title = ''; // SenderName (email@address.com) - Subject (06/29/2010)
+
+ if ($name_field) {
+ $option_title = $submission_data[$name_field] . ' (' . $submission_data[$email_field] . ') - ';
+ }
+ else {
+ $option_title = $submission_data[$email_field] . ' - ';
+ }
+
+ if ($subject_field) {
+ $option_title .= $submission_data[$subject_field] . ' (' . adodb_date($date_format, $submission_data['SubmissionTime']) . ')';
+ }
+ else {
+ $option_title .= adodb_date($date_format, $submission_data['SubmissionTime']);
+ }
+
+ $options[$submission_id] = $option_title;
+ }
+
+ $field_options = $object->GetFieldOptions('MergeToSubmission');
+ $field_options['options'] = $options;
+ $object->SetFieldOptions('MergeToSubmission', $field_options);
+ }
+
+ /**
+ * Returns submission field name based on given role
+ *
+ * @param int $form_id
+ * @param string $role
+ * @return string
+ */
+ function getFieldByRole($form_id, $role)
+ {
+ static $cache = Array ();
+
+ if (!array_key_exists($form_id, $cache)) {
+ $id_field = $this->Application->getUnitOption('formflds', 'IDField');
+ $table_name = $this->Application->getUnitOption('formflds', 'TableName');
+
+ $sql = 'SELECT ' . $id_field . ', EmailCommunicationRole
+ FROM ' . $table_name . '
+ WHERE FormId = ' . $form_id . ' AND EmailCommunicationRole <> 0';
+ $cache[$form_id] = $this->Conn->GetCol($sql, 'EmailCommunicationRole');
+ }
+
+ // get field name by role
+ return array_key_exists($role, $cache[$form_id]) ? 'fld_' . $cache[$form_id][$role] : false;
+ }
+
+ /**
+ * Performs submission merge
+ *
+ * @param kEvent $event
+ */
+ function OnUpdate(&$event)
+ {
+ parent::OnUpdate($event);
+
+ if ($event->status == erSUCCESS) {
+ $object =& $event->getObject();
+ /* @var $object kDBItem */
+
+ $merge_to = $object->GetDBField('MergeToSubmission');
+
+ if (!$merge_to) {
+ return ;
+ }
+
+ $form_id = $object->GetDBField('FormId');
+
+ $sql = 'SELECT *
+ FROM ' . TABLE_PREFIX . 'Forms
+ WHERE FormId = ' . $form_id;
+ $form_info = $this->Conn->GetRow($sql);
+
+ $reply =& $this->Application->recallObject('submission-log.merge', null, Array ('skip_autoload' => true));
+ /* @var $reply kDBItem */
+
+ $email_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_EMAIL);
+ $subject_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_SUBJECT);
+ $body_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_BODY);
+
+ $reply->SetDBField('FormSubmissionId', $merge_to);
+
+ if ($email_field) {
+ $reply->SetDBField('FromEmail', $object->GetDBField($email_field));
+ }
+
+ $reply->SetDBField('ToEmail', $form_info['ReplyFromEmail']);
+
+ if ($subject_field) {
+ $reply->SetDBField('Subject', $object->GetDBField($subject_field));
+ }
+
+ if ($body_field) {
+ $reply->SetDBField('Message', $object->GetDBField($body_field));
+ }
+
+ $reply->SetDBField('SentOn_date', $object->GetDBField('SubmissionTime'));
+ $reply->SetDBField('SentOn_time', $object->GetDBField('SubmissionTime'));
+ $reply->SetDBField('MessageId', $object->GetDBField('MessageId'));
+ $reply->SetDBField('SentStatus', SUBMISSION_LOG_SENT);
+
+ // as if emails was really received via mailbox
+ $this->Application->SetVar('client_mode', 1);
+
+ if ($reply->Create()) {
+ // delete submission, since it was merged
+ $object->Delete();
+ }
+ }
+ }
}
\ No newline at end of file
Index: units/forms/forms/forms_config.php
===================================================================
--- units/forms/forms/forms_config.php (revision 13756)
+++ units/forms/forms/forms_config.php (working copy)
@@ -151,6 +151,11 @@
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
+ 'ProcessUnmatchedEmails' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'not_null' => 1, 'default' => 0
+ ),
'ReplyFromName' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''),
'ReplyFromEmail' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''),
'ReplyCc' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''),
Index: units/forms/forms/forms_eh.php
===================================================================
--- units/forms/forms/forms_eh.php (revision 13756)
+++ units/forms/forms/forms_eh.php (working copy)
@@ -388,6 +388,7 @@
Array (
'recipient_email' => $recipient_email,
'bounce_mode' => $bounce_mode,
+ 'form_info' => $form_info,
)
);
}
@@ -459,6 +460,63 @@
if (!preg_match('/^(.*) #verify(.*)$/', $fields_hash['Subject'], $regs)) {
// incorrect subject, no verification code
+ $form_info = $params['form_info'];
+
+ if ($form_info['ProcessUnmatchedEmails']) {
+ // it's requested to convert unmatched emails to new submissions
+ $form_id = $form_info['FormId'];
+ $this->Application->SetVar('form_id', $form_id);
+
+ $sql = 'SELECT ' . $this->Application->getUnitOption('formsubs', 'IDField') . '
+ FROM ' . $this->Application->getUnitOption('formsubs', 'TableName') . '
+ WHERE MessageId = ' . $this->Conn->qstr($fields_hash['MessageId']);
+ $found = $this->Conn->GetOne($sql);
+
+ if ($found) {
+ // don't process same message twice
+ return false;
+ }
+
+ $sql = 'SELECT *
+ FROM ' . TABLE_PREFIX . 'FormFields
+ WHERE (FormId = ' . $form_info['FormId'] . ') AND (EmailCommunicationRole > 0)';
+ $form_fields = $this->Conn->Query($sql, 'EmailCommunicationRole');
+
+ // what roles are filled from what fields
+ $role_mapping = Array (
+ EMAIL_COMMUNICATION_ROLE_EMAIL => 'FromEmail',
+ EMAIL_COMMUNICATION_ROLE_NAME => 'FromName',
+ EMAIL_COMMUNICATION_ROLE_SUBJECT => 'Subject',
+ EMAIL_COMMUNICATION_ROLE_BODY => 'Message',
+ );
+
+ $submission_fields = Array ();
+
+ foreach ($role_mapping as $role => $email_field) {
+ if (array_key_exists($role, $form_fields)) {
+ $submission_fields[ 'fld_' . $form_fields[$role]['FormFieldId'] ] = $fields_hash[$email_field];
+ }
+ }
+
+ if ($submission_fields) {
+ // remove object, because it's linked to single form upon creation forever
+ $this->Application->removeObject('formsubs.-item');
+
+ $form_submission =& $this->Application->recallObject('formsubs.-item', null, Array ('skip_autoload' => true));
+ /* @var $form_submission kDBItem */
+
+ // in case that other non-role mapped fields are required
+ $form_submission->IgnoreValidation = true;
+ $form_submission->SetDBFieldsFromHash($submission_fields);
+ $form_submission->SetDBField('FormId', $form_id);
+ $form_submission->SetDBField('MessageId', $fields_hash['MessageId']);
+ $form_submission->SetDBField('SubmissionTime_date', adodb_mktime());
+ $form_submission->SetDBField('SubmissionTime_time', adodb_mktime());
+
+ return $form_submission->Create();
+ }
+ }
+
return false;
}
Index: units/forms/submission_log/submission_log_eh.php
===================================================================
--- units/forms/submission_log/submission_log_eh.php (revision 13756)
+++ units/forms/submission_log/submission_log_eh.php (working copy)
@@ -486,7 +486,7 @@
$now = adodb_mktime();
$sent_status = $object->GetDBField('SentStatus');
- if (($sent_status == SUBMISSION_LOG_SENT) && ($sent_status != $object->GetOriginalField('SentStatus'))) {
+ if (($event->Special != 'merge') && ($sent_status == SUBMISSION_LOG_SENT) && ($sent_status != $object->GetOriginalField('SentStatus'))) {
// sent status was set
$object->SetDBField('SentOn_date', $now);
$object->SetDBField('SentOn_time', $now);
unmatched_email_to_form_submissions_v2.patch [^] (21,871 bytes) 2010-07-11 06:53
[Show Content]
Index: admin_templates/forms/form_edit_emails.tpl
===================================================================
--- admin_templates/forms/form_edit_emails.tpl (revision 13756)
+++ admin_templates/forms/form_edit_emails.tpl (working copy)
@@ -60,6 +60,7 @@
<table class="edit-form">
<inp2:m_RenderElement name="subsection" title="la_title_General"/>
<inp2:m_RenderElement name="inp_edit_checkbox" prefix="form" field="EnableEmailCommunication" title="la_fld_Enable" onclick="reflectFromFields();"/>
+ <inp2:m_RenderElement name="inp_edit_checkbox" prefix="form" field="ProcessUnmatchedEmails" title="la_fld_ProcessUnmatchedEmails"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="form" field="ReplyFromName" title="la_fld_ReplyFromName"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="form" field="ReplyCc" title="la_fld_ReplyCc"/>
<inp2:m_RenderElement name="inp_edit_box" prefix="form" field="ReplyBcc" title="la_fld_ReplyBcc"/>
@@ -97,6 +98,8 @@
for (var $i = 0; $i < $fields.length; $i++) {
get_control($field_mask, $fields[$i]).disabled = !$enabled;
}
+
+ get_control($field_mask, 'ProcessUnmatchedEmails', undefined, '_cb').disabled = !$enabled;
}
reflectFromFields();
Index: admin_templates/submissions/submission_view.tpl
===================================================================
--- admin_templates/submissions/submission_view.tpl (revision 13756)
+++ admin_templates/submissions/submission_view.tpl (working copy)
@@ -109,6 +109,23 @@
<inp2:SubmissionTag tag="PredefinedOptions" field="$field" block="form_radio_item" selected="checked"/>
</inp2:m_DefineElement>
+<inp2:m_DefineElement name="inp_edit_merge_to" caption_render_as="default_field_caption_element" is_last="" field_class="" onchange="" hint_label="" onclick="">
+ <inp2:m_if check="{$prefix}_FieldVisible" field="$field">
+ <tr class="<inp2:m_odd_even odd='edit-form-odd' even='edit-form-even'/>" id="<inp2:$prefix_InputName field='$field'/>_row">
+ <inp2:m_RenderElement name="inp_edit_field_caption" caption_render_as="$caption_render_as" prefix="$prefix" field="$field" title="$title" hint_label="$hint_label" is_last="$is_last" NamePrefix="_cb_"/>
+ <td class="control-cell">
+ <input type="hidden" id="<inp2:{$prefix}_InputName field='Is{$field}'/>" name="<inp2:{$prefix}_InputName field='Is{$field}'/>" value="<inp2:{$prefix}_Field field='Is{$field}' db='db'/>">
+ <input tabindex="<inp2:m_get param='tab_index'/>" type="checkbox" id="_cb_<inp2:{$prefix}_InputName field='Is{$field}'/>" name="_cb_<inp2:{$prefix}_InputName field='Is{$field}'/>" <inp2:{$prefix}_Field field="Is{$field}" checked="checked" db="db"/> class="<inp2:m_param name='field_class'/>" onchange="update_checkbox(this, document.getElementById('<inp2:{$prefix}_InputName field='Is{$field}'/>'));<inp2:m_param name='onchange'/>" onclick="<inp2:m_param name='onclick'/>">
+
+ <select tabindex="<inp2:m_get param='tab_index'/>" name="<inp2:{$prefix}_InputName field='$field'/>" id="<inp2:{$prefix}_InputName field='$field'/>" onchange="<inp2:m_Param name='onchange'/>" style="width: 400px;">
+ <inp2:{$prefix}_PredefinedOptions field="$field" block="inp_option_item" selected="selected" has_empty="1"/>
+ </select>
+ </td>
+ <inp2:m_RenderElement name="inp_edit_error" pass_params="1"/>
+ </tr>
+ </inp2:m_if>
+</inp2:m_DefineElement>
+
<inp2:formsubs_SaveWarning name="grid_save_warning"/>
<inp2:formsubs_ErrorWarning name="form_error_warning"/>
@@ -130,6 +147,11 @@
<inp2:m_RenderElement name="inp_label" prefix="formsubs" field="LastUpdatedOn" title="la_fld_LastUpdatedOn" />
</inp2:m_if>
+ <inp2:m_if check="form_Field" name="EnableEmailCommunication" db="db">
+ <inp2:m_ifnot check="submission-log_TotalRecords">
+ <inp2:m_RenderElement name="inp_edit_merge_to" prefix="formsubs" field="MergeToSubmission" title="la_fld_MergeToSubmission"/>
+ </inp2:m_ifnot>
+ </inp2:m_if>
<inp2:m_RenderElement name="subsection" title="la_section_Data"/>
<inp2:m_DefineElement name="form_field" prefix="formsubs">
@@ -163,4 +185,35 @@
</table>
</div>
+<inp2:m_ifnot check="submission-log_TotalRecords">
+ <script language="javascript" type="text/javascript">
+ var $field_mask = '<inp2:formsubs_InputName name="#FIELD_NAME#" js_escape="1"/>';
+
+ $(document).ready(
+ function () {
+ processMergeToSubmission();
+ $( get_control($field_mask, 'IsMergeToSubmission', undefined, '_cb') ).click(processMergeToSubmission);
+ }
+ );
+
+ function processMergeToSubmission() {
+ var $do_merge = get_control($field_mask, 'IsMergeToSubmission', undefined, '_cb').checked;
+ var $merge_to_submission = get_control($field_mask, 'MergeToSubmission');
+
+ if (!$do_merge) {
+ $merge_to_submission.selectedIndex = 0;
+ }
+
+ $merge_to_submission.disabled = !$do_merge;
+
+ if ($do_merge) {
+ $('#merge_submission').removeClass('button-disabled').addClass('button').attr('disabled', '');
+ }
+ else {
+ $('#merge_submission').removeClass('button').addClass('button-disabled').attr('disabled', 'disabled');
+ }
+ }
+ </script>
+</inp2:m_ifnot>
+
<inp2:m_include t="incs/footer"/>
\ No newline at end of file
Index: install/english.lang
===================================================================
--- install/english.lang (revision 13816)
+++ install/english.lang (working copy)
@@ -520,6 +520,7 @@
<PHRASE Label="la_fld_MaxCategories" Module="Core" Type="1">TWF4aW11bSBudW1iZXIgb2YgU2VjdGlvbnMgb24gSXRlbSBjYW4gYmUgYWRkZWQgdG8=</PHRASE>
<PHRASE Label="la_fld_MenuIcon" Module="Core" Type="1">Q3VzdG9tIE1lbnUgSWNvbiAoaWUuIGltZy9tZW51X3Byb2R1Y3RzLmdpZik=</PHRASE>
<PHRASE Label="la_fld_MenuStatus" Module="Core" Type="1">TWVudSBTdGF0dXM=</PHRASE>
+ <PHRASE Label="la_fld_MergeToSubmission" Module="Core" Type="1">TWVyZ2UgdG8gU3VibWlzc2lvbg==</PHRASE>
<PHRASE Label="la_fld_Message" Module="Core" Type="1">TWVzc2FnZQ==</PHRASE>
<PHRASE Label="la_fld_MessageBody" Module="Core" Type="1">TWVzc2FnZSBCb2R5</PHRASE>
<PHRASE Label="la_fld_MessageText" Module="Core" Type="1">UGxhaW4gVGV4dCBWZXJzaW9u</PHRASE>
@@ -566,6 +567,7 @@
<PHRASE Label="la_fld_PrimaryLang" Module="Core" Type="1">UHJpbWFyeQ==</PHRASE>
<PHRASE Label="la_fld_PrimaryTranslation" Module="Core" Type="1">UHJpbWFyeSBMYW5ndWFnZSBQaHJhc2U=</PHRASE>
<PHRASE Label="la_fld_Priority" Module="Core" Type="1">T3JkZXI=</PHRASE>
+ <PHRASE Label="la_fld_ProcessUnmatchedEmails" Module="Core" Type="1">Q29udmVydCB1bm1hdGNoZWQgZS1tYWlscyBpbnRvIG5ldyBzdWJtaXNzaW9ucw==</PHRASE>
<PHRASE Label="la_fld_Qty" Module="Core" Type="1">UXVhbnRpdHk=</PHRASE>
<PHRASE Label="la_fld_Rating" Module="Core" Type="1">UmF0aW5n</PHRASE>
<PHRASE Label="la_fld_RecipientAddress" Module="Core" Type="1">UmVjaXBpZW50J3MgQWRkcmVzcw==</PHRASE>
Index: install/install_schema.sql
===================================================================
--- install/install_schema.sql (revision 13780)
+++ install/install_schema.sql (working copy)
@@ -1105,11 +1105,13 @@
LogStatus tinyint(3) unsigned NOT NULL DEFAULT '2',
LastUpdatedOn int(10) unsigned DEFAULT NULL,
Notes text,
+ MessageId varchar(255) DEFAULT NULL,
PRIMARY KEY (FormSubmissionId),
KEY FormId (FormId),
KEY SubmissionTime (SubmissionTime),
KEY LogStatus (LogStatus),
- KEY LastUpdatedOn (LastUpdatedOn)
+ KEY LastUpdatedOn (LastUpdatedOn),
+ KEY MessageId (MessageId)
);
CREATE TABLE SubmissionLog (
@@ -1162,6 +1164,7 @@
RequireLogin tinyint(4) NOT NULL DEFAULT '0',
UseSecurityImage tinyint(4) NOT NULL DEFAULT '0',
EnableEmailCommunication tinyint(4) NOT NULL DEFAULT '0',
+ ProcessUnmatchedEmails tinyint(4) NOT NULL DEFAULT '0',
ReplyFromName varchar(255) NOT NULL DEFAULT '',
ReplyFromEmail varchar(255) NOT NULL DEFAULT '',
ReplyCc varchar(255) NOT NULL DEFAULT '',
@@ -1179,7 +1182,8 @@
PRIMARY KEY (FormId),
KEY UseSecurityImage (UseSecurityImage),
KEY RequireLogin (RequireLogin),
- KEY EnableEmailCommunication (EnableEmailCommunication)
+ KEY EnableEmailCommunication (EnableEmailCommunication),
+ KEY ProcessUnmatchedEmails (ProcessUnmatchedEmails)
);
CREATE TABLE Semaphores (
Index: install/upgrades.php
===================================================================
--- install/upgrades.php (revision 13780)
+++ install/upgrades.php (working copy)
@@ -1682,4 +1682,20 @@
$this->Conn->Query('ALTER TABLE ' . TABLE_PREFIX . 'Events DROP FromUserId');
}
+
+ /**
+ * Update to 5.1.0; Fixes refferer of form submissions
+ *
+ * @param string $mode when called mode {before, after)
+ */
+ function Upgrade_5_1_0($mode)
+ {
+ if ($mode == 'after') {
+ $base_url = $this->Application->BaseURL();
+
+ $sql = 'UPDATE ' . TABLE_PREFIX . 'FormSubmissions
+ SET ReferrerURL = REPLACE(ReferrerURL, ' . $this->Conn->qstr($base_url) . ', "/")';
+ $this->Conn->Query($sql);
+ }
+ }
}
\ No newline at end of file
Index: install/upgrades.sql
===================================================================
--- install/upgrades.sql (revision 13816)
+++ install/upgrades.sql (working copy)
@@ -1929,3 +1929,11 @@
UPDATE Events
SET MessageType = 'text'
WHERE Event = 'FORM.SUBMISSION.REPLY.TO.USER';
+
+ALTER TABLE Forms
+ ADD ProcessUnmatchedEmails TINYINT NOT NULL DEFAULT '0' AFTER EnableEmailCommunication,
+ ADD INDEX (ProcessUnmatchedEmails);
+
+ALTER TABLE FormSubmissions
+ ADD MessageId VARCHAR(255) NULL DEFAULT NULL AFTER Notes,
+ ADD INDEX (MessageId);
\ No newline at end of file
Index: units/forms/form_submissions/form_submissions_config.php
===================================================================
--- units/forms/form_submissions/form_submissions_config.php (revision 13756)
+++ units/forms/form_submissions/form_submissions_config.php (working copy)
@@ -133,8 +133,20 @@
'LastUpdatedOn' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => NULL),
'Notes' => Array ('type' => 'string', 'default' => NULL),
+ 'MessageId' => Array ('type' => 'string', 'max_len' => 255, 'default' => NULL),
),
- 'VirtualFields' => Array(
+ 'VirtualFields' => Array (
+ 'MergeToSubmission' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (),
+ 'default' => NULL
+ ),
+
+ 'IsMergeToSubmission' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'default' => 0
+ ),
),
'CalculatedFields' => Array(
),
Index: units/forms/form_submissions/form_submissions_eh.php
===================================================================
--- units/forms/form_submissions/form_submissions_eh.php (revision 13756)
+++ units/forms/form_submissions/form_submissions_eh.php (working copy)
@@ -221,8 +221,14 @@
/* @var $object kDBItem */
$object->SetDBField('IPAddress', $_SERVER['REMOTE_ADDR']);
- $object->SetDBField('ReferrerURL', $_SERVER['HTTP_REFERER']);
+ if ( !$object->GetDBField('ReferrerURL') ) {
+ $base_url = preg_quote($this->Application->BaseURL(), '/');
+ $referrer = preg_replace('/^' . $base_url . '/', '/', $_SERVER['HTTP_REFERER'], 1);
+
+ $object->SetDBField('ReferrerURL', $referrer);
+ }
+
$form_submission_helper =& $this->Application->recallObject('FormSubmissionHelper');
/* @var $form_submission_helper FormSubmissionHelper */
@@ -238,6 +244,21 @@
}
/**
+ * Checks, that target submission was selected for merging
+ *
+ * @param kEvent $event
+ */
+ function OnBeforeItemUpdate(&$event)
+ {
+ parent::OnBeforeItemUpdate($event);
+
+ $object =& $event->getObject();
+ /* @var $object kDBItem */
+
+ $object->setRequired('MergeToSubmission', $object->GetDBField('IsMergeToSubmission'));
+ }
+
+ /**
* Passes form_id, when using "Prev"/"Next" toolbar buttons
*
* @param kEvent $event
@@ -265,4 +286,165 @@
$event->SetRedirectParam('pass', 'm,form,formsubs');
}
}
+
+ /**
+ * Fills merge-to dropdown
+ *
+ * @param kEvent $event
+ */
+ function OnAfterItemLoad(&$event)
+ {
+ parent::OnAfterItemLoad($event);
+
+ if ($event->Special == 'merge-to') {
+ return ;
+ }
+
+ $object =& $event->getObject();
+ /* @var $object kDBItem */
+
+ $form_id = $object->GetDBField('FormId');
+ $email_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_EMAIL);
+
+ if (!$email_field) {
+ return ;
+ }
+
+ $merge_to =& $this->Application->recallObject($event->Prefix . '.merge-to', null, Array ('skip_autoload' => true));
+ /* @var $merge_to kDBItem */
+
+ $sql = $merge_to->GetSelectSQL() . ' WHERE (FormId = ' . $form_id . ') AND (' . $email_field . ' = ' . $this->Conn->qstr( $object->GetDBField($email_field) ) . ')';
+ $submissions = $this->Conn->Query($sql, $object->IDField);
+
+ // remove this submission
+ unset($submissions[ $object->GetID() ]);
+
+ if (!$submissions) {
+ return ;
+ }
+
+ $options = Array ();
+
+ $name_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_NAME);
+ $subject_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_SUBJECT);
+
+ $language =& $this->Application->recallObject('lang.current');
+ /* @var $language kDBItem */
+
+ $date_format = $language->GetDBField('DateFormat');
+
+ foreach ($submissions as $submission_id => $submission_data) {
+ $option_title = ''; // SenderName (email@address.com) - Subject (06/29/2010)
+ $merge_to->LoadFromHash($submission_data);
+
+ if ($name_field) {
+ $option_title = $merge_to->GetDBField($name_field) . ' (' . $merge_to->GetDBField($email_field) . ') - ';
+ }
+ else {
+ $option_title = $merge_to->GetDBField($email_field) . ' - ';
+ }
+
+ if ($subject_field) {
+ $option_title .= $merge_to->GetField($subject_field) . ' (' . $merge_to->GetField('SubmissionTime', $date_format) . ')';
+ }
+ else {
+ $option_title .= $merge_to->GetField('SubmissionTime', $date_format);
+ }
+
+ $options[$submission_id] = $option_title;
+ }
+
+ $field_options = $object->GetFieldOptions('MergeToSubmission');
+ $field_options['options'] = $options;
+ $object->SetFieldOptions('MergeToSubmission', $field_options);
+ }
+
+ /**
+ * Returns submission field name based on given role
+ *
+ * @param int $form_id
+ * @param string $role
+ * @return string
+ */
+ function getFieldByRole($form_id, $role)
+ {
+ static $cache = Array ();
+
+ if (!array_key_exists($form_id, $cache)) {
+ $id_field = $this->Application->getUnitOption('formflds', 'IDField');
+ $table_name = $this->Application->getUnitOption('formflds', 'TableName');
+
+ $sql = 'SELECT ' . $id_field . ', EmailCommunicationRole
+ FROM ' . $table_name . '
+ WHERE FormId = ' . $form_id . ' AND EmailCommunicationRole <> 0';
+ $cache[$form_id] = $this->Conn->GetCol($sql, 'EmailCommunicationRole');
+ }
+
+ // get field name by role
+ return array_key_exists($role, $cache[$form_id]) ? 'fld_' . $cache[$form_id][$role] : false;
+ }
+
+ /**
+ * Performs submission merge
+ *
+ * @param kEvent $event
+ */
+ function OnUpdate(&$event)
+ {
+ parent::OnUpdate($event);
+
+ if ($event->status == erSUCCESS) {
+ $object =& $event->getObject();
+ /* @var $object kDBItem */
+
+ $merge_to = $object->GetDBField('MergeToSubmission');
+
+ if (!$merge_to) {
+ return ;
+ }
+
+ $form_id = $object->GetDBField('FormId');
+
+ $sql = 'SELECT *
+ FROM ' . TABLE_PREFIX . 'Forms
+ WHERE FormId = ' . $form_id;
+ $form_info = $this->Conn->GetRow($sql);
+
+ $reply =& $this->Application->recallObject('submission-log.merge', null, Array ('skip_autoload' => true));
+ /* @var $reply kDBItem */
+
+ $email_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_EMAIL);
+ $subject_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_SUBJECT);
+ $body_field = $this->getFieldByRole($form_id, EMAIL_COMMUNICATION_ROLE_BODY);
+
+ $reply->SetDBField('FormSubmissionId', $merge_to);
+
+ if ($email_field) {
+ $reply->SetDBField('FromEmail', $object->GetDBField($email_field));
+ }
+
+ $reply->SetDBField('ToEmail', $form_info['ReplyFromEmail']);
+
+ if ($subject_field) {
+ $reply->SetDBField('Subject', $object->GetDBField($subject_field));
+ }
+
+ if ($body_field) {
+ $reply->SetDBField('Message', $object->GetDBField($body_field));
+ }
+
+ $reply->SetDBField('SentOn_date', $object->GetDBField('SubmissionTime'));
+ $reply->SetDBField('SentOn_time', $object->GetDBField('SubmissionTime'));
+ $reply->SetDBField('MessageId', $object->GetDBField('MessageId'));
+ $reply->SetDBField('SentStatus', SUBMISSION_LOG_SENT);
+
+ // as if emails was really received via mailbox
+ $this->Application->SetVar('client_mode', 1);
+
+ if ($reply->Create()) {
+ // delete submission, since it was merged
+ $object->Delete();
+ }
+ }
+ }
}
\ No newline at end of file
Index: units/forms/forms/forms_config.php
===================================================================
--- units/forms/forms/forms_config.php (revision 13756)
+++ units/forms/forms/forms_config.php (working copy)
@@ -151,6 +151,11 @@
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
+ 'ProcessUnmatchedEmails' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'not_null' => 1, 'default' => 0
+ ),
'ReplyFromName' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''),
'ReplyFromEmail' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''),
'ReplyCc' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''),
Index: units/forms/forms/forms_eh.php
===================================================================
--- units/forms/forms/forms_eh.php (revision 13756)
+++ units/forms/forms/forms_eh.php (working copy)
@@ -388,6 +388,7 @@
Array (
'recipient_email' => $recipient_email,
'bounce_mode' => $bounce_mode,
+ 'form_info' => $form_info,
)
);
}
@@ -459,6 +460,63 @@
if (!preg_match('/^(.*) #verify(.*)$/', $fields_hash['Subject'], $regs)) {
// incorrect subject, no verification code
+ $form_info = $params['form_info'];
+
+ if ($form_info['ProcessUnmatchedEmails'] && ($fields_hash['FromEmail'] != $params['recipient_email'])) {
+ // it's requested to convert unmatched emails to new submissions
+ $form_id = $form_info['FormId'];
+ $this->Application->SetVar('form_id', $form_id);
+
+ $sql = 'SELECT ' . $this->Application->getUnitOption('formsubs', 'IDField') . '
+ FROM ' . $this->Application->getUnitOption('formsubs', 'TableName') . '
+ WHERE MessageId = ' . $this->Conn->qstr($fields_hash['MessageId']);
+ $found = $this->Conn->GetOne($sql);
+
+ if ($found) {
+ // don't process same message twice
+ return false;
+ }
+
+ $sql = 'SELECT *
+ FROM ' . TABLE_PREFIX . 'FormFields
+ WHERE (FormId = ' . $form_info['FormId'] . ') AND (EmailCommunicationRole > 0)';
+ $form_fields = $this->Conn->Query($sql, 'EmailCommunicationRole');
+
+ // what roles are filled from what fields
+ $role_mapping = Array (
+ EMAIL_COMMUNICATION_ROLE_EMAIL => 'FromEmail',
+ EMAIL_COMMUNICATION_ROLE_NAME => 'FromName',
+ EMAIL_COMMUNICATION_ROLE_SUBJECT => 'Subject',
+ EMAIL_COMMUNICATION_ROLE_BODY => 'Message',
+ );
+
+ $submission_fields = Array ();
+
+ foreach ($role_mapping as $role => $email_field) {
+ if (array_key_exists($role, $form_fields)) {
+ $submission_fields[ 'fld_' . $form_fields[$role]['FormFieldId'] ] = $fields_hash[$email_field];
+ }
+ }
+
+ if ($submission_fields) {
+ // remove object, because it's linked to single form upon creation forever
+ $this->Application->removeObject('formsubs.-item');
+
+ $form_submission =& $this->Application->recallObject('formsubs.-item', null, Array ('skip_autoload' => true));
+ /* @var $form_submission kDBItem */
+
+ // in case that other non-role mapped fields are required
+ $form_submission->IgnoreValidation = true;
+ $form_submission->SetDBFieldsFromHash($submission_fields);
+ $form_submission->SetDBField('FormId', $form_id);
+ $form_submission->SetDBField('MessageId', $fields_hash['MessageId']);
+ $form_submission->SetDBField('SubmissionTime_date', adodb_mktime());
+ $form_submission->SetDBField('SubmissionTime_time', adodb_mktime());
+ $form_submission->SetDBField('ReferrerURL', $this->Application->Phrase('la_Text_Email'));
+ return $form_submission->Create();
+ }
+ }
+
return false;
}
Index: units/forms/submission_log/submission_log_eh.php
===================================================================
--- units/forms/submission_log/submission_log_eh.php (revision 13816)
+++ units/forms/submission_log/submission_log_eh.php (working copy)
@@ -486,7 +486,7 @@
$now = adodb_mktime();
$sent_status = $object->GetDBField('SentStatus');
- if (($sent_status == SUBMISSION_LOG_SENT) && ($sent_status != $object->GetOriginalField('SentStatus'))) {
+ if (($event->Special != 'merge') && ($sent_status == SUBMISSION_LOG_SENT) && ($sent_status != $object->GetOriginalField('SentStatus'))) {
// sent status was set
$object->SetDBField('SentOn_date', $now);
$object->SetDBField('SentOn_time', $now);
|