2015-11-19 59 views
3

我有使用Kentico表單構建器構建的自定義表單。在我的表單中,我通過外鍵引用了一個自定義表...這意味着我的表單存儲了對我的自定義表數據的引用。在我的自動回覆中,有什麼方法可以使用我的表單中的id值從我的自定義表中檢索實際值?在表單構建器自動響應器中查詢自定義表格

回答

3

您可以通過creating a custom macro做到這一點,它接受FK值作爲參數,查找自定義表中的相應記錄,並將該記錄中的字段作爲字符串返回。然後,您只需在自動回覆編輯器中使用宏 - 與您在其他地方所用的相同 - 並傳入$$標籤:FieldName $$作爲參數。

其中最難的部分是使用Kentico的API從定製表中獲取數據。 Here are some examples for managing custom table data using their API。這不是那麼難,只需要多一點代碼就可以了。

就我個人而言,我更喜歡爲我的自定義表創建實體或LINQtoSQL類,並使用它們,特別是如果它是我將要使用的很多表。唯一真正失去的是對其他CMS功能的內置調用,比如更新智能搜索索引,我認爲將事件記錄到登臺模塊中,如果需要,以後都可以添加到這兩個模塊中。

+1

而不是使用實體或LINQ,你可能會看自定義表的代碼選項卡上由Kentico自動生成的代碼。您不僅失去了CMS功能,而且還失去了內置緩存。恕我直言,使用API​​是一種更好的方法,因爲您可以擁有隨之而來的所有其他好處。雖然用自定義宏方法很好的答案。 –

+0

@BrendenKehren我同意,堅持API。 Jerreck很好的回答:自定義宏,我提供了一些代碼來演示該解決方案。 –

1

傑瑞克是正確的,你可以用自定義宏來做到這一點。

如果您打算製作自定義宏,我建議您將自定義宏設置爲可重用,並將其傳遞給其他幾個參數。例如;

customTableItemID = 231;  
customTableCodeName = "customtable.TableName";  
customTableReturnColumnName = "DisplayName"; 

至少這樣你可以重新使用其他自定義表格相同的自定義宏,並從表中返回不同的領域。

假設您使用的是Kentico v8,以下代碼適用於我;

CustomMacroMethods.cs

using System; 
using CMS.Base; 
using CMS.MacroEngine; 
using CMS.Helpers; 
using CMS.CustomTables; 

//declare CustomMacroNamespace 
[Extension(typeof(CustomMacroMethods))] 
public class CustomMacroNamespace : MacroNamespace<CustomMacroNamespace> 
{ 
} 

//register CustomMacroNamespace into the macro engine 
[MacroNamespaceLoader] 
public partial class CMSModuleLoader 
{ 
    /// <summary> 
    /// Attribute class that ensures the registration of custom macro namespaces. 
    /// </summary> 
    private class MacroNamespaceLoaderAttribute : CMSLoaderAttribute 
    { 
     /// <summary> 
     /// Called automatically when the application starts. 
     /// </summary> 
     public override void Init() 
     { 
     // Registers "CustomNamespace" into the macro engine 
      MacroContext.GlobalResolver.SetNamedSourceData("CustomMacroNamespace", CustomMacroNamespace.Instance); 
     } 
    } 
} 

//declare custom macro methods 
public class CustomMacroMethods : MacroMethodContainer 
{ 

    [MacroMethod(typeof(object), "Returns the Value of a Column in a Custom Table as an object.", 3)] 
    [MacroMethodParam(0, "CustomTableCodeName", typeof(string), "The Custom Table code name. Eg customtable.TableName")] 
    [MacroMethodParam(1, "CustomTableItemID", typeof(int), "The ID of the to return.")]  
    [MacroMethodParam(2, "CustomTableReturnColumnName", typeof(string), "The field name of the column containing the value to return")] 
    public static object GetCustomTableValue(EvaluationContext context, params object[] parameters) 
    { 
    if (parameters.Length == 3) 
    { 

     string customTableCodeName = ValidationHelper.GetString(parameters[0], ""); 
     int customTableID = ValidationHelper.GetInteger(parameters[1], -1); 
     string customTableReturnFieldName = ValidationHelper.GetString(parameters[2], ""); 

     CustomTableItem cti = CustomTableItemProvider.GetItem(customTableID, customTableCodeName); 
     if (cti != null) 
     { 
      return cti.GetValue(customTableReturnFieldName); 
     } 
     else 
     { 
      return null; 
     } 
    } 
    else 
    { 
     throw new NotSupportedException("Custom macro GetCustomTableValue() requires three parameters"); 
    } 

    } 

} 

使用

{% CustomMacroNamespace.GetCustomTableValue("customtable.TableName", 1, "DisplayName") #%} 

請參考更多信息的文檔。 https://docs.kentico.com/display/K8/Registering+custom+macro+methods https://docs.kentico.com/display/K8/Creating+macro+namespaces