using System;
using System.Data;
using System.Web.UI;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.LicenseProvider;
using CMS.PortalEngine;
using CMS.SettingsProvider;
using CMS.DocumentEngine;
using CMS.UIControls;
using CMS.ExtendedControls;
[RegisterTitle("content.ui.propertiestemplate")]
[Security("CMS.Content", null, "Properties.Template")]
[Security("CMS.Design", "Design", null)]
public partial class CMSModules_Content_CMSDesk_Properties_Template : CMSPropertiesPage
{
#region "Variables & constants"
TreeNode node = null;
protected string mSave = null;
protected string mClone = null;
protected string mEditTemplateProperties = null;
protected CurrentUserInfo currentUser = null;
protected bool hasModifyPermission = false;
protected bool selectorEnabled = true;
protected PageTemplateInfo pti = null;
#endregion
#region "Properties"
///
/// Use document site as current site
///
public override string CurrentSiteName
{
get
{
return (Node != null) ? Node.NodeSiteName : base.CurrentSiteName;
}
set
{
}
}
///
/// Selected template ID
///
public int SelectedTemplateID
{
get
{
return ValidationHelper.GetInteger(hdnSelected.Value, 0);
}
set
{
hdnSelected.Value = value.ToString();
}
}
#endregion
#region "Page methods"
protected override void OnInit(EventArgs e)
{
// Culture independent data
SplitModeAllwaysRefresh = true;
// Non-version data is modified
DocumentManager.UseDocumentHelper = false;
base.OnInit(e);
// Keep current user info
currentUser = CMSContext.CurrentUser;
// Keep node instance
node = Node;
if (node.IsRoot())
{
plcUILevels.Visible = false;
}
// Init document manager events
DocumentManager.OnValidateData += DocumentManager_OnValidateData;
DocumentManager.OnSaveData += DocumentManager_OnSaveData;
DocumentManager.OnAfterAction += DocumentManager_OnAfterAction;
EnableSplitMode = true;
// Register the scripts
ScriptHelper.RegisterProgress(this);
ScriptHelper.RegisterDialogScript(this);
}
protected void Page_Load(object sender, EventArgs e)
{
UIContext.PropertyTab = PropertyTabEnum.Template;
inheritElem.DocumentSettings = true;
// Init the control properties
pnlInherits.GroupingText = GetString("PageProperties.InheritLevels");
pnlActions.GroupingText = GetString("PageProperties.Template");
imgClone.ImageUrl = GetImageUrl("CMSModules/CMS_Content/Template/clone.png");
imgSave.ImageUrl = GetImageUrl("CMSModules/CMS_Content/Template/save.png");
imgEditTemplateProperties.ImageUrl = GetImageUrl("CMSModules/CMS_Content/Template/edit.png");
imgClone.DisabledImageUrl = GetImageUrl("CMSModules/CMS_Content/Template/clonedisabled.png");
imgSave.DisabledImageUrl = GetImageUrl("CMSModules/CMS_Content/Template/savedisabled.png");
imgEditTemplateProperties.DisabledImageUrl = GetImageUrl("CMSModules/CMS_Content/Template/editdisabled.png");
// Keep information whether current user has modify permission
if (node != null)
{
hasModifyPermission = CheckDocumentPermissions(node, PermissionsEnum.Modify);
btnSelect.OnClientClick = "modalDialog('" + ResolveUrl("~/CMSModules/PortalEngine/UI/Layout/PageTemplateSelector.aspx") + "?documentid=" + node.DocumentID + "&nodeguid=" + node.NodeGUID + "', 'PageTemplateSelection', '90%', '85%'); return false;";
}
btnSelect.Text = GetString("PageProperties.Select");
btnClone.OnClientClick = "return confirm('" + GetString("Template.ConfirmClone") + "');";
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "SelectTemplate", ScriptHelper.GetScript(
@"
function OnSelectPageTemplate(templateId) {
document.getElementById('" + hdnSelected.ClientID + @"').value = templateId;
" + ClientScript.GetPostBackEventReference(btnSelect, null) + @"
}
"
));
// Reflect processing action
pnlInherits.Enabled = DocumentManager.AllowSave;
if (!RequestHelper.IsPostBack())
{
LoadData();
}
ReloadControls();
// Ensure visibility
EnsureEditingForm(hasModifyPermission && !DocumentManager.ProcessingAction);
}
#endregion
#region "Methods"
protected void RadChanged(object sender, EventArgs e)
{
ReloadControls();
}
///
/// Gets the inherited page template from the parent node
///
/// Document node
protected int GetInheritedPageTemplateId(TreeNode node)
{
string aliasPath = node.NodeAliasPath;
// For root, there is no inheritance possible
if (String.IsNullOrEmpty(aliasPath) || (aliasPath == "/"))
{
return 0;
}
aliasPath = TreePathUtils.GetParentPath(aliasPath);
// Get the page info
PageInfo pi = PageInfoProvider.GetPageInfo(node.NodeSiteName, aliasPath, node.DocumentCulture, node.DocumentUrlPath, node.NodeParentID, true);
if (pi != null)
{
// Get template used by the page info
pti = pi.UsedPageTemplateInfo;
if (pti != null)
{
return pti.PageTemplateId;
}
}
return 0;
}
///
/// Reloads the controls on the page to the appropriate state
///
protected void ReloadControls()
{
TreeNode node = DocumentManager.Node;
if (node.NodeAliasPath == "/")
{
// For root, inherit option means no page template
radInherit.ResourceString = "Template.NoTemplate";
}
// Get the template ID
int templateId = SelectedTemplateID;
string suffix = null;
bool inherit = radInherit.Checked;
plcUIClone.Visible = false;
plcUIEdit.Visible = false;
plcUISave.Visible = false;
if (inherit)
{
// Inherited
selectorEnabled = false;
// Inherit
templateId = GetInheritedPageTemplateId(node);
if (templateId > 0)
{
suffix = " " + GetString("Template.Inherited");
}
}
else
{
// Standard selection
selectorEnabled = true;
}
// Set modal dialogs
btnSave.OnClientClick = "modalDialog('" + ResolveUrl("~/CMSModules/PortalEngine/UI/Layout/SaveNewPageTemplate.aspx") + "?templateId=" + templateId + "&siteid=" + CMSContext.CurrentSiteID + "', 'SaveNewTemplate', 600, 400); return false;";
btnEditTemplateProperties.OnClientClick = "modalDialog('" + ResolveUrl("~/CMSModules/PortalEngine/UI/PageTemplates/PageTemplate_Edit.aspx") + "?templateid=" + templateId + "&aliaspath=" + node.NodeAliasPath + "&dialog=1', 'TemplateSelection', 850, 680); return false;";
// Load the page template name
pti = PageTemplateInfoProvider.GetPageTemplateInfo(templateId);
if (pti != null)
{
txtTemplate.Text = ResHelper.LocalizeString(pti.DisplayName);
plcUISave.Visible = true;
plcUIEdit.Visible = (!pti.IsReusable || currentUser.IsAuthorizedPerUIElement("CMS.Content", "Template.ModifySharedTemplates"));
plcUIClone.Visible = pti.IsReusable || inherit;
}
else
{
txtTemplate.Text = GetString("Template.SelectorNoTemplate");
}
txtTemplate.Text += suffix;
}
///
/// Ensures visibility of the displayed controls
///
/// Indicates whether current user has modify permission
private void EnsureEditingForm(bool modify)
{
// Template selector
txtTemplate.Enabled = modify && selectorEnabled;
btnSelect.Enabled = txtTemplate.Enabled;
// Clone as ad-hoc
btnClone.Enabled = modify;
if (CMSObjectHelper.UseCheckinCheckout)
{
var pageTemplate = PageTemplateInfoProvider.GetPageTemplateInfo(Node.GetUsedPageTemplateId());
if ((pageTemplate != null) && !pageTemplate.Generalized.IsCheckedOutByUser(CMSContext.CurrentUser))
{
btnClone.Enabled = false;
var objectType = GetString(TypeHelper.GetObjectTypeResourceKey(pageTemplate.ObjectType));
var objectName = HTMLHelper.HTMLEncode(ResHelper.LocalizeString(pageTemplate.Generalized.ObjectDisplayName));
btnClone.ToolTip = HTMLHelper.StripTags(string.Format(GetString("ObjectEditMenu.CheckOutToEdit"), objectType, objectName));
}
}
if (!btnClone.Enabled)
{
// Remove client click action
btnClone.OnClientClick = "return false;";
}
lblClone.Enabled = btnClone.Enabled;
// Edit menu
menuElem.Enabled = modify;
// Inherits
pnlInherits.Visible = modify;
// Radio buttons
radInherit.Enabled = modify;
if (!currentUser.IsAuthorizedPerUIElement("CMS.Content", "Template.Inherit"))
{
radInherit.Attributes.Add("disabled", "disabled");
}
radAllCultures.Enabled = modify;
radThisCulture.Enabled = modify;
}
///
/// Loads the initial data from the document
///
private void LoadData()
{
TreeNode node = Node;
if (node != null)
{
if (node.IsRoot())
{
// Hide inheritance options for root node
pnlInherits.Visible = false;
}
else
{
inheritElem.Value = Node.NodeInheritPageLevels;
// Try get info whether exist linked document in path
DataSet ds = DocumentManager.Tree.SelectNodes(CMSContext.CurrentSiteName, "/%", node.DocumentCulture, false, null, "NodeLinkedNodeID IS NOT NULL AND (N'" + SqlHelperClass.GetSafeQueryString(Node.NodeAliasPath) + "' LIKE NodeAliasPath + '%')", null, -1, false, 1, "Count(*) AS NumOfDocs");
// If node is not link or none of parent documents is not linked document use document name path
if (!node.IsLink && ValidationHelper.GetInteger(DataHelper.GetDataRowValue(ds.Tables[0].Rows[0], "NumOfDocs"), 0) == 0)
{
inheritElem.TreePath = TreePathUtils.GetParentPath("/" + Node.DocumentNamePath);
}
else
{
// Otherwise use alias path
inheritElem.TreePath = TreePathUtils.GetParentPath("/" + Node.NodeAliasPath);
}
}
if (node.NodeInheritPageTemplate)
{
// Document inherits template
radInherit.Checked = true;
}
else
{
// Document has its own template
int templateId = node.GetUsedPageTemplateId();
if (node.NodeTemplateForAllCultures)
{
radAllCultures.Checked = true;
}
else
{
radThisCulture.Checked = true;
}
// Set selected template ID
SelectedTemplateID = templateId;
}
ReloadControls();
}
}
#endregion
#region "Button handling"
///
/// Fires after the template selection
///
protected void btnSelect_Click(object sender, EventArgs e)
{
ReloadControls();
}
///
/// Clone button event handler
///
protected void btnClone_Click(object sender, EventArgs e)
{
if ((pti != null) && hasModifyPermission)
{
int templateId = pti.PageTemplateId;
TreeNode node = Node;
// Clone the info
string docName = node.GetDocumentName();
string displayName = "Ad-hoc: " + docName;
PageTemplateInfo newInfo = PageTemplateInfoProvider.CloneTemplateAsAdHoc(pti, displayName, CMSContext.CurrentSiteID, node.NodeGUID);
newInfo.Description = String.Format(GetString("PageTemplate.AdHocDescription"), Node.DocumentNamePath);
PageTemplateInfoProvider.SetPageTemplateInfo(newInfo);
// Save the MVT/Content personalization variants of this page template
if (LicenseHelper.CheckFeature(URLHelper.GetCurrentDomain(), FeatureEnum.MVTesting))
{
ModuleCommands.OnlineMarketingCloneTemplateMVTVariants(templateId, newInfo.PageTemplateId);
}
if (LicenseHelper.CheckFeature(URLHelper.GetCurrentDomain(), FeatureEnum.ContentPersonalization))
{
ModuleCommands.OnlineMarketingCloneTemplateContentPersonalizationVariants(templateId, newInfo.PageTemplateId);
}
// Assign the selected template for all cultures and save
SelectedTemplateID = newInfo.PageTemplateId;
if (radInherit.Checked)
{
radAllCultures.Checked = true;
radInherit.Checked = false;
}
DocumentManager.SaveDocument();
}
}
protected void DocumentManager_OnValidateData(object sender, DocumentManagerEventArgs e)
{
if (!radInherit.Checked)
{
// Set the selected template ID
int templateId = SelectedTemplateID;
if (templateId <= 0)
{
e.IsValid = false;
e.ErrorMessage = GetString("newpage.templateerror");
}
}
}
private void DocumentManager_OnSaveData(object sender, DocumentManagerEventArgs e)
{
node = Node;
if (radInherit.Checked)
{
// Set 0 as inherited
SetTemplateId(0);
node.NodeInheritPageTemplate = true;
}
else
{
// Set the selected template ID
int templateId = SelectedTemplateID;
SetTemplateId(templateId);
bool templateSelected = (templateId > 0);
node.NodeInheritPageTemplate = !templateSelected;
if (!templateSelected)
{
radInherit.Checked = true;
radThisCulture.Checked = false;
radAllCultures.Checked = false;
txtTemplate.Enabled = false;
btnSelect.Enabled = false;
}
}
node.SetValue("NodeInheritPageLevels", inheritElem.Value);
}
private void DocumentManager_OnAfterAction(object sender, DocumentManagerEventArgs e)
{
// Ensure default combination if page template changed
if (SettingsKeyProvider.GetBoolValue(CMSContext.CurrentSiteName + ".CMSMVTEnabled")
&& LicenseHelper.CheckFeature(URLHelper.GetCurrentDomain(), FeatureEnum.MVTesting)
&& (ModuleCommands.OnlineMarketingContainsMVTest(Node.NodeAliasPath, Node.NodeSiteID, Node.DocumentCulture, false)))
{
int templateId = Node.GetUsedPageTemplateId();
ModuleCommands.OnlineMarketingEnsureDefaultCombination(templateId);
}
ReloadControls();
}
///
/// Sets the template id to the given document
///
/// Document node
private void SetTemplateId(int templateId)
{
if (radAllCultures.Checked)
{
Node.NodeTemplateID = templateId;
}
else
{
Node.NodeTemplateID = 0;
}
Node.DocumentPageTemplateID = templateId;
Node.NodeTemplateForAllCultures = radAllCultures.Checked;
}
#endregion
}