2013-05-08 71 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

相關問題