Sitecore:如何列出组成简报的一组项目

时间:2012-11-20 15:08:26

标签: sitecore sitecore6

我有来自客户的以下要求:

我必须在一个子网页布局中列出一组项目。

这些项目将撰写时事通讯。

必须列出每个项目(“文章”)(文章名称+链接查看文章) 这里的逻辑是什么?我该如何审阅这些文章? 是应该在特定文件夹中创建,还是在C#中解析文件夹? 我们可以通过解析/查看新闻稿项目本身来检索项目路径吗?

谢谢,

3 个答案:

答案 0 :(得分: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 + "']"));
    }

答案 1 :(得分:1)

您有什么理由不能使用Treelist字段,放置一些数据源/模板限制,让编辑选择他们想要包含在简报中的哪些文章(及其顺序)?

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

除非你真的想要一些完全动态且没有用户干预的东西吗?

答案 2 :(得分:0)

项目桶

您可能需要考虑Item Bucket共享源模块,该模块允许您在内容树中的一个位置存储大量项目,并按分类类别进行搜索。这将支持您当前的要求,并支持在您的需求发展时以新的方式呈现此内容,例如,在侧栏中显示相关主题的文章。

来自Github documentation:

  

Sitecore项目存储区解决了内容树中大量项目的管理问题,并能够快速有效地检索和使用它们。要确定是否应该将项目转换为存储桶,然后隐藏其所有后代,就像问自己是否关心存储在数据库中的数据结构一样简单。例如,如果您在内容树中有Product Repository,Movie Repository或Tag Repository,那么您很可能只想将它们全部转储到一个文件夹中,当您想要使用特定的产品,电影或标签时,您会只需搜索并打开它。

Item Bucket具有一些令人印象深刻的功能,例如非常干净的用户界面,标记项目的能力以及针对这些标记运行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支持并在Symposium主题演讲中作为企业就绪解决方案在Sitecore内容树中处理大型数据集

链接: