1

クライアントから次の要件があります。

Web サイト ページの一部となるサブ レイアウトに、アイテムのセットをリストする必要があります。

それらのアイテムはニュースレターを構成します。

各アイテム (「記事」) をリストする必要があります (記事の名前 + 記事を表示するためのリンク) ここでのロジックは何ですか? それらの記事を取得するにはどうすればよいですか? それを特定のフォルダーに作成し、C# でフォルダーを解析する必要がありますか? ニュースレター アイテム自体を解析/調べることで、アイテム パスを取得できますか?

ありがとうございました、

4

3 に答える 3

1

索引の使用

最適化のために、おそらくリストしたい項目のインデックスを作成したいと思うでしょう。なくても構いませんが、多数の記事でパフォーマンスの問題が発生し始めます。

次のコード ブロックは、インデックスから項目を読み込む 1 つの方法の例を示しています。グーグルで検索すると、特にAdvanced Database Crawlerを使用して、これに関する多くの情報を見つけることができます。

    /// <summary>
    /// Searches against the Lucene index for all articles
    /// </summary>
    /// <returns></returns>
    private List<Item> LoadArticlesWithLucene()
    {
        ConcurrentBag<Item> articles = new ConcurrentBag<Item>();

        Index searchIndex = SearchManager.GetIndex("MyArticleIndexName");
        using (IndexSearchContext context = searchIndex.CreateSearchContext())
        {
            //The wildcard search allows us to pull back all items from the index
            var query = new WildcardQuery(new Term(Constants.LuceneFields.Name, "*"));
            SearchHits hits = context.Search(query);

            //Go through the results 
            SearchResultCollection results = hits.FetchResults(0, hits.Length);

            Parallel.ForEach(results, result =>
            {
                //This is done in a foreach in case you want to add any processing or checking before adding to your collection
                Item searchItem = result.GetObject<Item>();
                articles.Add(searchItem);
            });


        }

        return articles.ToList();
    }

引き続きインデックスを作成する必要があります。高度なデータベース クローラー モジュールを使用している場合は、次のような構成を Sitecore インスタンスに追加するだけです。

    <search>
        <configuration>
            <indexes>
                <index id="MyArticleIndexName" type="Sitecore.Search.Index, Sitecore.Kernel">
                    <param desc="name">$(id)</param>
                    <param desc="folder">__news</param>
                    <Analyzer ref="search/analyzer" />
                    <locations hint="list:AddCrawler">
                        <master type="scSearchContrib.Crawler.Crawlers.AdvancedDatabaseCrawler,scSearchContrib.Crawler">
                            <Database>master</Database>
                            <Root>/sitecore/content</Root>
                            <IndexAllFields>true</IndexAllFields>
                            <include hint="list:IncludeTemplate">
                                <article>{3DD181B0-0F39-4E7A-8C94-DFA129DE6C81}</article> <!-- Replace the GUID here with yours -->
                            </include>
                            <fieldTypes hint="raw:AddFieldTypes">
                                <!-- Multilist based fields need to be tokenized to support search of multiple values -->
                                <fieldType name="multilist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                                <fieldType name="treelist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                                <fieldType name="treelistex" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                                <fieldType name="checklist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                            </fieldTypes>
                        </master>
                    </locations>
                </index>
            </indexes>
        </configuration>
    </search>

インデックスなしで Sitecore からプルする

インデックスなしで Sitecore から取得する場合、特定のテンプレート ID または名前 (記事テンプレート) を持つすべての子孫を検索する必要があります。これを行うには複数の方法がありますが、次のような拡張機能を使用できます。

    /// <summary>
    /// Returns every item below the current item which has the specified template
    /// </summary>
    /// <param name="item"></param>
    /// <param name="templateName">Template of items to return</param>
    /// <returns></returns>
    public static List<Item> GetAllDescendants(this Item item, string templateName)
    {
        return new List<Item>(Context.Database.SelectItems(item.Paths.LongID + "//*[@@templatename='" + templateName + "']"));
    }
于 2012-11-20T15:47:30.050 に答える
1

Treelist フィールドを使用できず、データソース/テンプレートに制限を設け、ニュースレターに含める記事 (および順序) を編集者に選択させることができない理由はありますか?

http://firebreaksice.com/tame-your-sitecore-treelists/

完全に動的で、ユーザーの介入がないものが本当に必要な場合を除きますか?

于 2012-11-29T03:11:31.930 に答える
0

アイテムバケット

Item Bucket 共有ソース モジュールを検討することをお勧めします。これにより、非常に多数のアイテムをコンテンツ ツリーの 1 か所に保存し、分類学的カテゴリで検索できます。これは、現在の要件をサポートし、要件が進化するにつれて、このコンテンツを新しい方法で提示することをサポートします。たとえば、サイドバーに関連トピックに関する記事を表示するなどです。

Github ドキュメントから:

Sitecore Item Buckets は、コンテンツ ツリー内の大量のアイテムの管理に対応し、迅速かつ効率的な方法でそれらを取得して操作できるようにします。アイテムをバケットに変換し、そのすべての子孫を非表示にする必要があるかどうかを判断するには、バケットの下にあるデータの構造を気にするかどうかを自問するだけです。たとえば、コンテンツ ツリー内に製品レポジトリ、映画レポジトリ、またはタグ レポジトリがある場合、それらすべてをフォルダにダンプしたい場合がほとんどで、特定の製品、映画、またはタグを操作する場合は、それを検索して開くだけです。

アイテム バケットには、非常にクリーンなユーザー インターフェイス、アイテムにタグを付ける機能、これらのタグに対して LINQ クエリを実行する機能など、印象的な機能がいくつかあります。Github ドキュメントの例を次に示します。

var movies  = new BucketQuery().WhereContentContains("Dark")
                           .WhereTemplateIs("{D3335D0B-D84D-46AF-C620-A67A6022AB3F}")
                           .WhereLanguageIs(Sitecore.Context.Language)
                           .WhereTaggedWith("Tag ID for Tim Burton")
                           .WhereTaggedWith("Tag ID for Johnny Depp")
                           .WhereTaggedWith("Tag ID for Helen Bohnam-Carter")
                           .Starting(DateTime.Now.AddYears(-12))
                           .Ending(DateTime.Now)
                           .SortBy("_name")
                           .Page(1, 200, out hitCount);

アイテム バケットは、2012 年の Sitecore Symposium で紹介されました。これは共有ソース モジュールですが、Sitecore によってサポートされており、Sitecore コンテンツ ツリーの大規模なデータ セットを処理するためのエンタープライズ対応ソリューションとしてシンポジウムのキーノートで紹介されました。

リンク:

于 2012-11-20T18:53:05.613 に答える