6

我开发了一个数据扩展器类,它作用于 GetItem 和 CheckOutItem 命令来执行一些特定于业务的验证,以确定用户是否应该有权修改项目(基本上,如果它超过了工作流中的初始“作者”任务,没有人可以编辑它。默认情况下,Tridion 允许工作流程中的“审阅者”编辑项目,这在我们的业务中是禁止的)。

我相对肯定这在某一时刻有效,但现在没有。我正在探索可能发生了什么变化,但我想我会在这里问一下,以防有人知道。

如果无法修改该项目,我将 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;
        }
    }
}
4

2 回答 2

2

大多数 Tridion GUI 可能基于所谓的允许操作提供的选项。这是列表调用(如果请求)和项目 XML 中存在的AllowDeny属性的组合。

因此,至少您必须从Allow属性中删除 CheckIn 和 Edit 操作(并可能将它们添加到Deny属性中)。如果您查看核心服务文档(或任何其他 Tridion API 文档:这些值已经很长时间没有更改),您可以找到一个名为 Enum 的调用Actions来保存可能的操作及其对应的值。AllowDeny属性只是这些数字的加法。

我提到的 CheckIn 操作是 number 2, Edit 是2048


更新

我有一个小命令行程序来为我解码 AllowedActions为了庆祝您的问题,我迅速将其转换为您可以在此处找到的网页。下面是主要的工作马,展示了如何解码数字以及如何操作它。在这种情况下,这都是减法,但您可以通过向其添加数字来轻松添加允许的操作。

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);
}
于 2012-08-15T19:05:10.077 回答
1

解决方案是真正查看整个解决方案,并绝对肯定最近没有人偷偷插入一些与保存按钮混淆的东西,并在幕后神奇地启用它。我重新编辑了代码以显示我最初是如何拥有它的。它确实有效。它将禁用保存、保存/关闭、保存/新建按钮并禁用所有字段。我很抱歉浪费了弗兰克的时间。希望出于历史目的而将其放在这里可能会对将来有类似要求的其他人派上用场。

于 2012-08-16T18:04:48.127 回答