我开发了一个数据扩展器类,它作用于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;
}
}
}
答案 0 :(得分:2)
Tridion GUI的大多数可能基于它在所谓的允许操作上呈现的选项。这是列表调用(如果请求)和项目XML中存在的Allow
和Deny
属性的组合。
因此,您至少必须从Allow
属性中删除CheckIn和Edit操作(并可能将它们添加到Deny
属性中)。如果您查看Core Service文档(或任何其他Tridion API文档:这些值在很长时间内没有更改),您可以找到一个名为Actions
的枚举,其中包含可能的操作及其相应的值。 Allow
和Deny
属性只是添加这些数字。
我提到的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)
解决方案是真正查看整个解决方案,并且绝对肯定的是,最近没有人在使用“保存”按钮搞砸某些东西并在幕后神奇地启用它。我重新编辑了代码,以显示我最初的代码。它确实有效。它将禁用保存,保存/关闭,保存/新按钮并禁用所有字段。对不起,我浪费了弗兰克的时间。希望将此用于历史目的可能会对将来有类似要求的其他人派上用场。