我有一组用于页面编辑器字段的自定义按钮,我想根据加载时的条件禁用其中一些按钮。有没有办法做到这一点?当直接转到包含该字段的模板中的该字段时,此按钮是使用“页面编辑器”的多列表选项设置的。
2 回答
如果它是页面编辑器本身(功能区)内的按钮,您可以覆盖该QueryState
方法 - 让它返回 false 以禁用按钮,返回 true 以启用它。
方法是public override CommandState QueryState(CommandContext context)
您可以执行以下操作:
public override CommandState QueryState(CommandContext context)
{
var field = (MultilistField)context.Items[0].Fields["Fieldname"];
var selected = field.GetItems();
// Check whether the correct ones are selected. If so, return true - else false
}
您还可以隐藏按钮 - 使用CommandState.Hidden
[编辑]
我可能误解了 - 如果它是字段类型的按钮,您可能会喜欢这篇文章。它没有显示如何隐藏按钮,但您可以使用该public override void HandleMessage(Message message)
方法做一些事情,至少忽略它。
[编辑]
另一个编辑,这应该允许您检查字段 ID 或名称。
您可以更改或添加到getChromeData
管道。例如,您可以覆盖类Process
中的方法GetFieldChromeData
。
此类生成在 Core 数据库中定义的按钮/sitecore/content/Applications/WebEdit/Common field buttons
。您可以在那里添加条件,而不是添加所有这些。
获得按钮后,您可能会在添加之前根据字段 ID 或字段名称删除不需要的按钮。
[最终编辑]
我写了一个比上面的编辑更优雅的解决方案。你可以在这里阅读。简而言之,我没有覆盖 Sitecore 代码,而是向管道添加了一个处理器,并根据字段标题和同一项目上另一个字段的值删除了按钮。
public class RemoveButtons : GetChromeDataProcessor
{
public override void Process(GetChromeDataArgs args)
{
Assert.ArgumentNotNull(args, “args”);
Assert.IsNotNull(args.ChromeData, “Chrome Data”);
if (“field”.Equals(args.ChromeType, StringComparison.OrdinalIgnoreCase))
{
Field argument = args.CustomData["field"] asField;
Assert.ArgumentNotNull(argument, “CustomData[\"{0}\"]“.FormatWith(new object[] { “field” }));
if (argument.Name == “Title” && MainUtil.GetBool(argument.Item["NeedsToBeCheckedToPersonalize"], false))
{
args.ChromeData.Commands.RemoveAll(delegate(WebEditButton b)
{
return b.Header == “Personalize”;
});
}
}
}
}
您是否考虑过使用 Sitecore 规则引擎来满足这一要求?查看 Sitecore 客户端的基于规则的用户界面组件,详细了解如何实现这一点。