/// <summary> /// Sets the current combination as default /// </summary> protected void btnUseCombination_Click(object sender, EventArgs e) { if ((DocumentContext.CurrentPageInfo != null)) { // Keep current page template instance PageInfo pi = DocumentContext.CurrentPageInfo; // Get combination from cookies string combinationName = CookieHelper.GetValue(cookieTestName); // Get the page template id int templateId = GetPageTemplateId(pi); // Get combination info MVTCombinationInfo currentCombination = MVTCombinationInfoProvider.GetMVTCombinationInfo(templateId, combinationName); // Get default combination info MVTCombinationInfo defaultCombination = MVTCombinationInfoProvider.GetDefaultCombinationInfo(templateId); // Check whether default and current combination exists if ((currentCombination != null) && (defaultCombination != null)) { // Do not save default combination if (currentCombination.MVTCombinationID != defaultCombination.MVTCombinationID) { // Copy the combination custom name defaultCombination.MVTCombinationCustomName = currentCombination.MVTCombinationCustomName; defaultCombination.Update(); // Tree provider instance TreeProvider tp = new TreeProvider(currentUser); // Documents - use the Preview view mode to ensure that only chosen variant will be rendered (Design mode renders all web part/zone variants and does not combine the instance with the variants) PageTemplateInstance instance = MVTestInfoProvider.CombineWithMVT(pi, pi.UsedPageTemplateInfo.TemplateInstance, currentCombination.MVTCombinationID, ViewModeEnum.Preview); CMSPortalManager.SaveTemplateChanges(pi, instance, WidgetZoneTypeEnum.None, ViewModeEnum.Design, tp); // Widgets - use the Preview view mode to ensure that only chosen variant will be rendered (Edit mode renders all widget variants and does not combine the instance with the variants) instance = MVTestInfoProvider.CombineWithMVT(pi, pi.DocumentTemplateInstance, currentCombination.MVTCombinationID, ViewModeEnum.Preview); CMSPortalManager.SaveTemplateChanges(pi, instance, WidgetZoneTypeEnum.Editor, ViewModeEnum.Edit, tp); } // Remove all variants var variants = MVTVariantInfoProvider.GetMVTVariants().WhereEquals("MVTVariantPageTemplateID", templateId); foreach (MVTVariantInfo info in variants) { MVTVariantInfoProvider.DeleteMVTVariantInfo(info); } // Clear cached template info pi.UsedPageTemplateInfo.Update(); // Redirect to the same page to update the current view URLHelper.Redirect(RequestContext.CurrentURL); } } }
/// <summary> /// Sets the current combination as default /// </summary> void btnUseCombination_Click(object sender, EventArgs e) { if ((CMSContext.CurrentPageInfo != null)) { // Keep current page template insatnce PageInfo pi = CMSContext.CurrentPageInfo; // Set the selected combination (from cookie by default) MVTestInfo mvTestInfo = MVTestInfoProvider.GetRunningTest(CMSContext.CurrentAliasPath, CMSContext.CurrentSiteID, CMSContext.CurrentDocumentCulture.CultureCode); // Get combination from cookies string combinationName = CookieHelper.GetValue(cookieTestName); // Get combination info MVTCombinationInfo currentCombination = MVTCombinationInfoProvider.GetMVTCombinationInfo(pi.DocumentPageTemplateID, combinationName); // Get default combination info MVTCombinationInfo defaultCombination = MVTCombinationInfoProvider.GetDefaultCombinationInfo(pi.DocumentPageTemplateID); // Check whether default and current combination exists if ((currentCombination != null) && (defaultCombination != null)) { // Do not save default combination if (currentCombination.MVTCombinationID != defaultCombination.MVTCombinationID) { // Copy the combination custom name defaultCombination.MVTCombinationCustomName = currentCombination.MVTCombinationCustomName; defaultCombination.Update(); // Tree provider instance TreeProvider tp = new TreeProvider(currentUser); // Documents - use the Preview view mode to ensure that only chosen variant will be rendered (Design mode renders all web part/zone variants and does not combine the instance with the variants) PageTemplateInstance instance = MVTestInfoProvider.CombineWithMVT(pi, pi.PageTemplateInfo.TemplateInstance, currentCombination.MVTCombinationID, ViewModeEnum.Preview); CMSPortalManager.SaveTemplateChanges(pi, pi.PageTemplateInfo, instance, WidgetZoneTypeEnum.None, ViewModeEnum.Design, tp); // Widgets - use the Preview view mode to ensure that only chosen variant will be rendered (Edit mode renders all widget variants and does not combine the instance with the variants) instance = MVTestInfoProvider.CombineWithMVT(pi, pi.DocumentTemplateInstance, currentCombination.MVTCombinationID, ViewModeEnum.Preview); CMSPortalManager.SaveTemplateChanges(pi, pi.PageTemplateInfo, instance, WidgetZoneTypeEnum.Editor, ViewModeEnum.Edit, tp); } // Remove all variants InfoDataSet <MVTVariantInfo> variants = MVTVariantInfoProvider.GetMVTVariants("MVTVariantPageTemplateID = " + pi.DocumentPageTemplateID, null); if (!DataHelper.DataSourceIsEmpty(variants)) { foreach (MVTVariantInfo info in variants) { MVTVariantInfoProvider.DeleteMVTVariantInfo(info); } } // Clear cached template info pi.PageTemplateInfo.Update(); // Redirect to the same page to update the current view URLHelper.Redirect(URLHelper.CurrentURL); } } }
/// <summary> /// Handles the PreRender event of the Page control. /// </summary> protected void Page_PreRender(object sender, EventArgs e) { if (stopProcessing) { Visible = false; return; } // Show the warning panel when there is a running MVT test if ((viewMode != ViewModeEnum.Preview) && MVTestInfoProvider.ContainsRunningMVTest(DocumentContext.CurrentAliasPath, SiteContext.CurrentSiteID, DocumentContext.CurrentPageInfo.DocumentCulture)) { plcRunningTestWarning.Visible = true; } if (RequestHelper.IsPostBack()) { // Reload the combination panel because one of the combination could have been removed ReloadData(true); } // Set the OnChange attribute => Save the variant slider configuration into a cookie and raise a postback combinationSelector.DropDownSelect.Attributes.Add("onchange", "SaveCombinationPanelSelection(); " + Page.ClientScript.GetPostBackEventReference(this, "combinationchanged") + "; return false;"); MVTCombinationInfo ci = null; if (DocumentContext.CurrentDocument != null) { int templateId = DocumentContext.CurrentDocument.GetUsedPageTemplateId(); // Get the combination name from cookie string combinationName = CookieHelper.GetValue(cookieTestName); if (string.IsNullOrEmpty(combinationName)) { // CombinationName is not defined, use the default combination for the page template ci = MVTCombinationInfoProvider.GetDefaultCombinationInfo(templateId); } else { // Keep current instance node TreeNode tn = DocumentContext.CurrentDocument; // Use the defined combination ci = MVTCombinationInfoProvider.GetMVTCombinationInfo(tn.NodeAliasPath, combinationName, SiteContext.CurrentSiteName, tn.DocumentCulture); if (ci == null) { // Combination not found (can happen after deleting a variant), use the default combination for the page template ci = MVTCombinationInfoProvider.GetDefaultCombinationInfo(templateId); } } } // Show the combination panel only if there are any combinations for the document pnlMvtCombination.Enabled = combinationSelector.HasData; if (ci != null) { int combinationId = ci.MVTCombinationID; // Setup the combination panel values combinationSelector.DropDownSelect.SelectedValue = ci.MVTCombinationName; chkEnabled.Checked = ci.MVTCombinationEnabled; txtCustomName.Text = ResHelper.LocalizeString(ci.MVTCombinationCustomName, currentUser.PreferredUICultureCode); // Create javascript variables of the combination panel. Used when changing combination by the variation slider/arrows StringBuilder combinationJSList = new StringBuilder(); combinationJSList.Append("var mvtCPselector = document.getElementById('" + combinationSelector.DropDownSelect.ClientID + "');"); combinationJSList.Append("var mvtCPenabled = document.getElementById('" + chkEnabled.ClientID + "');"); combinationJSList.Append("var mvtCPcustomName = document.getElementById('" + txtCustomName.ClientID + "');"); combinationJSList.Append("var mvtCPcurrentCombinationName = document.getElementById('" + hdnCurrentCombination.ClientID + "');"); // Generate the JS configuration array for the Edit and Design view modes only (modes where the variant sliders can be used) if (viewMode.IsOneOf(ViewModeEnum.Edit, ViewModeEnum.EditDisabled) || PortalContext.IsDesignMode(viewMode)) { // Get variants for the selected combination DataSet dsSelectedCombinationVariants = MVTVariantInfoProvider.GetMVTVariants(ci.MVTCombinationPageTemplateID, combinationId); #region "Generate javascript arrays used for changing the selected combination according to the selected variants" // List of compulsory combination variants (used for the combination JS array only). // For example: // Selected combination contains WidgetVariantID3 + ZoneVariantID5 and the user is in the Edit mode. // Therefore compulsory combination variants will be only containing the zone variant ID 5-> that means: only combinations with this compulsory variant will be proceed // This ensures a correct behavior of the combination panel when changing the variant sliders. combinationJSList.Append("var compulsoryCombinationVariants = ["); int compulsoryCombinationVariantsCounter = 0; // Fill the array 'compulsoryCombinationVariants' if (!DataHelper.DataSourceIsEmpty(dsSelectedCombinationVariants)) { // Edit mode if ((viewMode.IsEdit()) || (viewMode == ViewModeEnum.EditDisabled)) { foreach (DataRow row in dsSelectedCombinationVariants.Tables[0].Rows) { // Process web part and zones only if (ValidationHelper.GetInteger(row["MVTVariantDocumentID"], 0) == 0) { if (compulsoryCombinationVariantsCounter > 0) { combinationJSList.Append(","); } // Add the web part/zone to the JS array combinationJSList.Append(ValidationHelper.GetInteger(row["MVTVariantID"], 0)); compulsoryCombinationVariantsCounter++; } } } // Design mode else if (PortalContext.IsDesignMode(viewMode)) { foreach (DataRow row in dsSelectedCombinationVariants.Tables[0].Rows) { // Process widgets only if (ValidationHelper.GetInteger(row["MVTVariantDocumentID"], 0) > 0) { if (compulsoryCombinationVariantsCounter > 0) { combinationJSList.Append(","); } // Add the widget to the JS array combinationJSList.Append(ValidationHelper.GetInteger(row["MVTVariantID"], 0)); compulsoryCombinationVariantsCounter++; } } } } combinationJSList.Append("];"); // combinationsArray - array containing configuration of each combination displayed in the combination panel. // This array is used after the user changes a variant slider and the new combination (selected by the combination panel) is to be calculated. combinationJSList.Append("var combinationsArray = ["); int combinationCount = 0; foreach (ListItem item in combinationSelector.DropDownSelect.Items) { // Get the combination object MVTCombinationInfo cObj = MVTCombinationInfoProvider.GetMVTCombinationInfo(combinationSelector.PageTemplateID, item.Value); if (cObj != null) { DataSet cVariants = MVTVariantInfoProvider.GetMVTVariants(cObj.MVTCombinationPageTemplateID, cObj.MVTCombinationID); if (combinationCount > 0) { combinationJSList.Append(","); } combinationJSList.Append("['"); combinationJSList.Append(cObj.MVTCombinationName); combinationJSList.Append("',"); combinationJSList.Append(cObj.MVTCombinationEnabled.ToString().ToLowerCSafe()); combinationJSList.Append(","); combinationJSList.Append(ScriptHelper.GetString(ResHelper.LocalizeString(cObj.MVTCombinationCustomName, currentUser.PreferredUICultureCode))); // Generate the unique variant IDs code (format: 155_158_180) - must be ordered by variantID combinationJSList.Append(",'"); if (!DataHelper.DataSourceIsEmpty(cVariants)) { int variantCount = 0; foreach (DataRow row in cVariants.Tables[0].Rows) { if (variantCount > 0) { combinationJSList.Append("_"); } combinationJSList.Append(ValidationHelper.GetString(row["MVTVariantID"], "0")); variantCount++; } } combinationJSList.Append("']"); combinationCount++; } } combinationJSList.Append("];"); #endregion // Choose the correct variant from all rendered variants for a current web part (used in Content->Design/Edit page) if (!DataHelper.DataSourceIsEmpty(dsSelectedCombinationVariants)) { combinationJSList.Append("function SetCombinationVariants() {"); bool variantWasSet = false; // Process all the variants of the selected combination foreach (DataRow row in dsSelectedCombinationVariants.Tables[0].Rows) { bool itemIsZoneVariant = string.IsNullOrEmpty(ValidationHelper.GetString(row["MVTVariantInstanceGUID"], string.Empty)); string itemIdentifier; if (itemIsZoneVariant) { // Zone itemIdentifier = "Variant_Zone_" + HTMLHelper.HTMLEncode(ValidationHelper.GetString(row["MVTVariantZoneID"], string.Empty)); } else { // Web part/widget itemIdentifier = "Variant_WP_" + ValidationHelper.GetGuid(row["MVTVariantInstanceGUID"], Guid.Empty).ToString("N"); } // Set the appropriate variant int itemVariantId = ValidationHelper.GetInteger(row["MVTVariantID"], 0); combinationJSList.Append("SetVariant('" + itemIdentifier + "', " + itemVariantId + ");"); variantWasSet = true; } if (variantWasSet) { // Refresh the combination panel if any variant was set manually combinationJSList.Append("UpdateCombinationPanel();"); } combinationJSList.Append("}"); } } // Save the current combination id in javascript combinationJSList.Append("mvtCPcurrentCombinationName.value = '" + ci.MVTCombinationName + "';"); // Register the JS arrays and current variants ScriptHelper.RegisterStartupScript(this, typeof(string), "combinationJSList", ScriptHelper.GetScript(combinationJSList.ToString())); } // Display the "set as result" button when there any MVT variants in the page if ((currentUser != null) && (currentUser.IsAuthorizedPerResource("CMS.Design", "Design"))) { plcUseCombination.Visible = combinationSelector.DropDownSelect.Items.Count > 1; } }
/// <summary> /// Callback event handler. /// </summary> /// <param name="argument">Callback argument</param> public void RaiseCallbackEvent(string argument) { // Check permissions if ((currentUser == null) || (!currentUser.IsAuthorizedPerResource("CMS.MVTest", "Manage")) || stopProcessing) { return; } // Get arguments if (!string.IsNullOrEmpty(argument)) { string[] args = argument.Split(new[] { ';' }, 3); if (args.Length == 3) { string combinationName = ValidationHelper.GetString(args[0], string.Empty); string action = args[1].ToLowerCSafe(); string newValue = args[2]; // Get the combination info MVTCombinationInfo mvtcInfo = MVTCombinationInfoProvider.GetMVTCombinationInfo(combinationSelector.PageTemplateID, combinationName); if (mvtcInfo != null) { switch (action) { case "cname": // Custom name changed mvtcInfo.MVTCombinationCustomName = newValue; if (string.IsNullOrEmpty(newValue)) { newValue = mvtcInfo.MVTCombinationName; } // return the new value (when newValue=="", then return combination code name) callbackValue = newValue; break; case "enabled": // combination Enabled changed mvtcInfo.MVTCombinationEnabledOriginal = mvtcInfo.MVTCombinationEnabled; mvtcInfo.MVTCombinationEnabled = ValidationHelper.GetBoolean(newValue, true); callbackValue = string.Empty; break; default: return; } MVTCombinationInfoProvider.SetMVTCombinationInfo(mvtcInfo); // Synchronize widget variants if enabling combination if ((mvtcInfo.MVTCombinationDocumentID > 0) || (!mvtcInfo.MVTCombinationEnabledOriginal && mvtcInfo.MVTCombinationEnabled )) { // Log synchronization TreeProvider tree = new TreeProvider(currentUser); TreeNode node = tree.SelectSingleDocument(mvtcInfo.MVTCombinationDocumentID); if (node != null) { DocumentSynchronizationHelper.LogDocumentChange(node, TaskTypeEnum.UpdateDocument, tree); } } } } } }