2012-08-15 38 views
6

我開發了一個數據擴展器類,它對GetItem和CheckOutItem命令起作用,以執行一些業務特定的驗證,以確定用戶是否應該有權修改該項目(基本上,如果它已經過了工作流中的初始「作者」任務,沒有人可以編輯它。默認情況下,Tridion允許工作流中的「審閱者」編輯項目,這在我們的業務中是不允許的)。設置IsEditable = false爲項目禁用保存/關閉按鈕但不保存按鈕?

我相對確定這一點有效,但現在沒有。我正在探索可能發生了什麼變化,但我想我會問這裏是否有人有任何想法。

如果項目無法修改,我將IsEditable屬性設置爲false。這實際上禁用了「保存並關閉」按鈕和「保存並新建」按鈕,但出於某種原因,「保存」按鈕處於啓用狀態。我不太明白爲什麼會有差異。 (我正在查看是否有人以某種方式擴展了保存按鈕,但我沒有看到這樣做)。有關如何保存按鈕將啓用時,其他人都沒有想法?

感謝您的任何建議,

〜華納

public override XmlTextReader ProcessResponse(XmlTextReader reader, PipelineContext context) 
{ 
    using (new Tridion.Logging.Tracer()) 
    { 
     string command = context.Parameters["command"].ToString(); 
     if (command == CHECKOUT_COMMAND || command == GETITEM_COMMAND) 
     { 
      XmlDocument xmlDoc = ExtenderUtil.GetExtenderAsXmlDocument(reader); 
      XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable); 
      nsmgr.AddNamespace("tcm", Constants.TcmNamespace); 
      try 
      { 
       //is this a page or component? 
       XmlNode thisItemNode = null; 
       thisItemNode = xmlDoc.SelectSingleNode("//tcm:Component", nsmgr) ?? xmlDoc.SelectSingleNode("//tcm:Page", nsmgr); 
       if (thisItemNode == null) return ExtenderUtil.GetExtenderAsXmlTextReader(xmlDoc); 
       // need to impersonate system admin in order to get workflow version of item later 
       Session sessionSystemAdmin = Util.SystemAdminSession; 
       XmlAttribute idAttribute = thisItemNode.Attributes.GetNamedItem("ID") as XmlAttribute; 
       //if ID attribute is null, we don't have the actual object being used (just a referenced item. so, we'll ignore it) 
       if (idAttribute != null) 
       { 
        string itemId = idAttribute.Value; 
        VersionedItem tridionObject = Util.ObtainValidTridionIdentifiableObject(sessionSystemAdmin, itemId) as VersionedItem; 
        //logic has been moved to separate method, just for maintainablility... 
        //the logic may change when workflow code is finished. 
        bool allowSave = IsItemValidForEdit(tridionObject, nsmgr); 
        if (!allowSave) 
        { 
         //not the WIP ("author") task... make item read-only 
         Logger.WriteVerbose("setting iseditable to false for item: " + itemId); 
         XmlAttribute isEditableAttribute = thisItemNode.Attributes.GetNamedItem("IsEditable") as XmlAttribute; 
         isEditableAttribute.Value = "false"; 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Logger.WriteError("problem with get item data extender", ErrorCode.CMS_DATAEXTENDER_GETITEM_FAILURE, e); 
      } 
      return ExtenderUtil.GetExtenderAsXmlTextReader(xmlDoc); 
     } 
     else 
     { 
      return reader; 
     } 
    } 
} 
+0

我希望你應該設置AllowedActions(太)。但是要深入瞭解JavaScript代碼才能發現問題。 – 2012-08-15 11:47:55

+0

不錯的問題,我們可以讓你感興趣的是承諾[51區Tridion特定提案](http://area51.stackexchange.com/proposals/38335/tridion?referrer=gPujQMxthNCNn9xqeeO2NA2)。如果您有時間,請使用同一個SO帳戶註冊。 – 2012-08-15 11:50:17

+0

@FrankvanPuffelen,這裏是我看到的AllowedActions的XML。任何想法如何理解這是告訴我什麼? 2012-08-15 18:19:16

回答

1

的解決方案是真正在整個解決方案,是絕對肯定的,沒有人偷偷在最近的東西與保存按鈕弄亂,並奇蹟般地使之在幕後。我重新編輯了代碼以顯示我最初是如何使用它的。它確實有效。它將禁用保存,保存/關閉,保存/新建按鈕並禁用所有字段。我很遺憾我浪費了弗蘭克的時間。希望在這裏出於歷史目的可以在將來爲其他有相似要求的人派上用場。

2

大部分外表套上GUI的大概立足它提出的所謂允許的操作選項。這是列表調用(如果請求的話)和項目XML中存在的AllowDeny屬性的組合。

因此,至少您必須從Allow屬性中刪除CheckIn和Edit動作(並可能將它們添加到Deny屬性中)。如果您查看Core Service文檔(或任何其他Tridion API文檔:這些值在很長一段時間內未發生更改),則可以找到一個名爲Actions的Enum,它包含可能的操作及其相應的值。 AllowDeny屬性只是這些數字的增加。

我提到的CheckIn操作是編號爲2,編輯爲2048


更新

我有一點點的命令行程序decode the AllowedActions我。爲了慶祝你的問題,我很快將它轉換成網頁,你可以找到here。主要的工作馬在下面,並顯示如何解碼數字以及如何操縱它。在這種情況下,這是全部減法,但您可以通過向其添加數字來輕鬆添加允許的操作。

var AllowedActionsEnum = { 
    AbortAction:    134217728, 
    ExecuteAction:    67108864, 
    FinishProcessAction:   33554432, 
    RestartActivityAction:  16777216, 
    FinishActivityAction:   8388608, 
    StartActivityAction:   4194304, 
    BlueprintManagedAction:  2097152, 
    WorkflowManagedAction:  1048576, 
    PermissionManagedAction:  524288, 
    EnableAction:     131072, 
    CopyAction:      65536, 
    CutAction:      32768, 
    DeleteAction:     16384, 
    ViewAction:      8192, 
    EditAction:      2048, 
    SearchAction:     1024, 
    RePublishAction:     512, 
    UnPublishAction:     256, 
    PublishAction:     128, 
    UnLocalizeAction:     64, 
    LocalizeAction:     32, 
    RollbackAction:     16, 
    HistoryListAction:     8, 
    UndoCheckOutAction:     4, 
    CheckInAction:      2, 
    CheckOutAction:      1 
}; 
function decode() { 
    var original = left = parseInt(prompt('Specify Allow/Deny actions')); 
    var msg = ""; 
    for (var action in AllowedActionsEnum) { 
     if (left >= AllowedActionsEnum[action]) { 
      msg += '\n' + action + ' ('+AllowedActionsEnum[action]+')'; 
      left -= AllowedActionsEnum[action]; 
     } 
    } 
    alert(original+msg); 
} 
+0

太棒了。現在我有這麼近了。但是,必須承認我的C#noob-ness。我有AllowedActions並可以告訴它是否設置了標誌,但我不確定如何修改AllowedActions以清除該標誌。我沒有看到任何類型的方法。或者,我是否必須轉換爲int並開始計算? 操作aActions = tridionObject.AllowedActions; if(aActions.HasFlag(Actions.CheckIn)) { //不知道這裏發生了什麼...... } – 2012-08-15 20:00:20

+0

Actions就像一個位掩碼,所以你可以簡單地添加/減去你想要的值添加/刪除。我會粘貼一些我編寫的JavaScript代碼。 – 2012-08-15 20:15:29

+0

非常感謝。我認爲這讓我非常接近,但是,我可以清除Edit標誌,但不能簽入。我編輯了上面的代碼以顯示我如何修改它。我在做測試錯了嗎? – 2012-08-15 22:00:33