Subscribe to Blog Post being Published
Goal To grab the URL of a blog post from a specific blog when it has been published.
Hello, I am new to Sitefinity and have searched Google and the forums and can't quite find a good example or information on what I need to know.
The closest things I've found so far:
https://docs.sitefinity.com/for-developers-idataevent
https://knowledgebase.progress.com/articles/Article/Overwriting-the-default-LifecycleDecorator-for-a-Content-manager
https://docs.sitefinity.com/for-developers-dynamic-modules-events
So first question. For my needs, which route should I go between IDataEvent and IDynamicContentUpdatedEvent?
Second. Should I be subscribed to Updated or Created? I would assume Created only fires once and does not fire again when the post is published (no posts would be created in a published state). If Updated, I can tell if the post is published by checking its status or IsPublished. But how would I differentiate between an update to publish a post and an update to an already published post? I would only want to run the code once when the post is initially published.
Third. Assuming that the item is of type BlogPost, How can I tell what Blog it belongs to? For example, under Blogs there is Blog1 and Blog2. Would I get this from BlogPost.Parent.Title?
Fourth. Does BlogPost.ItemDefaultUrl return the canonical url of the post? Is it also full path or just relative?
Thanks!
Update 1
I'm currently trying the IDataEvent route but am hitting a roadblock. Here is the gist so far. I'm also still not seeing a way to determine the answer to question 2.
void Content_Action(IDataEvent @event) var action = @event.Action; var contentType = @event.ItemType; var itemId = @event.ItemId; var providerName = @event.ProviderName; var manager = ManagerBase.GetMappedManager(contentType, providerName); var item = manager.GetItemOrDefault(contentType, itemId); var blogType = TypeResolutionService.ResolveType("Telerik.Sitefinity.Blogs.Model.BlogPost"); if (item.GetType().FullName == blogType.FullName && action.ToLower() == "updated") //Blog post that has been updated //Working up to this point //BlogPost post = (BlogPost)item; //Doesn't seem to work BlogsManager blogManager = BlogsManager.GetManager(); BlogPost post = blogManager.GetBlogPost(itemId); //This doesn't seem to work either if (post != null) //Not getting in here if (post.Status == ContentLifecycleStatus.Live && post.Parent.Title.ToLower() == "blog1") //blog1 post that is published string url = post.ItemDefaultUrl; using (WebClient client = new WebClient()) var parm = new System.Collections.Specialized.NameValueCollection(); parm.Add("URL", url); client.UploadValues("--------------", "POST", parm); Solved
After trial and error, I've figured out the parameters that are only true when a blog post has initially been published. Also, the item was not null and the problem causing the code to not execute was unrelated. These are what to check for:
action == "New"
item.ApprovalWorkflowState == "Published"
item.Status == ContentLifecycleStatus.Live
item.Visible == true
Those are the parameters that will only exist the first time an unpublished post is published, with the kicker being the action being "New" and not "Updated".