6

サブレイアウトに適用されたレンダリング パラメータ テンプレートがあります。そこには 1 つのドロップツリー フィールドがあり、そのフィールドのソースを 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 を使用しています)

4

2 に答える 2

7

残念ながら、Adam Najmanowicz の回答で言及されているパイプラインは、Droplink や Multilist などの他のタイプでも機能しますが、パイプラインは Droptree フィールドでは実行されません。

これをさらに詳しく調べたところ、Adam が述べたように、ドロップツリー フィールドのソースが間違ったコンテキスト アイテムを使用していることがわかりましたが、コードはドロップツリー フィールド自体から来ています。

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

Adam の回答のクエリ文字列コードを利用して、通常のドロップツリーとほぼ同じですが、代わりに正しいコンテキスト アイテムを使用する「固定」ドロップツリー カスタム フィールドを作成できます。コードは通常の Tree コントロールから継承し、Source プロパティの設定方法のみを変更します。

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 プロパティとほぼ同じですが、レンダリング パラメーター ダイアログにいることを検出した場合に、URL から適切なコンテキスト アイテムを見つけ出す点が異なります。

カスタム フィールドを作成するには、ここで説明されているように Web.Config ファイルを編集するだけです。次に、ここで説明されているように、コア データベースにカスタム フィールドを追加します。

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

于 2013-08-05T14:13:16.190 に答える
5

ここで重要なのは、フィールド エディターのコンテキストを、レンダリング パラメーター (デフォルトであると思います) ではなく、編集中のアイテムに相対的に設定することです。したがって、プロセッサを使用できます。

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;
        }
    }
}

次のようにフックされます:

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

Przemek のブログの ResolveQueryableDatasources と一緒に使用すると、問題が解決するはずです。

于 2013-08-05T07:38:14.087 に答える