2008年8月22日 星期五

MCMS 系統 Save 及 Publish Posting 程式開發指引

在 MCMS 系統中,如果要以程式的方式來建立或修改 Posting,必須透過一定的流程。然而,因為相關的資訊及文件十分缺乏,導致我自行摸索了許久,以下便將心得與大家分享。

在程式進行 MCMS 的 Posting 更新時,首先必須切換至 MCMS 的編輯模式,此時便需要進行身份驗證的動作。在開發 ASP.NET 程式時,我們通常會以目前 access 頁面的使用者帳戶直接進行驗證,以確定該名使用者具有足夠的權限進行後續操作,要達到上述的目的,請參考以下的程式碼片段:

WindowsIdetity wi = HttpContext.Current.User.Identity as WindowsIdentity;
CmsApplicationContext cac = new CmsApplicationContext();
cac.AuthenticateUsingUserHandle( wi.Token, PublishingMode.Update );


進行身份驗證並切換至編輯模式後,接下來,便是取得欲更新的 Posting 標的,在 MCMS 系統當中,針對每一 Posting 均會維護數種版本,包括歷次發佈的歷史版本等。因為我們是要針對某篇 Posting 做更新動作,所以應當取出該篇 Posting 的最新版本來更新,若先前切換成編輯模式成功,則取出某篇 Posting 的最新版本便輕而易舉,直接呼叫 CmsApplicationContext 物件的 Searches 類別方法即可:

Posting p = cac.Searches.GetByPath( "Posting Path" ) as Posting;

有些時候,你可能會想在同一個操作頁面秀出目前的發佈版本及目前編輯的最新版本,以作為交互比對之用,此時便需要取出上一次發佈的 Posting 版本,該怎麼做呢?請參考以下程式碼:

Posting p = cac.Searches.GetByPath( "Posting Path" ) as Posting;
PostingCollection pc = p.Revisions( true );
p = pc[pc.Count - 1];


一開始,同樣是呼叫 CmsApplicationContext 物件的 Searches 類別方法取出 Posting 物件,就跟取出最新版本的例子一樣,但是接下來,則呼叫 Posting 的 Revisoins 方法取出 PostingCollection 陣列物件。我們在此是傳入 true 當參數,用以取得該 Posting 以前所有發佈過的版本。最後,從回傳的 Posting 陣列中取出最後一個 Posting 物件,即是最近一次的發佈版本了!

再來,便是設定更新值的處理。在 MCMS 的 Posting 中,真正儲存資料的地方是 Placeholder(一篇 Posting 通常會包含數個 Placeholder 以存放資料,端看產生此篇 Posting 的 Template 如何設計而定),以下便以 XmlPlaceholder 為例,示範如何撰寫更新動作的程式碼:

XmlPlaceholder xp = p.Placeholder["Placeholder name"] as XmlPlaceholder;
xp.XmlAsString = "Your new xml content";


在更新動作完成後,有兩種選擇,一是將更新儲存但保持未發佈狀態,二是直接將更新後的 Posting 發佈。前者只會建立一新版本的 Posting 並保存更新狀態,真正供一般使用者瀏覽的 Posting 版本仍是上次發佈的版本。先示範儲存的寫法:

cac.CommitAll();

非常簡單,僅需呼叫 CmsApplicationContext 物件的 CommitAll 方法。再來示範直接發佈的寫法:

if( p.CanSubmit ) { p.Submit(); }
if( p.CanApprove ) { p.Approve(); }
cac.CommitAll();


欲直接發佈 Posting 時,要先呼叫該 Posting 物件的 Submit 方法,再呼叫 Approve 方法,最後跟儲存時的寫法一樣,呼叫 CmsApplicationContext 物件的 CommitAll 方法作為結束。上述的程式碼片段,使用了 CanSubmit 和 CanApprove 兩個 Posting 屬性做確認動作,可防止因登入使用者權限不足而導致的例外錯誤擲出。

以上,便是在撰寫 MCMS Posting 更新程式時的主要關鍵步驟,供大家參考。

[re-post this article due to database crash.]

沒有留言: