0

我有一组用于页面编辑器字段的自定义按钮,我想根据加载时的条件禁用其中一些按钮。有没有办法做到这一点?当直接转到包含该字段的模板中的该字段时,此按钮是使用“页面编辑器”的多列表选项设置的。

4

2 回答 2

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”;
                                });
            }
        }
    }
}
于 2013-05-08T21:27:00.487 回答
1

您是否考虑过使用 Sitecore 规则引擎来满足这一要求?查看 Sitecore 客户端的基于规则的用户界面组件,详细了解如何实现这一点。

于 2013-05-09T18:09:21.253 回答