2013-05-08 51 views
0

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

回答

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

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

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

您可以更改或添加到getChromeData管道。例如,您可以覆盖GetFieldChromeData类中的Process方法。
此类生成在/sitecore/content/Applications/WebEdit/Common field buttons的核心数据库中定义的按钮。与其添加所有这些,你可以在那里添加条件。
获得按钮后,可能会在添加按钮之前,根据字段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”; 
           }); 
      } 
     } 
    } 
} 
+0

嗯 - 问题是,这是一个文本字段(sc:文本)的页面编辑器,我有三个不同的地方相同的文本字段。似乎只有最后一个文本字段的按钮被禁用,因为它们可能都是相同的命令。 – 2013-05-08 22:34:59

+0

检查第二次编辑 - 这可能会帮助您 – Trayek 2013-05-09 10:28:32

+0

检查最终编辑 - 这将修复隐藏在该类型的所有字段上的命令问题。 – Trayek 2013-05-09 16:55:09

相关问题