设置IsEditable = false表示项目禁用保存/关闭按钮但不保存按钮?

时间:2012-08-15 11:43:18

标签: tridion

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

2 个答案:

答案 0 :(得分:2)

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

因此,您至少必须从Allow属性中删除CheckIn和Edit操作(并可能将它们添加到Deny属性中)。如果您查看Core Service文档(或任何其他Tridion API文档:这些值在很长时间内没有更改),您可以找到一个名为Actions的枚举,其中包含可能的操作及其相应的值。 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);
}

答案 1 :(得分:1)

解决方案是真正查看整个解决方案,并且绝对肯定的是,最近没有人在使用“保存”按钮搞砸某些东西并在幕后神奇地启用它。我重新编辑了代码,以显示我最初的代码。它确实有效。它将禁用保存,保存/关闭,保存/新按钮并禁用所有字段。对不起,我浪费了弗兰克的时间。希望将此用于历史目的可能会对将来有类似要求的其他人派上用场。