Page workflow and versioning


List of examples:

Content locking

Checking out a page




// Gets a page named 'On Roasts'
TreeNode page = DocumentHelper.GetDocuments()
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

    // Checks if the page isn't already checked-out
    if (!page.IsCheckedOut)
    {
        // Checks out the page
        page.CheckOut();
    }


> Back to list of examples

Checking in a page




// Gets a page named 'On Roasts'
TreeNode page = DocumentHelper.GetDocuments()
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

// Checks if the page is checked-out
if (page.IsCheckedOut)
{
    // Checks in the page
    page.CheckIn();
}


> Back to list of examples

Undoing a page checkout




// Gets a page named 'On Roasts'
TreeNode page = DocumentHelper.GetDocuments()
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

// Checks if the page is checked-out
if (page.IsCheckedOut)
{
    // Undoes the checkout
    page.UndoCheckOut();
}


> Back to list of examples

Updating a page with the use of content locking




// Gets an article page named 'On Roasts'
TreeNode page = DocumentHelper.GetDocuments("DancingGoat.Article")
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")                 
    .FirstObject;

// Note: When updating pages under workflow or versioning, always retrieve pages with all columns to avoid data loss.
// Either call the 'GetDocuments' method with a class name parameter for a specific page type,
// or specify the page types using the 'Types' method and then call 'WithCoupledColumns'.

// Checks whether the page is already checked-out
if (!page.IsCheckedOut)
{
    // Checks out the page
    page.CheckOut();

    // Sets new values for the 'DocumentName' and 'ArticleTitle' fields
    page.DocumentName = "Updated article name";
    page.SetValue("ArticleTitle", "Updated article title");

    // Updates the page in the database
    page.Update();

    // Checks in the page
    page.CheckIn();
}


> Back to list of examples

Updating multiple pages with the use of content locking




// Gets the latest edited version of article pages stored under the '/Articles/' path
// The pages are retrieved from the Dancing Goat site and in the "en-us" culture
var pages = DocumentHelper.GetDocuments()
    .Types("DancingGoat.Article")
    .Path("/Articles/", PathTypeEnum.Children)
    .WhereLike("DocumentName", "Coffee%")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .WithCoupledColumns();

// Note: When updating pages under workflow or versioning, always retrieve pages with all columns to avoid data loss.
// Either call the 'GetDocuments' method with a class name parameter for a specific page type,
// or specify the page types using the 'Types' method and then call 'WithCoupledColumns'.

// Updates the "DocumentName" and "ArticleTitle" fields of each retrieved page
foreach (TreeNode page in pages)
{
    // Checks whether the page is already checked-out
    if (!page.IsCheckedOut)
    {
        // Checks out the page
        page.CheckOut();

        page.DocumentName = "Updated article name";
        page.SetValue("ArticleTitle", "Updated article title");

        // Updates the page in the database
        page.Update();

        // Checks in the page
        page.CheckIn();
    }                 
}


> Back to list of examples

Page workflow management

Moving a page to a different step




// Creates a new instance of the Tree provider
TreeProvider tree = new TreeProvider(MembershipContext.AuthenticatedUser);

// Gets a page named 'On Roasts'
TreeNode page = DocumentHelper.GetDocuments()
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

// Gets the page's workflow
WorkflowManager workflowManager = WorkflowManager.GetInstance(tree);
WorkflowInfo workflow = workflowManager.GetNodeWorkflow(page);

// Checks if the page uses workflow
if (workflow != null)
{
    // Checks if the page doesn't use automatic publishing. If it is, the page cannot change workflow steps.
    if (!workflow.WorkflowAutoPublishChanges)
    {
        // Checks if the current user can move the page to the next step.
        if (workflowManager.CheckStepPermissions(page, WorkflowActionEnum.Approve))
        {
            // Based on current workflow step, the page is sent for approval, approved, or published
            page.MoveToNextStep();
            // If the page is published, rejects the page
            page.MoveToPreviousStep();
            // Moves the page to the first workflow step
            page.MoveToFirstStep();
        }
    }
}


> Back to list of examples

Moving a page to the Published step of the workflow




// Creates a new instance of the Tree provider
TreeProvider tree = new TreeProvider(MembershipContext.AuthenticatedUser);

// Gets a page named 'On Roasts'
TreeNode page = DocumentHelper.GetDocuments()
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

// Gets the page's workflow
WorkflowManager workflowManager = WorkflowManager.GetInstance(tree);
WorkflowInfo workflow = workflowManager.GetNodeWorkflow(page);

// Checks if the page uses workflow
if (workflow != null)
{
    // Publishes the page with a comment. There needs to be only one workflow path to the Published step.
    page.Publish("Review finished, publishing page.");
}


> Back to list of examples

Moving a page to the Archived step of the workflow




// Creates a new instance of the Tree provider
TreeProvider tree = new TreeProvider(MembershipContext.AuthenticatedUser);

// Gets a page named 'On Roasts'
TreeNode page = DocumentHelper.GetDocuments()
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

// Gets the page's workflow
WorkflowManager workflowManager = WorkflowManager.GetInstance(tree);
WorkflowInfo workflow = workflowManager.GetNodeWorkflow(page);

// Checks if the page uses workflow
if (workflow != null)
{
    // Archives the page with a comment
    page.Archive("The page is obsolete, archiving.");
}


> Back to list of examples

Page versioning

Rolling back to the oldest version of a page




TreeProvider tree = new TreeProvider(MembershipContext.AuthenticatedUser);

// Gets a page named 'On Roasts'
var page = DocumentHelper.GetDocuments()
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

var versionHistory = VersionHistoryInfoProvider.GetVersionHistories()
    .WhereEquals("DocumentID", page.DocumentID)
    .Columns("VersionHistoryID")
    .OrderByAscending("VersionHistoryID") // Makes sure the oldest version of the page is on the top of the results
    .Result; // Returns the data in the form of a DataSet

if (versionHistory != null)
{
    // Creates a new version history object
    VersionHistoryInfo version = new VersionHistoryInfo(versionHistory.Tables[0].Rows[0]);

    VersionManager versionManager = VersionManager.GetInstance(tree);

    // Rolls back the specific page version
    page.VersionManager.RollbackVersion(version.VersionHistoryID);
}


> Back to list of examples

Deleting the newest version of a page




TreeProvider tree = new TreeProvider(MembershipContext.AuthenticatedUser);

// Gets a page named 'On Roasts'
var page = DocumentHelper.GetDocuments()
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

var versionHistory = VersionHistoryInfoProvider.GetVersionHistories()
    .WhereEquals("DocumentID", page.DocumentID)
    .Columns("VersionHistoryID")
    .OrderByDescending("VersionHistoryID") // Makes sure the latest version of the page is on the top of the results
    .Result; // Returns the data in the form of a DataSet

if (versionHistory != null)
{
    // Creates a new version history object
    VersionHistoryInfo version = new VersionHistoryInfo(versionHistory.Tables[0].Rows[0]);

    VersionManager versionManager = VersionManager.GetInstance(tree);

    // Deletes the specific page version
    page.VersionManager.DestroyDocumentVersion(version.VersionHistoryID);
}


> Back to list of examples

Destroying the version history of a specific page




TreeProvider tree = new TreeProvider(MembershipContext.AuthenticatedUser);

// Gets a page named 'On Roasts'
var page = DocumentHelper.GetDocuments()
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

VersionManager versionManager = VersionManager.GetInstance(tree);

// Destroys the page history
versionManager.DestroyDocumentHistory(page.DocumentID);


> Back to list of examples

Versioning without workflow

Creating a versioned page without workflow




// Creates a new instance of the Tree provider
TreeProvider tree = new TreeProvider(MembershipContext.AuthenticatedUser);

// Gets the current site's root "/" page, which will serve as the parent page
TreeNode parentPage = tree.SelectNodes()
    .Path("/")
    .OnCurrentSite()
    .Culture("en-us")
    .FirstObject;

if (parentPage != null)
{
    // Creates a new page of the "CMS.MenuItem" page type
    TreeNode newPage = TreeNode.New(SystemDocumentTypes.MenuItem, tree);

    // Sets the properties of the new page
    newPage.DocumentName = "Articles";
    newPage.DocumentCulture = "en-us";

    // Inserts the new page as a child of the parent page
    newPage.Insert(parentPage);

    // Manually publishes the page as the page is not using content locking
    newPage.MoveToPublishedStep();
}


> Back to list of examples

Updating a versioned page without workflow




// Gets an article page named 'On Roasts'
TreeNode page = DocumentHelper.GetDocuments("DancingGoat.Article")
    .WhereEquals("DocumentName", "On Roasts")
    .OnSite("DancingGoat")
    .Culture("en-us")
    .FirstObject;

// Note: When updating pages under workflow or versioning, always retrieve pages with all columns to avoid data loss.
// Either call the 'GetDocuments' method with a class name parameter for a specific page type,
// or specify the page types using the 'Types' method and then call 'WithCoupledColumns'.

// Ensures that a new version of the updated page is created (relevant even when not using content locking)
page.CheckOut();

// Sets new value to the 'DocumentName' and 'ArticleTitle'
page.DocumentName = "Updated article name";
page.SetValue("ArticleTitle", "Updated article title");

// Updates the page in the database
page.Update();

// Creates a new version of the updated page
page.CheckIn();


> Back to list of examples