Schedule content items publishing with workflow enabled

Schedule content items publishing with workflow enabled

December 18, 2008 0 Comments

The content you're reading is getting on in years
This post is on the older side and its content may be out of date.
Be sure to visit our blogs homepage for our latest news, updates and information.

 

 

One more blogger is on board ready to post more and more.

 

In this post I am going to show you how to publish and schedule content items with workflow enabled.

First we need to create a user control. I am going to work with News items. Let's say my control is named ScheduleNews.ascx.

 

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ScheduleNews.ascx.cs" Inherits="CustomControls_ScheduleNews" %> 
 
 
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> 
 

 

Then, register this control in our web.config file.

 

<toolboxControls> 
 <clear /> 
 <add name="ScheduleNews" 
 section="Custom" 
 url="~/CustomControls/ScheduleNews.ascx" /> 
...
</toolboxControls>

 

Now we are going to add some logic in our control code behind. The idea is that, we have to read Publication_Date and Expiration_Date metafields, check the dates, and set new time to these metafields programmatically. Then, we need to iterate through all workflow states till we reach the last one - "Publish" state.

 

ScheduleNews.ascx.cs

 

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using Telerik.Cms.Engine; 
using System.Collections; 
using Telerik.Workflow; 
 
public partial class CustomControls_ScheduleNews : System.Web.UI.UserControl 
{ 
 
 protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
 protected void Button1_Click(object sender, EventArgs e) 
    { 
        ContentManager manager = new ContentManager("News"); 
        IList Items = manager.GetContent(); 
 foreach (IContent item in Items) 
        { 
 //READ METAFIELDS  
 // OPTIOANLLY WORKS WITH CATEGORIES  
 //string Category = item.GetMetaData("Category").ToString();  
            DateTime pubDate = (DateTime)item.GetMetaData("Publication_Date"); 
            DateTime expDate = (DateTime)item.GetMetaData("Expiration_Date"); 
 //OPTIONALLY CHECK IF OUR ITEMS ARE IN "MyCategory"  
 //if (Category.ToString().Equals("MyCategory"))  
 //{  
 //get the content for editing  
            StagedContent itemToChange = manager.GetStagedContent(item.ID) as StagedContent; 
 //OPTIONALLY CHECK EVEN OR ODD DATES(2,4,6...1,3,5)  
 bool changed = false; 
 if (pubDate.Day % 2 == 0) 
            { 
 //DAY IS EVEN HERE  
                DateTime newTime = DateTime.Today; 
 //SET NEW PUBLICATION DATE  
                itemToChange.SetMetaData("Publication_Date", newTime.AddDays(5)); 
 //SET NEW EXPIRATION DATE  
 //THE ITEM EXPIRE IN 30 DAYS FROM NOW ON  
                itemToChange.SetMetaData("Expiration_Date", newTime.AddDays(30)); 
                changed = true; 
            } 
 else 
            { 
 //DAY IS ODD  
                changed = true; 
            } 
 //SAVE CONTENT  
 if (changed) 
 //SAVE IN DRAFT  
                itemToChange.Status = ContentStatus.Draft; 
            manager.SaveContent(itemToChange); 
 //ITERATE THROUGH ALL WORKFLOW STATES TILL WE REACH PUBLICATION DATE  
            StagedContent staged = manager.GetCurrentState(itemToChange.ID); 
            ExecuteActivity(staged.WorkflowInstanceId, "SendForApproval"); 
            Nolics.ORMapper.Base.DataConnection.InitWebRequest(); 
 
 //PASS THROUH APPROVE STATUS  
            ExecuteActivity(staged.WorkflowInstanceId, "Approve"); 
            Nolics.ORMapper.Base.DataConnection.InitWebRequest(); 
 
 //PASS THROUGH PUBLUISH STATUS  
            ExecuteActivity(staged.WorkflowInstanceId, "Publish"); 
 
        } 
    }
 
 private EventActivity FindActivity(string name, IList<Activity> activities) 
    { 
 foreach (Activity act in activities) 
        { 
 if ((act is EventActivity) && (((EventActivity)act).CommandName == name)) 
 return (EventActivity)act; 
            EventActivity ea = FindActivity(name, act.Activities); 
 if (ea != null) 
 return ea; 
        } 
 return null; 
    } 
 
 private void ExecuteActivity(Guid id, string activityName) 
    { 
        WorkflowInstance instance = WorkflowRuntime.Instance.GetWorkflow(id); 
 if (instance != null) 
        { 
            ContentWorkflow workflow = (ContentWorkflow)instance.Activity; 
            EventActivity activity = FindActivity(activityName, workflow.Activities); 
 if (activity != null) 
            { 
                activity.Execute(WorkflowRuntime.Instance); 
            } 
        } 
    } 
}
 
 
 
 

 

Conclusion: When you run the code news items Publicaton_Date and Expiration_Date will be changed and the content will be published even with workflow enabled only with one click on the button.

progress-logo

The Progress Team

View all posts from The Progress Team on the Progress blog. Connect with us about all things application development and deployment, data integration and digital business.

Comments
Comments are disabled in preview mode.
Topics
Latest Stories
in Your Inbox

Subscribe to get all the news, info and tutorials you need to build better business apps and sites

More From Progress
progress-next-logo
ProgressNEXT: Premier Event for Modern Application Development
Read More
 
sitefinity-11-1-webinar
Seven Reasons to Check Out Sitefinity 11.1
Read More
 
omnichannel
Getting Started with Your Omnichannel Content Strategy
Read More