2016-02-02 9 views
5

適切にキャッシュされたKentico(v8.2.xまたはv9.0)に1つのマクロメソッドを記述しようとしています。 。Kenticoカスタムオブジェクトマクロメソッドのネストされたプロパティへのアクセス

Visual Studioでデバッグすると、クエリが正常に実行されていることがわかり、オブジェクトのインスタンスが正確に返されます。さらに、KenticoのDebugアプリケーションを使用してキャッシュされたアイテムを調べると、完全なPOCOインスタンスデータが期待どおりにキャッシュされていることもわかります。

しかし、マクロを呼び出すとき、私はオブジェクトの文字列表現を読むことができるようです。

それはCurrentUserInfo型を拡張マクロですので、私はこのようにそれを起動しようとしています:

{% CurrentUser.ClientStatus() %} 

しかし、ネストされたプロパティのいずれかが失敗した取得しようとします。

私はそれが私が(これらのプロパティを正しく登録するような)何かをしなかったことは確信しています。しかしdocumentationから、私はであることができることの多くを見ました。たとえば:

    ソース
  • 名前のコールバック源名前
  • 匿名ソース
  • それともここで何とか

別々のフィールドとしてそれらを登録するには、マクロそのものです:

/// <summary> 
/// A class containing custom user-extension macros. 
/// </summary> 
[assembly: RegisterExtension(typeof(CustomUserMacros), typeof(CurrentUserInfo))] 
public class CustomUserMacros : MacroMethodContainer 
{ 
    /// <summary> 
    /// Retrieves data regarding user client. 
    /// </summary> 
    /// <param name="context">The context.</param> 
    /// <param name="parameters">The parameters.</param> 
    /// <returns>Data regarding user client information.</returns> 
    [MacroMethod(typeof(ClientInfo), "Retrieves client info.", 1)] 
    [MacroMethodParam(0, "user", typeof(CurrentUserInfo), "The user.")] 
    public static object ClientStatus(
      EvaluationContext context, 
      params object[] parameters) 
    { 
     ClientInfo retVal = null; 
     if (parameters != null && parameters.Length > 0 
       && parameters[0].GetType() == typeof(CurrentUserInfo)) 
     { 
      var siteName = SiteContext.CurrentSiteName; 
      var userGuid = ((CurrentUserInfo)parameters[0]).UserGUID; 
      var uInfo = UserInfoProvider.GetUserInfoByGUID(userGuid); 
      retVal = CacheHelper.Cache(
       cs => new ClientInfo(uInfo, siteName), 
       new CacheSettings(
        60, 
        typeof(CustomUserMacros), 
        "ClientStatus", 
        userGuid)); 
     } 

     return retVal; 
    } 
} 

そしてClientInfo clお尻はかなり単純明快です:

public class ClientInfo 
{ 
    public string Summary { get; private set; } 

    public CustomTableItem ClientRecord { get; private set; } 

    public IEnumerable<string> MediaPaths { get; private set; } 

    public ClientInfo(UserInfo userInfo, string siteCodeName) { 
     // ... 
     // Set properties, etc... 
    } 

    public override string ToString() 
    { 
     return Summary; 
    } 
} 

私は次のような方法で、プロパティにアクセスできるようにするための最も簡単な方法は何ですか?

{% CurrentUser.ClientStatus().ClientRecord["< Column Name >"] %} 
+0

を、私は私の場合には、このすべてが、代わりにカスタムモジュールでおそらく最高のオフだと思います。それにもかかわらず、私はK#マクロが好きなのでここで質問を残します。そして、私は上記のことをどのように働かせるかを理解することは依然として有用であると信じています! – ne1410s

+0

良い質問です!マクロに関するドキュメントは少し複雑ですが、これは私が過去にしてきたいくつかの質問に対処しています。 –

答えて

5

を、親オブジェクトは、DataRowまたはDataRowViewタイプであるかのいずれかを実装する必要があります次のインターフェイス:IVirtualHierarchicalObjectIHierarchicalObjectIDataContainerISimpleDataContainer

あなたの場合、ClientInfoIDataContainerを実装する必要があります。入れ子になったCustomTableItemは、AbstractInfoから継承したインターフェイスの1つを既に実装しています。あなたは主に、パラメータで動作する複数のメンバーを実装する必要があります

は、値を返す必要がありますメンバーを特定columnNameと呼ばれる:

public class ClientInfo : IDataContainer 
{ 
    ... 
    public object GetValue(string columnName) 
    { 
     switch (columnName) 
     { 
      case "ClientRecord": 
       return ClientRecord; 

      case "Summary": 
       return Summary; 

      case "MediaPaths": 
       return MediaPaths; 
     } 
     return null; 
    } 
    ... 
} 
+0

私はすべてのインターフェイスメンバーを( 'set'ものを除いて)実装しました。それは魅力のように機能します!本当にありがとう – ne1410s

-2

まず、システム - >マクロ - >コンソールを使用してマクロをテストすることをお勧めします。非常に便利です。 あなたのケースでは、あなたがこのようなプロパティにアクセスすることができる必要があります:あなたが記述の方法でプロパティにアクセスできるようにするに

{% CurrentUser.ClientStatus().Summary %} 
0

は、おそらくこのケースで働いていたが、注目に値するだけでなく、そのていないだろうあなたがCMS.Base.DataContainerIEnumerable<CMS.Base.DataContainer>を使用した簡単なオブジェクト値を返すことができます。さらに読み

return myCollection.Select(myObj => new DataContainer 
       { 
        ["Value1"] = myObj.Value1, 
        ["Value2"] = myObj.Value2 
       }); 
関連する問題