using System; using System.Web; using System.Web.UI; using CMS.CMSHelper; using CMS.GlobalHelper; using CMS.PortalEngine; using CMS.DocumentEngine; using CMS.UIControls; public partial class CMSModules_Content_CMSDesk_New_TemplateSelection : CMSUserControl { #region "Variables" private string mUIModuleName = "CMS.Content"; private string mUINewElementName = "New"; private string mUISelectTempalteElementName = "New.SelectTemplate"; #endregion #region "Events" public event EventHandler OnBeforePersonalizationCheck; #endregion #region "Properties" /// /// Returns true if some option is available. /// public bool SomeOptionAvailable { get { return plcRadioButtons.Visible; } } /// /// Document ID for the selection. /// public int DocumentID { get { return templateSelector.DocumentID; } set { templateSelector.DocumentID = value; } } /// /// Parent Node ID. /// public int ParentNodeID { get; set; } /// /// Returns true if the newly created template is empty. /// public bool NewTemplateIsEmpty { get { return radCreateBlank.Checked || radCreateEmpty.Checked; } } /// /// State indicate which selector is currently used /// public int TemplateSelectionState { get; set; } /// /// Indicates whether only templates for product section should be displayed. /// public bool ShowOnlyProductSectionTemplates { set { templateSelector.ShowOnlyProductSectionTemplates = value; } } /// /// Name of the module for UI personalization checks. 'CMS.Content' by default. /// public string UIModuleName { get { return mUIModuleName; } set { mUIModuleName = value; } } /// /// Name of the UI element affecting whole selection of template. Default value is 'New'. /// public string UINewElementName { get { return mUINewElementName; } set { mUINewElementName = value; } } /// /// Name of the UI element affecting 'Select template' section. Default value is 'New.SelectTemplate'. /// public string UISelectTempalteElementName { get { return mUISelectTempalteElementName; } set { mUISelectTempalteElementName = value; } } /// /// Root path /// public int RootCategory { get { return templateSelector.RootCategory; } set { templateSelector.RootCategory = value; } } /// /// If true, the control offers only options valid for wireframe /// public bool IsWireframe { get; set; } /// /// If true, the control offers only options valid for product sections. /// public bool IsProductSection { get; set; } #endregion protected void Page_Load(object sender, EventArgs e) { // Check the first radio button which is visible by default if (!URLHelper.IsPostback()) { if (plcRadioButtons.IsHidden || plcRadioButtonsNew.IsHidden || IsProductSection) { radInherit.Checked = true; } else { if (!plcUseTemplate.IsHidden) { radUseTemplate.Checked = true; } else if (!plcInherit.IsHidden) { radInherit.Checked = true; } else if (!plcCreateBlank.IsHidden) { radCreateBlank.Checked = true; } else if (!plcCreateEmpty.IsHidden) { radCreateEmpty.Checked = true; } } plcRadioButtons.Visible = !plcRadioButtons.IsHidden && !(plcUseTemplate.IsHidden && plcInherit.IsHidden && plcCreateBlank.IsHidden && plcCreateEmpty.IsHidden); if (!SomeOptionAvailable) { RedirectToUINotAvailable(); } } // Check authorization per resource if (!CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.Design", "Design")) { radCreateBlank.Visible = false; radCreateEmpty.Visible = false; layoutSelector.Visible = false; if (plcUseTemplate.IsHidden && plcInherit.IsHidden && !plcCreateBlank.IsHidden) { RedirectToAccessDenied("CMS.Design", "Design"); } } if (IsWireframe) { radCreateBlank.Visible = false; radInherit.Visible = false; } if (IsProductSection) { radCreateBlank.Visible = false; radCreateEmpty.Visible = false; radUseTemplate.Visible = false; radInherit.Enabled = false; } radUseTemplate.CheckedChanged += radOptions_CheckedChanged; radInherit.CheckedChanged += radOptions_CheckedChanged; radCreateBlank.CheckedChanged += radOptions_CheckedChanged; radCreateEmpty.CheckedChanged += radOptions_CheckedChanged; // Disable startup focus functionality templateSelector.UseStartUpFocus = false; LoadControls(); } /// /// Gets the validation script for the selector. /// public string GetValidationScript() { if (!radInherit.Checked && !radCreateEmpty.Checked) { string errorMessage = String.Empty; if (radCreateBlank.Checked) { errorMessage = ScriptHelper.GetString(GetString("NewPage.LayoutError")); } else { errorMessage = ScriptHelper.GetString(GetString("newpage.templateerror")); } return @" if (UniFlat_GetSelectedValue) { value = UniFlat_GetSelectedValue(); value = value.replace(/^\\s+|\\s+$/g, ''); if (value == '') { errorLabel.style.display = ''; errorLabel.innerHTML = " + errorMessage + @"; resizearea(); return false; } }"; } return null; } /// /// Handles setting of propper UI element names and module names for UI personalization. /// protected void OnBeforeUICheck(object sender, EventArgs e) { if (OnBeforePersonalizationCheck != null) { OnBeforePersonalizationCheck(sender, e); } UIPlaceHolder plc = sender as UIPlaceHolder; if (plc != null) { // Set module name plc.ModuleName = UIModuleName; // Set UI element names for placeholders if (plc == plcRadioButtonsNew) { plc.ElementName = UINewElementName; } else if (plc == plcRadioButtons) { plc.ElementName = UISelectTempalteElementName; } } } /// /// Handles radio button change. /// protected void radOptions_CheckedChanged(object sender, EventArgs e) { // Template selector needs to reload its tree if (radUseTemplate.Checked) { templateSelector.ResetToDefault(); // Reload template tree templateSelector.ReloadData(false); // Recalculate the items count templateSelector.RegisterRefreshPageSizeScript(true); // Enable startup focus functionality templateSelector.UseStartUpFocus = true; } else if (radCreateBlank.Checked) { layoutSelector.UniFlatSelector.ResetToDefault(); // Recalculate the items count layoutSelector.RegisterRefreshPageSizeScript(true); // Enable startup focus functionality layoutSelector.UniFlatSelector.UseStartUpFocus = true; } // Start rezise after radio change ScriptHelper.RegisterStartupScript(Page, typeof(string), "ResizeRecount", ScriptHelper.GetScript("resizearea();")); // Update panel pnlUpdate.Update(); } /// /// Returns template name of parent node. /// private string GetParentNodePageTemplate() { TreeProvider tree = new TreeProvider(CMSContext.CurrentUser); TreeNode node = tree.SelectSingleNode(ParentNodeID, CMSContext.PreferredCultureCode, tree.CombineWithDefaultCulture, false); if (node != null) { string colName = node.GetUsedPageTemplateIdColumn(); int templateId = ValidationHelper.GetInteger(node.GetValue(colName), 0); bool inherited = false; // May be inherited template if ((templateId == 0) && (node.NodeParentID > 0)) { // Get inherited page template object currentPageTemplateId = node.GetValue(colName); node.SetValue(colName, DBNull.Value); node.LoadInheritedValues(new string[] { colName }, false); templateId = ValidationHelper.GetInteger(node.GetValue(colName), 0); node.SetValue(colName, currentPageTemplateId); inherited = true; } if (templateId > 0) { PageTemplateInfo pti = PageTemplateInfoProvider.GetPageTemplateInfo(templateId); if (pti != null) { string templateName = pti.DisplayName; if (inherited) { templateName += " (inherited)"; } return templateName; } } } return String.Empty; } /// /// Setups and load control selected by radio buttons. /// private void LoadControls() { if (radUseTemplate.Checked) { ShowTemplateSelector(true); ShowLayoutSelector(false); ShowInherited(false); TemplateSelectionState = 0; } else if (radInherit.Checked) { lblIngerited.Text = GetString("NewPage.InheritedTemplateName").Replace("##TEMPLATENAME##", GetParentNodePageTemplate()); ShowTemplateSelector(false); ShowLayoutSelector(false); ShowInherited(true); TemplateSelectionState = 1; } else if (radCreateBlank.Checked) { ShowTemplateSelector(false); ShowLayoutSelector(true); ShowInherited(false); TemplateSelectionState = 2; } else { lblIngerited.Text = GetString("NewPage.BlankTemplate"); ShowTemplateSelector(false); ShowLayoutSelector(false); ShowInherited(true); TemplateSelectionState = 3; } } /// /// Enables or disables template selector. /// private void ShowTemplateSelector(bool show) { templateSelector.Visible = show; templateSelector.StopProcessing = !show; } /// /// Enables or disables layout selector. /// private void ShowLayoutSelector(bool show) { plcLayout.Visible = show; layoutSelector.StopProcessing = !show; } /// /// Enables or disables inherited label. /// private void ShowInherited(bool show) { plcInherited.Visible = show; } /// /// Sets the default page template ID to the selector /// /// Template ID public void SetDefaultTemplate(int templateId) { templateSelector.SelectedItem = templateId.ToString(); } /// /// Ensures the template from the selection and returns the template ID. /// /// Document name for the ad-hoc template /// Owner node GUID in case of ad-hoc template /// Returns the error message public PageTemplateInfo EnsureTemplate(string documentName, Guid nodeGuid, ref string errorMessage) { bool cloneAsAdHoc = false; bool masterOnly = false; PageTemplateInfo templateInfo = null; // Template selection if (radUseTemplate.Checked) { // Template page int templateId = ValidationHelper.GetInteger(templateSelector.SelectedItem, 0); if (templateId > 0) { // Get the template and check if it should be cloned templateInfo = PageTemplateInfoProvider.GetPageTemplateInfo(templateId); if (templateInfo != null) { cloneAsAdHoc = templateInfo.PageTemplateCloneAsAdHoc || IsWireframe; } } else { errorMessage = GetString("NewPage.TemplateError"); } } else if (radInherit.Checked) { // Inherited page } else if (radCreateBlank.Checked || radCreateEmpty.Checked) { // Create custom template info for the page templateInfo = new PageTemplateInfo(true); if (radCreateBlank.Checked) { // Blank page with layout int layoutId = ValidationHelper.GetInteger(layoutSelector.SelectedItem, 0); if (layoutId > 0) { templateInfo.LayoutID = layoutId; // Copy layout to selected template if (chkLayoutPageTemplate.Checked) { templateInfo.LayoutID = 0; LayoutInfo li = LayoutInfoProvider.GetLayoutInfo(layoutId); if (li != null) { templateInfo.PageTemplateLayout = li.LayoutCode; templateInfo.PageTemplateLayoutType = li.LayoutType; } else { errorMessage = GetString("NewPage.LayoutError"); } } } else { errorMessage = GetString("NewPage.LayoutError"); } } else if (radCreateEmpty.Checked) { // Empty template templateInfo.LayoutID = 0; if (IsWireframe) { templateInfo.PageTemplateLayout = ""; } else { templateInfo.PageTemplateLayout = ""; } templateInfo.PageTemplateLayoutType = LayoutTypeEnum.Ascx; } if (String.IsNullOrEmpty(errorMessage)) { cloneAsAdHoc = true; masterOnly = true; } } if (cloneAsAdHoc) { // Prepare ad-hoc template name string displayName = "Ad-hoc: " + documentName; // Create ad-hoc template templateInfo = PageTemplateInfoProvider.CloneTemplateAsAdHoc(templateInfo, displayName, CMSContext.CurrentSiteID, Guid.Empty); // Set inherit only master if (masterOnly) { templateInfo.InheritPageLevels = "\\"; } PageTemplateInfoProvider.SetPageTemplateInfo(templateInfo); if (CMSContext.CurrentSite != null) { PageTemplateInfoProvider.AddPageTemplateToSite(templateInfo.PageTemplateId, CMSContext.CurrentSiteID); } } // Assign owner node GUID if ((templateInfo != null) && !templateInfo.IsReusable) { templateInfo.PageTemplateNodeGUID = nodeGuid; } // Reload the template selector in case of error if (!String.IsNullOrEmpty(errorMessage)) { if (radUseTemplate.Checked) { templateSelector.ReloadData(); } } return templateInfo; } }