Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Duplicating content on save for a multilingual umbraco site

[Edit] I have actually been allowed to use the doc names, which makes it much easier but I still think it would be interesting to find out if it is possible.

I have to set a trigger to duplicate content to different branches on the content tree as the site will be in several languages. I have been told that I cannot access the documents by name(as they may change) and I shouldn't use node IDs either(not that I would know how to, after a while it would become difficult to follow the structure).

How can I traverse the tree to insert the new document in the relevant sub branches in the other languages? Is there a way?

like image 832
The_Cthulhu_Kid Avatar asked Oct 29 '12 13:10

The_Cthulhu_Kid


1 Answers

You can use the Document.AfterPublish event to catch the specific document object after it's been published. I would use this event handler to check the node type alias is one that you want copied, then you can call Document.MakeNew and pass the node ID of the new location. This means you don't have to use a specific node ID or document name to trap an event.

Example:

using umbraco.cms.businesslogic.web;
using umbraco.cms.businesslogic;
using umbraco.BusinessLogic;

namespace MyWebsite {
    public class MyApp : ApplicationBase {
        public MyApp()
            : base() {
            Document.AfterPublish += new Document.PublishEventHandler(Document_AfterPublish);
        }

        void Document_AfterPublish(Document sender, PublishEventArgs e) {
            if (sender.ContentType.Alias == "DoctypeAliasOfDocumentYouWantToCopy") {
                int parentId = 0; // Change to the ID of where you want to create this document as a child.
                Document d = Document.MakeNew("Name of new document", DocumentType.GetByAlias(sender.ContentType.Alias), User.GetUser(1), parentId)
                foreach (var prop in sender.GenericProperties) {
                    d.getProperty(prop.PropertyType.Alias).Value = sender.getProperty(prop.PropertyType.Alias).Value;
                }
                d.Save();
                d.Publish(User.GetUser(1));
            }
        }
    }
}
like image 90
Jamie Howarth Avatar answered Nov 04 '22 07:11

Jamie Howarth