1-888-365-2779
+1-888-365-2779
Try Now
More in this section

Forums / Developing with Sitefinity / Duplicate Page Group

Duplicate Page Group

6 posts, 0 answered
  1. mcpdinkansas
    mcpdinkansas avatar
    102 posts
    Registered:
    22 Mar 2007
    06 Feb 2012
    Link to this post
    In Sitefinity 3.x I added a custom control to duplicate pages groups. In Sitefinity 4.4 this functionality is still not available by default. How can I add an Item to the page group context menu on the page list screen so that I can write this functionality again?
  2. mcpdinkansas
    mcpdinkansas avatar
    102 posts
    Registered:
    22 Mar 2007
    06 Feb 2012
    Link to this post
    bump
  3. mcpdinkansas
    mcpdinkansas avatar
    102 posts
    Registered:
    22 Mar 2007
    07 Feb 2012
    Link to this post
    Are there any examples on adding items to the context menus on the Page List in the admin?
  4. DARIO PAPALE
    DARIO PAPALE avatar
    2 posts
    Registered:
    28 Jun 2010
    15 Apr 2012
    Link to this post
    Hello,
    we are in need of the same function ( duplicate page groups ) , did anyone find a solution or has some sample code to manage duplication , also not adding in the admin?
    Thank you very much !!!
  5. Rory
    Rory avatar
    44 posts
    Registered:
    22 Mar 2012
    16 Apr 2012
    Link to this post
    Not sure if this is what you need but this is what i wrote up to duplicate page groups and the structure of pages beneath them, given a selected pagenode.  maybe it will help.  there is nothing existing in SF to do it, that i know of.

    you just have to call CopyPageGroup() with the right values and it does the rest. checks for duplicate titles and urlnames.

    public PageNode CopyPageGroup(Guid NodeToCopyFrom, string NewRoot_Title, string NewRoot_HTMLTitle, string NewRoot_Description)
    {
        PageManager manager = PageManager.GetManager();
        PageNode newNode = null;
        //get main root node
        Guid parentPageNodeId = SiteInitializer.FrontendRootNodeId;
        PageNode rootNode = manager.GetPageNode(parentPageNodeId);
     
        if (rootNode != null)
        {
            //build list of all child nodes to be duplicated
            List<PageNode> existingNodeList = new List<PageNode>();
            _FindChildNodes(rootNode, existingNodeList);
     
            int nameCounter = 1;
            string tempName = "";
            //make sure the new base page node doesnt already exist
            if (_CheckForExistingPage(NewRoot_Title, rootNode.Nodes.ToList()) != null)
            {
                tempName = NewRoot_Title + "_" + nameCounter;
                while (_CheckForExistingPage(tempName, rootNode.Nodes.ToList()) != null)
                {
                    nameCounter++;
                    tempName = NewRoot_Title + "_" + nameCounter;
                }
            }
     
            if(tempName == "")
                newNode = _DuplicatePageHierarchy(NodeToCopyFrom, NewRoot_Title, NewRoot_HTMLTitle, NewRoot_Description, existingNodeList, rootNode);
            else
                newNode = _DuplicatePageHierarchy(NodeToCopyFrom, tempName, NewRoot_HTMLTitle, NewRoot_Description, existingNodeList, rootNode);
        }
     
        return newNode;
    }
    private PageNode _CheckForExistingPage(string NewRoot_Title, List<PageNode> PageNodes)
    {
        //check if partner page already exists
        PageNode pageNode = null;
     
        foreach (PageNode pn in PageNodes)
            if (pn.Title.ToLower() == NewRoot_Title.ToLower())
            {
                pageNode = pn;
                break;
            }
        return pageNode;
    }
    private void _FindChildNodes(PageNode checkNode, List<PageNode> nodeList)
    {
        foreach (PageNode pn in checkNode.Nodes)
        {
            if (pn.NodeType == NodeType.Group || pn.Page != null)
                nodeList.Add(pn);
            _FindChildNodes(pn, nodeList);
        }
    }
     private PageNode _DuplicatePageHierarchy(Guid NodeToCopyFrom, string NewRoot_Title, string NewRoot_HTMLTitle, string NewRoot_Description, List<PageNode> existingNodeList, PageNode rootNode)
    {
        if (NodeToCopyFrom == Guid.Empty || String.IsNullOrEmpty(NewRoot_Title))
            return null;
        else
        {
            PageManager manager = PageManager.GetManager();
            var pageDataId = Guid.NewGuid();
     
            PageNode selectedNode = _FindSelectedNode(NodeToCopyFrom, existingNodeList);
     
            PageData newPageData = null;
            PageNode newPageNode = null;
     
            if (selectedNode.NodeType != NodeType.Group)
            {
                newPageData = manager.CreatePageData(pageDataId);               
                newPageData.Title = NewRoot_Title;
     
                if(String.IsNullOrEmpty(NewRoot_HTMLTitle))
                    newPageData.HtmlTitle = NewRoot_Title;
                else
                    newPageData.HtmlTitle = NewRoot_HTMLTitle;
     
                if (NewRoot_Description == null)
                    newPageData.Description = selectedNode.Description;
                else
                    newPageData.Description = NewRoot_Description;
     
                newPageData.Template = selectedNode.Page.Template;
                newPageData.Culture = Thread.CurrentThread.CurrentCulture.ToString();
                newPageData.UiCulture = Thread.CurrentThread.CurrentUICulture.ToString();
            }
     
            newPageNode = manager.CreatePage(rootNode, Guid.NewGuid(), selectedNode.NodeType);
            newPageNode.Page = newPageData;
            newPageNode.Name = NewRoot_Title;
            newPageNode.Title = NewRoot_Title;
             
            if (NewRoot_Description == null)
                newPageNode.Description = selectedNode.Description;
            else
                newPageNode.Description = NewRoot_Description;
     
            newPageNode.UrlName = Regex.Replace(NewRoot_Title.ToLower(), @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-");
            newPageNode.ShowInNavigation = true;
            newPageNode.DateCreated = DateTime.UtcNow;
            newPageNode.LastModified = DateTime.UtcNow;
     
            //check for duplicate node urls
            if (PageManager.CheckNodeUrlForDuplicates(newPageNode))
            {
                //duplicates found
                int counter = 1;
                while (PageManager.CheckNodeUrlForDuplicates(newPageNode))
                {
                    newPageNode.UrlName = Regex.Replace((NewRoot_Title + "_" + counter).ToLower(), @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-");
                    counter++;
                }
            }
     
            try
            {
                manager.SaveChanges();
     
                // Publish
                if (newPageNode.NodeType == NodeType.Standard)
                {
                    var bag = new Dictionary<string, string>();
                    bag.Add("ContentType", typeof(PageNode).FullName);
                    WorkflowManager.MessageWorkflow(newPageNode.Id, typeof(PageNode), null, "Publish", false, bag);
                }
     
                _BuildChildNodes(newPageNode, selectedNode.Nodes.ToList());
            }
            catch { newPageNode = null; }
          
            return newPageNode;
        }
    }
    private PageNode _FindSelectedNode(Guid NodeToCopyFrom, List<PageNode> existingNodeList)
    {
        //find the selected node
        PageNode selectedNode = null;
        foreach (PageNode pn in existingNodeList)
            if (pn.Id == NodeToCopyFrom)
                selectedNode = pn;
     
        return selectedNode;
    }
    private void _BuildChildNodes(PageNode rootNode, List<PageNode> existingNodeList)
    {
        PageManager manager = PageManager.GetManager();
     
        foreach (PageNode pn in existingNodeList)
        {
            PageData pageData = null;
            PageNode pageNode = null;
     
            if (pn.NodeType != NodeType.Group)
            {
                pageData = manager.CreatePageData(rootNode.Id);
                pageData.HtmlTitle = pn.Title;
                pageData.Title = pn.Title;
                pageData.Description = pn.Description;
                pageData.Template = pn.Page.Template;
                pageData.Culture = Thread.CurrentThread.CurrentCulture.ToString();
                pageData.UiCulture = Thread.CurrentThread.CurrentUICulture.ToString();
            }
     
            pageNode = manager.CreatePage(rootNode, Guid.NewGuid(), pn.NodeType);
            pageNode.Page = pageData;
            pageNode.Name = pn.Name;
            pageNode.Description = pn.Description;
            pageNode.Title = pn.Title;
            pageNode.UrlName = Regex.Replace(pn.Title.ToLower(), @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-");
            pageNode.ShowInNavigation = true;
            pageNode.DateCreated = DateTime.UtcNow;
            pageNode.LastModified = DateTime.UtcNow;
            pageNode.InheritsPermissions = true;
     
            //check for duplicate node urls
            if (PageManager.CheckNodeUrlForDuplicates(pageNode))
            {
                //duplicates found
                int counter = 1;
                while (PageManager.CheckNodeUrlForDuplicates(pageNode))
                {
                    pageNode.UrlName = Regex.Replace((pn.Title + "_" + counter).ToLower(), @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-");
                    counter++;
                }
            }
     
            try
            {
                manager.SaveChanges();
     
                // Publish
                if (pageNode.NodeType == NodeType.Standard)
                {
                    var bag = new Dictionary<string, string>();
                    bag.Add("ContentType", typeof(PageNode).FullName);
                    WorkflowManager.MessageWorkflow(pageNode.Id, typeof(PageNode), null, "Publish", false, bag);
                }
     
                _BuildChildNodes(pageNode, pn.Nodes.ToList());
            }
            catch { }
        }
    }

  6. DARIO PAPALE
    DARIO PAPALE avatar
    2 posts
    Registered:
    28 Jun 2010
    18 Apr 2012
    Link to this post
    Thank you very much for your help , I will try it and let you know!!!
6 posts, 0 answered