using System; using System.Collections; using System.Security.Principal; using System.Collections.Generic; using System.Text; using CMS.CMSHelper; using CMS.ExtendedControls; using CMS.GlobalHelper; using CMS.Newsletter; using CMS.UIControls; [Title("CMSModules/CMS_Newsletter/importsubscriber.png", "newsletters.importsubscribers", "CMS_Newsletter_ImportSubscribers", HelpName = "helpTopic")] [Security(Resource = "CMS.Newsletter", UIElements = "ImportSubscribers")] public partial class CMSModules_Newsletters_Tools_ImportExportSubscribers_Subscriber_Import : CMSNewsletterPage { #region "Variables and properties" private static Hashtable errors = new Hashtable(); private static Hashtable message = new Hashtable(); /// /// Current log context. /// public LogContext CurrentLog { get { return EnsureLog(); } } /// /// Messages placeholder /// public override MessagesPlaceHolder MessagesPlaceHolder { get { return plcMessages; } } #endregion #region "Methods" protected void Page_Load(object sender, EventArgs e) { // Initialize newsletter selector usNewsletters.WhereCondition = "NewsletterSiteID = " + CMSContext.CurrentSiteID; // Registers script for disabling checkbox radSubscribe.Attributes.Add("onclick", "SelectionChanged()"); radUnsubscribe.Attributes.Add("onclick", "SelectionChanged()"); radDelete.Attributes.Add("onclick", "SelectionChanged()"); string script = "function SelectionChanged() { \n" + " var radSubscribe = document.getElementById('" + radSubscribe.ClientID + "').checked; \n" + " document.getElementById('" + chkDoNotSubscribe.ClientID + "').disabled = !radSubscribe; \n" + "} \n"; ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "DisableCheckbox", ScriptHelper.GetScript(script)); btnCancel.Attributes.Add("onclick", ctlAsync.GetCancelScript(true) + "return false;"); // Initialize events ctlAsync.OnFinished += ctlAsync_OnFinished; ctlAsync.OnError += ctlAsync_OnError; ctlAsync.OnRequestLog += ctlAsync_OnRequestLog; ctlAsync.OnCancel += ctlAsync_OnCancel; if (!RequestHelper.IsCallback()) { pnlContent.Visible = true; pnlLog.Visible = false; } } /// /// Runs async thread. /// /// Method to run protected void RunAsync(AsyncAction action) { pnlLog.Visible = true; CurrentLog.Close(); EnsureLog(); ctlAsync.RunAsync(action, WindowsIdentity.GetCurrent()); } /// /// Handles import button click. /// /// Sender /// Event arguments protected void btnImport_Click(object sender, EventArgs e) { // Check 'Manage subscribers' permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.newsletter", "managesubscribers")) { RedirectToCMSDeskAccessDenied("cms.newsletter", "managesubscribers"); } if (String.IsNullOrEmpty(txtImportSub.Text.Trim())) { ShowError(GetString("Subscriber_Import.nosubscribers")); return; } // Get selected newsletters List newsletterIds = new List(); string values = ValidationHelper.GetString(usNewsletters.Value, null); if (!String.IsNullOrEmpty(values)) { string[] newItems = values.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); if (newItems != null) { foreach (string item in newItems) { newsletterIds.Add(ValidationHelper.GetInteger(item, 0)); } } } // Import subscribers try { if (CMSContext.CurrentSite != null) { int siteId = CMSContext.CurrentSiteID; CurrentLog.Close(); EnsureLog(); errors[ctlAsync.ProcessGUID] = null; // Add subscribers to site and subscribe them to selected newsletters if (radSubscribe.Checked) { ctlAsync.Parameter = new object[] { txtImportSub.Text, newsletterIds, siteId, true, chkSendConfirmation.Checked, chkDoNotSubscribe.Checked, chkRequireOptIn.Checked, ctlAsync.ProcessGUID, errors }; RunAsync(SubscriberInfoProvider.ImportSubscribersToSite); message[ctlAsync.ProcessGUID] = GetString("Subscriber_Import.SubscribersImported"); } // Unsubscribe inserted subscribers from selected newsletters else if (radUnsubscribe.Checked) { if (newsletterIds.Count > 0) { ctlAsync.Parameter = new object[] { txtImportSub.Text, newsletterIds, siteId, chkSendConfirmation.Checked, ctlAsync.ProcessGUID, errors }; RunAsync(SubscriberInfoProvider.UnsubscribeFromNewsletters); message[ctlAsync.ProcessGUID] = GetString("Subscriber_Import.SubscribersUnsubscribed"); } else { ShowError(GetString("ImportSubscribers.NoNewslettersSelected")); } } // Delete inserted subscribers else if (radDelete.Checked) { ctlAsync.Parameter = new object[] { txtImportSub.Text, siteId, ctlAsync.ProcessGUID, errors }; RunAsync(SubscriberInfoProvider.DeleteSubscribers); message[ctlAsync.ProcessGUID] = GetString("Subscriber_Import.SubscribersDeleted"); } } } catch (Exception ex) { ShowError(ex.Message); } } protected LogContext EnsureLog() { LogContext log = LogContext.EnsureLog(ctlAsync.ProcessGUID); log.Reversed = true; log.LineSeparator = "
"; return log; } private void DisplayMessages() { CurrentLog.Close(); TerminateCallbacks(); List listOfErrors = (List)errors[ctlAsync.ProcessGUID] ?? new List(); StringBuilder errorsString = new StringBuilder(); foreach (var singleError in listOfErrors) { errorsString.Append(singleError + "
"); } string htmlError = errorsString.ToString(); if (!String.IsNullOrEmpty(htmlError)) { ShowError(htmlError.Remove(htmlError.Length - 6)); } else { ShowConfirmation((string)message[ctlAsync.ProcessGUID]); } } private void TerminateCallbacks() { string terminatingScript = ScriptHelper.GetScript("var __pendingCallbacks = new Array();"); ScriptHelper.RegisterStartupScript(this, typeof(string), "terminatePendingCallbacks", terminatingScript); } #endregion #region "Handling async thread" private void ctlAsync_OnRequestLog(object sender, EventArgs e) { ctlAsync.Log = CurrentLog.Log; } private void ctlAsync_OnError(object sender, EventArgs e) { DisplayMessages(); } private void ctlAsync_OnFinished(object sender, EventArgs e) { DisplayMessages(); } private void ctlAsync_OnCancel(object sender, EventArgs e) { ctlAsync.Parameter = null; message[ctlAsync.ProcessGUID] = GetString("Subscriber_Import.cancelled"); DisplayMessages(); } #endregion }