2013-08-02 8 views
6

レンダリングパラメータテンプレートがサブレイアウトに適用されています。それには単一のDroptreeフィールドがあり、そのフィールドのSourceをSitecoreクエリに設定して、そのフィールドで使用可能なオプションを制限することができます。レンダリングパラメータテンプレートフィールドでクエリ可能なソースを設定する

ソースが使用できます

query:./*

または

query:./ancestor-or-self::*[@@templatename='MyTemplate']/

クエリはちょうど私達がにしているコンテンツ項目に対する項目をつかむ必要があります。これは、通常、コンテンツエディタのDroptreeフィールドで機能します。

しかし私は、レンダリングパラメータにあるため、ここではクエリが機能していないことがわかりました。したがって、コンテンツアイテムをコンテキストとして使用していません。 クエリが失敗し、完全なSitecoreツリーが取得されました。

は、私がこのリンクで「 照会可能データソースの場所」がデータソースのフィールド用に固定することができますが見つかりました: - この他のレンダリングのための作業を取得するために開始する場所を http://www.cognifide.com/blogs/sitecore/reduce-multisite-chaos-with-sitecore-queries/

は、しかし、私は知りませんパラメータフィールド。

アイデア? (私はSitecore 6.6 Update 5を使用しています)

+0

このフィールドでデータソースを「設定」タイプのアイテムにすると、説明したようにクエリソースを持つ通常のDroptreeコントロールを持つことができます。さらに、データソースに固執しているので、コントロールは簡単にパーソナライズ可能で、多変量​​テスト可能です。 –

+0

パーソナライズとテストのことは真ですが、このコントロールは既にコントロールの別のプロパティとしてDataSourceフィールドを使用しています。しかし、唯一の選択可能なプロパティであればDataSourceを代わりに使用できます。 –

答えて

7

残念ながら、Adam Najmanowicz's answerに記載されているパイプラインは、DroplinkやMultilistのような他のタイプでも機能しますが、パイプラインはDroptreeフィールドでは実行されません。

この深くに見た後、私はアダムが述べたようにDroptreeフィールドのソースは、間違ったコンテキスト項目を使用していることがわかったが、コードはDroptreeフィールド自体から来ている: -

Sitecore.Shell.Applications.ContentEditor.Tree, Sitecore.Kernel

活用しますAdamの回答のクエリ文字列コードでは、通常のDroptreeとほぼ同じですが、代わりに正しいコンテキスト項目を使用する、固定のDroptreeカスタムフィールドを作成できます。 コードは通常のTreeコントロールを継承し、Sourceプロパティの設定方法のみを変更します。私たちは私たちがしていることを検出した場合、我々はURLから適切なコンテキスト項目を見つけ出すことを除いて

public class QueryableTree : Sitecore.Shell.Applications.ContentEditor.Tree 
{ 
    // override the Source property from the base class 
    public new string Source 
    { 
     get 
     { 
      return StringUtil.GetString(new string[] 
      { 
       base.Source  // slightly altered from the original 
      }); 
     } 
     set 
     { 
      Assert.ArgumentNotNull(value, "value"); 
      if (!value.StartsWith("query:", StringComparison.InvariantCulture)) 
      { 
       base.Source = value;   // slightly altered from the original 
       return; 
      } 
      Item item = Client.ContentDatabase.GetItem(this.ItemID); 

      // Added code that figures out if we're looking at rendering parameters, 
      // and if so, figures out what the context item actually is. 
      string url = WebUtil.GetQueryString(); 
      if (!string.IsNullOrWhiteSpace(url) && url.Contains("hdl")) 
      { 
       FieldEditorParameters parameters = FieldEditorOptions.Parse(new UrlString(url)).Parameters; 
       var currentItemId = parameters["contentitem"]; 
       if (!string.IsNullOrEmpty(currentItemId)) 
       { 
        Sitecore.Data.ItemUri contentItemUri = new Sitecore.Data.ItemUri(currentItemId); 
        item = Sitecore.Data.Database.GetItem(contentItemUri); 
       } 
      } 

      if (item == null) 
      { 
       return; 
      } 
      Item item2 = item.Axes.SelectSingleItem(value.Substring("query:".Length)); 
      if (item2 == null) 
      { 
       return; 
      } 
      base.Source = item2.ID.ToString();   // slightly altered from the original 
     } 
    } 

上記のコードは、かなりのベースツリーフィールド上のSourceプロパティと同じですレンダリングパラメータダイアログ。

カスタムフィールドを作成するには、Web.Configファイルをhereのように編集する必要があります。次に、hereの説明に従って、カスタムフィールドをコアデータベースに追加します。

これは、パラメータがソースのクエリを持つようになり、利用可能なアイテムをコンテンツエディタに制限できるようになりました。 (マルチサイトソリューションに便利です)。

5

ここで重要なのは、フィールドエディタのコンテキストを、レンダリングパラメータ(デフォルトでは持っていると思う)ではなく、編集しているアイテムに相対的に設定することです。これはあなたの問題を解決する必要がありPrzemekさんのブログからResolveQueryableDatasourcesと一緒

<sitecore> 
    <pipelines> 
    <getLookupSourceItems> 
    <processor patch:before="*[@type='Sitecore.Pipelines.GetLookupSourceItems.ProcessQuerySource, Sitecore.Kernel']" 
     type="Cognifide.SiteCore.Logic.Processors.ResolveRelativeQuerySource, Cognifide.SiteCore" /> 
    </getLookupSourceItems> 
    </pipelines> 
</sitecore> 

public class ResolveRelativeQuerySource 
{ 
    public void Process(GetLookupSourceItemsArgs args) 
    { 
     Assert.IsNotNull(args, "args"); 
     if (!args.Source.StartsWith("query:")) 
      return; 
     Item contextItem = null; 
     string url = WebUtil.GetQueryString(); 
     if (!string.IsNullOrWhiteSpace(url) && url.Contains("hdl")) 
     { 
      FieldEditorParameters parameters = FieldEditorOptions.Parse(new UrlString(url)).Parameters; 
      var currentItemId = parameters["contentitem"]; 
      if (!string.IsNullOrEmpty(currentItemId)) 
      { 
       Sitecore.Data.ItemUri contentItemUri = new Sitecore.Data.ItemUri(currentItemId); 
       contextItem = Sitecore.Data.Database.GetItem(contentItemUri); 
      } 
     } 
     else 
     { 
      contextItem = args.Item; 
     } 
    } 
} 

として夢中: は、だから、プロセッサを持つことができます。

+1

別の質問ですが、私は一日中苦労していた問題を間違いなく解決しましたので、大変ありがとうございます=)http://sdn.sitecore.net/forum/ShowPost.aspx?PostID=62695#62695 – getsetcode

関連する問題