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
More From Progress
d12fcc0bdb669b804e7f71198c9619a7
5 Questions Automakers Should Ask to Improve Asset Uptime
Download Whitepaper
 
SF_MQ_WCM
2018 Gartner Magic Quadrant Web Content Management (WCM)
Download Whitepaper
 
What-Serverless-Means-For-Enterprice-Apps-Kinvey
What Serverless Means for Enterprise Apps
Watch Webinar