【问题标题】:setting IsEditable=false for item disables save/close button but not save button?为项目禁用的保存/关闭按钮设置 Editable=false 但不是保存按钮?
【发布时间】:2012-08-11 17:02:59
【问题描述】:

我开发了一个数据扩展器类,它作用于 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;
        }
    }
}

【问题讨论】:

  • 我希望您也应该设置 AllowedActions。但这需要深入研究 JavaScript 代码才能找到答案。
  • 问得好,我们是否有兴趣提交Area 51 Tridion specific proposal。如果有时间,请使用同一个 SO 帐户注册。
  • @FrankvanPuffelen,这是我看到的 AllowedActions 的 XML。知道如何理解这告诉我的内容吗?
  • 允许的操作是操作值的集合。如果您在 API 文档(例如核心服务 CHM)中查找值,您将找到所有值。这是从上面的属性中解构值的问题。例如。 8402952 解构为“FinishActivityAction、ViewAction、EditAction、SearchAction、RePublishAction、UnPublishAction、PublishAction、UnLocalizeAction、LocalizeAction、RollbackAction、HistoryListAction、UndoCheckOutAction、CheckInAction、CheckOutAction”,因此从中删除 CheckInAction (2) 可能会禁用 CheckIn 按钮。
  • 谢谢@FrankvanPuffelen,这给了我一些好的继续。虽然我想要的不是签入按钮,但它是保存按钮。但是,也许禁用签入会帮助我完成这一点。

标签: tridion


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    我提到的 CheckIn 操作是数字 2,Edit 是 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);
    }
    

    【讨论】:

    • 太棒了。哦,现在离我太近了。但是,必须承认我的 C# 菜鸟。我有 AllowedActions 并且可以判断它是否设置了标志,但我不确定如何修改 AllowedActions 以清除该标志。我没有看到任何方法。或者,我是否必须转换为 int 并开始做数学?动作 aActions = tridionObject.AllowedActions; if (aActions.HasFlag(Actions.CheckIn)) { //不确定这里发生了什么... }
    • 动作就像一个位掩码,因此您可以简单地添加/减去您想要添加/删除的值。我将粘贴一些我编写的用于执行此操作的 JavaScript。
    • 非常感谢。我认为它让我非常接近,但是,我能够清除 Edit 标志,但不能清除 CheckIn。我编辑了上面的代码以显示我是如何修改它的。我做错了吗?
    • 弗兰克,我想我正在做我应该做的,但它不起作用。我什至尝试将允许的操作明确设置为仅 Actions.View 并拒绝对大多数其他所有操作,它仍然启用保存按钮。可以运行其他东西来覆盖它吗?
    • 您是否已经查看了处理这些 AllowedAction 的 JavaScript 代码,看看为什么它不应用它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多