【问题标题】:Disabling a button for page editor for a field based on a certain condition根据特定条件禁用字段的页面编辑器按钮
【发布时间】:2013-05-08 21:15:46
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net content-management-system sitecore sitecore6


    【解决方案1】:

    如果它是页面编辑器本身(功能区)内的按钮,您可以为此覆盖 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

    [编辑]
    我可能误解了 - 如果它是字段类型的按钮,您可能会喜欢this article。它没有显示如何隐藏按钮,但您可以使用 public override void HandleMessage(Message message) 方法做一些事情,至少可以忽略它。

    [编辑]
    另一个编辑,这应该允许您检查字段 ID 或名称。

    您可以更改或添加到getChromeData 管道。例如,您可以覆盖 GetFieldChromeData 类中的 Process 方法。
    此类生成在/sitecore/content/Applications/WebEdit/Common field buttons 的Core 数据库中定义的按钮。您可以在那里添加条件,而不是添加所有这些。
    获得按钮后,您可以在添加之前根据字段 ID 或字段名称删除不需要的按钮。

    [最终编辑]
    我写了一个比上面的编辑更优雅的解决方案。你可以阅读它here。 简而言之,我没有覆盖 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”;
                                    });
                }
            }
        }
    }
    

    【讨论】:

    • 嗯 - 问题是这是用于页面编辑器的文本字段 (sc:text),我在三个不同的地方有相同的文本字段。似乎只有最后一个文本字段的按钮被禁用,因为它们可能都是相同的命令。
    • 检查最终编辑 - 这将解决隐藏在该类型的所有字段中的命令问题。
    【解决方案2】:

    您是否考虑过使用 Sitecore 规则引擎来满足这一要求?请查看Rule-Based User Interface Components for the Sitecore Client,了解如何实现这一点的详细说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多