using System;
using System.Linq;
using System.Data;
using CMS.CMSHelper;
using CMS.FormEngine;
using CMS.GlobalHelper;
using CMS.LicenseProvider;
using CMS.PortalEngine;
using CMS.SettingsProvider;
using CMS.DocumentEngine;
using CMS.UIControls;
using CMS.WorkflowEngine;
using CMS.ExtendedControls;
public partial class CMSModules_Content_CMSDesk_Edit_Edit : CMSContentPage
{
#region "Variables"
protected bool newdocument = false;
protected bool newculture = false;
protected bool mShowToolbar = false;
protected DataClassInfo ci = null;
#endregion
#region "Protected variables"
///
/// Local page message placeholder
///
public override MessagesPlaceHolder MessagesPlaceHolder
{
get
{
// Ensure default offset in special case of edit page
MessagesPlaceHolder plc = base.MessagesPlaceHolder;
if (plc != null)
{
plc.WrapperControlID = "pnlContent";
plc.OffsetY = 7;
}
return plc;
}
}
///
/// Class identifier for new documents.
///
protected int ClassID
{
get
{
return QueryHelper.GetInteger("classid", 0);
}
}
///
/// TemplateID, used when Use template selection is enabled for class of newly created document.
///
protected int TemplateID
{
get
{
return QueryHelper.GetInteger("templateid", -1);
}
}
///
/// Identifier of parent document. (For newly created documents.)
///
protected int ParentNodeID
{
get
{
return QueryHelper.GetInteger("parentnodeid", 0);
}
}
///
/// Culture of parent document. (For newly created documents.)
///
protected string ParentCulture
{
get
{
return QueryHelper.GetString("parentculture", CMSContext.PreferredCultureCode);
}
}
///
/// Indicates if e-commerce product section is edited.
///
protected bool ProductSection
{
get
{
return (Mode != null) && (Mode.ToLowerCSafe() == "productssection") && (ci != null) && (ci.ClassIsProductSection);
}
}
#endregion
#region "Page events"
protected override void OnPreInit(EventArgs e)
{
// Do not redirect for non-existing document if new culture version is being created
DocumentManager.RedirectForNonExistingDocument = (Action != "newculture");
base.OnPreInit(e);
}
protected override void OnInit(EventArgs e)
{
CurrentUserInfo currentUser = CMSContext.CurrentUser;
// Check UIProfile
if (!currentUser.IsAuthorizedPerUIElement("CMS.Content", "EditForm"))
{
RedirectToCMSDeskUIElementAccessDenied("CMS.Content", "EditForm");
}
base.OnInit(e);
DocumentManager.OnAfterAction += DocumentManager_OnAfterAction;
DocumentManager.OnLoadData += DocumentManager_OnLoadData;
// Register scripts
string script = "function " + formElem.ClientID + "_RefreshForm(){" + Page.ClientScript.GetPostBackEventReference(btnRefresh, "") + " }";
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), formElem.ClientID + "_RefreshForm", ScriptHelper.GetScript(script));
ScriptHelper.RegisterCompletePageScript(this);
ScriptHelper.RegisterProgress(this);
ScriptHelper.RegisterDialogScript(this);
formElem.OnBeforeBasicFormDataLoad += formElem_OnBeforeDataLoad;
formElem.OnAfterDataLoad += formElem_OnAfterDataLoad;
// Analyze the action parameter
switch (Action)
{
case "new":
case "convert":
{
newdocument = true;
// Check if document type is allowed under parent node
if ((ParentNodeID > 0) && (ClassID > 0))
{
// Check class
ci = DataClassInfoProvider.GetDataClass(ClassID);
if (ci == null)
{
throw new Exception("[Content/Edit.aspx]: Class ID '" + ClassID + "' not found.");
}
if (ci.ClassName.ToLowerCSafe() == "cms.blog")
{
if (!LicenseHelper.LicenseVersionCheck(URLHelper.GetCurrentDomain(), FeatureEnum.Blogs, VersionActionEnum.Insert))
{
RedirectToAccessDenied(String.Format(GetString("cmsdesk.bloglicenselimits"), ""));
}
}
if (!LicenseHelper.LicenseVersionCheck(URLHelper.GetCurrentDomain(), FeatureEnum.Documents, VersionActionEnum.Insert))
{
RedirectToAccessDenied(String.Format(GetString("cmsdesk.documentslicenselimits"), ""));
}
// Check if need template selection, if so, then redirect to template selection page
int templateId = TemplateID;
if (!ProductSection && ci.ClassShowTemplateSelection && (templateId < 0) && !ci.ClassName.EqualsCSafe(DataClassInfoProvider.DefaultPageClassName, true))
{
URLHelper.Redirect("~/CMSModules/Content/CMSDesk/TemplateSelection.aspx" + URLHelper.Url.Query);
}
// Set default template ID
formElem.DefaultPageTemplateID = (templateId > 0) ? templateId : ci.ClassDefaultPageTemplateID;
string newClassName = ci.ClassName;
formElem.FormName = newClassName + ".default";
DocumentManager.Mode = FormModeEnum.Insert;
DocumentManager.ParentNodeID = ParentNodeID;
DocumentManager.NewNodeCultureCode = ParentCulture;
// Set up the document conversion
int convertDocumentId = QueryHelper.GetInteger("convertdocumentid", 0);
if (convertDocumentId > 0)
{
DocumentManager.SourceDocumentID = convertDocumentId;
DocumentManager.Mode = FormModeEnum.Convert;
}
DocumentManager.NewNodeClassID = ClassID;
// Check allowed document type
TreeNode parentNode = DocumentManager.ParentNode;
if ((parentNode == null) || !DataClassInfoProvider.IsChildClassAllowed(parentNode.GetIntegerValue("NodeClassID", 0), ClassID))
{
AddNotAllowedScript("child");
}
if (!currentUser.IsAuthorizedToCreateNewDocument(DocumentManager.ParentNode, DocumentManager.NewNodeClassName))
{
AddNotAllowedScript("new");
}
}
if (RequiresDialog)
{
SetTitle("CMSModules/CMS_Content/Menu/New.png", GetString("Content.NewTitle"), null, null);
}
}
break;
case "newculture":
{
newculture = true;
int nodeId = QueryHelper.GetInteger("nodeid", 0);
DocumentManager.Mode = FormModeEnum.InsertNewCultureVersion;
formElem.NodeID = nodeId;
// Check permissions
bool authorized = false;
if (nodeId > 0)
{
// Get the node
TreeNode treeNode = DocumentManager.Tree.SelectSingleNode(nodeId);
if (treeNode != null)
{
DocumentManager.NewNodeClassID = treeNode.GetIntegerValue("NodeClassID", 0);
DocumentManager.ParentNodeID = ParentNodeID;
DocumentManager.NewNodeCultureCode = ParentCulture;
DocumentManager.SourceDocumentID = QueryHelper.GetInteger("sourcedocumentid", 0);
authorized = currentUser.IsAuthorizedToCreateNewDocument(treeNode.NodeParentID, treeNode.NodeClassName);
if (authorized)
{
string className = DocumentManager.NewNodeClassName;
if (className.ToLowerCSafe() == "cms.blog")
{
if (!LicenseHelper.LicenseVersionCheck(URLHelper.GetCurrentDomain(), FeatureEnum.Blogs, VersionActionEnum.Insert))
{
RedirectToAccessDenied(String.Format(GetString("cmsdesk.bloglicenselimits"), ""));
}
}
if (!LicenseHelper.LicenseVersionCheck(URLHelper.GetCurrentDomain(), FeatureEnum.Documents, VersionActionEnum.Insert))
{
RedirectToAccessDenied(String.Format(GetString("cmsdesk.documentslicenselimits"), ""));
}
ci = DataClassInfoProvider.GetDataClass(className);
formElem.FormName = className + ".default";
}
}
}
if (!authorized)
{
AddNotAllowedScript("newculture");
}
if (RequiresDialog)
{
SetTitle("CMSModules/CMS_Content/Menu/New.png", GetString("content.newcultureversiontitle"), null, null);
}
}
break;
default:
{
TreeNode node = Node;
if (node == null)
{
RedirectToNewCultureVersionPage();
}
else
{
// Update view mode
if (!RequiresDialog)
{
CMSContext.ViewMode = ViewModeEnum.EditForm;
}
EnableSplitMode = true;
DocumentManager.Mode = FormModeEnum.Update;
ci = DataClassInfoProvider.GetDataClass(node.NodeClassName);
if (RequiresDialog)
{
menuElem.ShowSaveAndClose = true;
// Add the document name to the properties header title
string nodeName = node.GetDocumentName();
// Get name for root document
if (node.NodeClassName.ToLowerCSafe() == "cms.root")
{
nodeName = CMSContext.CurrentSite.DisplayName;
}
SetTitle("CMSModules/CMS_Content/Menu/New.png", GetString("Content.EditTitle") + " \"" + HTMLHelper.HTMLEncode(ResHelper.LocalizeString(nodeName)) + "\"", null, null);
}
}
}
break;
}
formElem.Visible = true;
// Display / hide the CK editor toolbar area
FormInfo fi = FormHelper.GetFormInfo(ci.ClassName, false);
if (fi.UsesHtmlArea())
{
// Add script to display toolbar
if (formElem.HtmlAreaToolbarLocation.ToLowerCSafe() == "out:cktoolbar")
{
mShowToolbar = true;
}
}
// Init form for product section edit
if (ProductSection)
{
// Form prefix
formElem.FormPrefix = "ecommerce";
}
if (RequiresDialog)
{
plcCKFooter.Visible = false;
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// Register script files
ScriptHelper.RegisterScriptFile(this, "cmsedit.js");
ScriptHelper.RegisterTooltip(this);
formElem.MessagesPlaceHolder.ClearLabels();
InitBindSkuAction();
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ScriptHelper.RegisterStartupScript(this, typeof(string), "InitializePage", ScriptHelper.GetScript("InitializePage()"));
// Title and breadcrumbs for product section edit
if (ProductSection)
{
bool isNew = Action == "new";
TreeNode node = DocumentManager.Node;
string className = (node != null) ? node.ClassName : ci.ClassName;
// Title
CurrentMaster.Title.TitleImage = GetDocumentTypeIconUrl(className, "48x48");
CurrentMaster.Title.TitleText = GetString(isNew ? "com.productsection.new" : "com.productsection.properties");
CurrentMaster.Title.HelpTopicName = "new_edit_product_section";
// Get products starting path
string key = SettingsKeyProvider.GetFullKeyName(CurrentSiteName, "CMSStoreProductsStartingPath");
string productsStartingPath = SettingsKeyProvider.GetStringValue(key);
// Create and set breadcrumbs
TreeNode breadcrumbNode = isNew ? DocumentManager.ParentNode : node;
if (breadcrumbNode != null)
{
CurrentMaster.Title.Breadcrumbs = CreateBreadcrumbs(breadcrumbNode, "/" + productsStartingPath.Trim('%').Trim('/') + "%");
}
}
if (!newdocument && !newculture)
{
formElem.Enabled = DocumentManager.AllowSave;
imgBindSku.ImageUrl = DocumentManager.AllowSave ? GetImageUrl("Objects/Ecommerce_SKU/bind.png") : GetImageUrl("Objects/Ecommerce_SKU/binddisabled.png");
btnBindSku.Enabled = DocumentManager.AllowSave;
}
if (!RequiresDialog)
{
// Set dialog title
ScriptHelper.RegisterTitleScript(this, GetString("content.ui.form"));
}
}
#endregion
#region "Document manager events"
protected void DocumentManager_OnAfterAction(object sender, DocumentManagerEventArgs e)
{
TreeNode node = e.Node;
int newNodeId = node.NodeID;
if (newdocument || newculture)
{
// Store error text
if (!string.IsNullOrEmpty(formElem.MessagesPlaceHolder.ErrorText))
{
SessionHelper.SetValue("FormErrorText|" + newNodeId, formElem.MessagesPlaceHolder.ErrorText);
}
}
else if (e.ActionName == ComponentEvents.UNDO_CHECKOUT)
{
// Reload the values in the form
formElem.BasicForm.LoadControlValues();
}
}
protected void DocumentManager_OnLoadData(object sender, DocumentManagerEventArgs e)
{
formElem.BasicForm.LoadControlValues();
}
#endregion
#region "Methods"
///
/// Adds script for redirecting to NotAllowed page.
///
/// Action string
private void AddNotAllowedScript(string action)
{
AddScript("window.location.replace('../NotAllowed.aspx?action=" + action + "')");
}
///
/// Adds the script to the output request window.
///
/// Script to add
public override void AddScript(string script)
{
ScriptHelper.RegisterStartupScript(this, typeof(string), script.GetHashCode().ToString(), ScriptHelper.GetScript(script));
}
protected void btnRefresh_Click(object sender, EventArgs e)
{
TreeNode node = DocumentManager.Node;
// Check permission to modify document
if (CMSContext.CurrentUser.IsAuthorizedPerDocument(node, NodePermissionsEnum.Modify) == AuthorizationResultEnum.Allowed)
{
// Ensure version for later detection whether node is published
node.VersionManager.EnsureVersion(node, node.IsPublished);
// Tree refresh is needed only if node was archived or published
WorkflowStepInfo currentStep = node.WorkflowStep;
bool refreshTree = (currentStep != null) && (currentStep.StepIsArchived || currentStep.StepIsPublished);
// Move to edit step
node.MoveToFirstStep(null);
// Refresh tree
if (refreshTree)
{
ScriptHelper.RefreshTree(this, node.NodeID, node.NodeID);
}
// Reload form
formElem.LoadForm(true);
if (DocumentManager.SaveChanges)
{
ScriptHelper.RegisterStartupScript(this, typeof(string), "moveToEditStepChange", ScriptHelper.GetScript("Changed();"));
}
}
}
protected void formElem_OnBeforeDataLoad(object sender, EventArgs e)
{
bool hasCategories = (formElem.BasicForm != null) && formElem.BasicForm.FormInformation.ItemsList.OfType().Any();
if (hasCategories)
{
formElem.DefaultFormLayout = FormLayoutEnum.FieldSets;
formElem.DefaultCategoryName = ResHelper.GetString("general.general");
}
}
protected void formElem_OnAfterDataLoad(object sender, EventArgs e)
{
TreeNode node = DocumentManager.Node;
if (node != null)
{
// Show stored error message
string frmError = SessionHelper.GetValue("FormErrorText|" + node.NodeID) as string;
if (!string.IsNullOrEmpty(frmError))
{
formElem.ShowError(frmError);
// Remove error message
SessionHelper.Remove("FormErrorText|" + node.NodeID);
}
}
}
private void InitBindSkuAction()
{
if (RequiresDialog)
{
return;
}
if ((DocumentManager.NodeID > 0) && (DocumentManager.Node != null) && (Action != "newculture"))
{
var dataClass = DataClassInfoProvider.GetDataClass(DocumentManager.Node.ClassName);
if ((dataClass != null) && ModuleEntry.IsModuleLoaded(ModuleEntry.ECOMMERCE))
{
plcSkuBinding.Visible = dataClass.ClassIsProduct;
btnBindSku.Click += (sender, args) =>
{
string url = "~/CMSModules/Ecommerce/Pages/Content/Product/Product_Edit_General.aspx";
url = URLHelper.AddParameterToUrl(url, "nodeid", DocumentManager.NodeID.ToString());
url = URLHelper.AddParameterToUrl(url, "action", "bindsku");
if (RequiresDialog)
{
url = URLHelper.AddParameterToUrl(url, "dialog", "1");
}
Response.Redirect(url);
};
}
}
}
///
/// Creates breadcrumbs array leading to specified node using given tree provider and starting at given starting path.
///
/// Tree node to generate breadcrumbs for.
/// Path where to start to generate.
protected virtual string[,] CreateBreadcrumbs(TreeNode node, string startingPath)
{
string[,] breadcrumbs = null;
if (node != null)
{
const string columns = "NodeID, NodeAliasPath, NodeSiteID, NodeOwner, DocumentName, DocumentLastVersionName, DocumentMenuCaption, DocumentCulture, SiteName, ClassName, NodeACLID";
// Prepare the where condition
string where = SqlHelperClass.AddWhereCondition(null, TreeProvider.GetNodesOnPathWhereCondition(node.NodeAliasPath, true, true));
DataSet ds = DocumentHelper.GetDocuments(CurrentSiteName, startingPath, TreeProvider.ALL_CULTURES, true, null, where, "NodeAliasPath ASC", -1, false, 0, columns, node.TreeProvider);
ds = TreeSecurityProvider.FilterDataSetByPermissions(ds, NodePermissionsEnum.Read, CMSContext.CurrentUser);
if (!DataHelper.DataSourceIsEmpty(ds))
{
// Initialize resolver
ContextResolver currentResolver = CMSContext.CurrentResolver.CreateContextChild();
currentResolver.EncodeResolvedValues = true;
DataRow[] resolverData = new DataRow[1];
DataTable table = ds.Tables[0];
// Prepare breadcrumbs
breadcrumbs = new string[table.Rows.Count + 1, 4];
int i = 0;
foreach (DataRow dr in table.Rows)
{
// Add current datarow to the resolver
resolverData[0] = dr;
currentResolver.SourceData = resolverData;
// Prepare the item name. Disable encoding.
currentResolver.EncodeResolvedValues = false;
string linkName = currentResolver.ResolveMacros(TreePathUtils.GetMenuCaption(ValidationHelper.GetString(dr["DocumentMenuCaption"], String.Empty), ValidationHelper.GetString(dr["DocumentName"], String.Empty)));
currentResolver.EncodeResolvedValues = true;
// Use site name for root node
linkName = string.IsNullOrEmpty(linkName) ? CMSContext.CurrentSite.DisplayName : linkName;
// Create breadcrumb
breadcrumbs[i, 0] = HTMLHelper.HTMLEncode(linkName);
breadcrumbs[i, 1] = "~/CMSModules/Ecommerce/Pages/Tools/Products/Product_List.aspx?nodeid=" + dr["NodeID"];
breadcrumbs[i, 3] = string.Format("EditDocument({0}); RefreshTree({0},{0});", dr["NodeID"]);
// Increment index
i++;
}
// Add 'properties' breadcrumb
breadcrumbs[i, 0] = HTMLHelper.HTMLEncode(GetString((Action == "new") ? "com.productsection.new" : "com.productsection.properties"));
breadcrumbs[i, 1] = "";
breadcrumbs[i, 2] = "";
}
}
return breadcrumbs;
}
#endregion
}