Sitecore:如何列出组成新闻稿的一组项目

Sitecore:如何列出组成新闻稿的一组项目,sitecore,sitecore6,Sitecore,Sitecore6,我从客户那里得到以下要求: 我将不得不列出,在一个子布局,将是一个网站页面的一部分,一组项目 这些项目将组成一份时事通讯 每个项目(“文章”)都必须列出(文章名称+查看文章的链接) 这里的逻辑是什么?我怎样才能检索那些文章? 是否应该在特定文件夹中创建,然后在C#中解析该文件夹? 我们可以通过分析/查看时事通讯项目本身来检索项目路径吗 谢谢您,使用索引 为了优化,您可能需要为要列出的项目创建索引。您可以不这样做,但是大量的文章会导致性能问题 下面的代码块显示了从索引中加载项的一种方法的示例。如果

我从客户那里得到以下要求:

我将不得不列出,在一个子布局,将是一个网站页面的一部分,一组项目

这些项目将组成一份时事通讯

每个项目(“文章”)都必须列出(文章名称+查看文章的链接) 这里的逻辑是什么?我怎样才能检索那些文章? 是否应该在特定文件夹中创建,然后在C#中解析该文件夹? 我们可以通过分析/查看时事通讯项目本身来检索项目路径吗

谢谢您,

使用索引 为了优化,您可能需要为要列出的项目创建索引。您可以不这样做,但是大量的文章会导致性能问题

下面的代码块显示了从索引中加载项的一种方法的示例。如果你在谷歌上搜索,你可以找到关于这方面的大量信息,尤其是使用

//
///在Lucene索引中搜索所有文章
/// 
/// 
私有列表LoadArticlesWithLucene()
{
ConcurrentBag文章=新ConcurrentBag();
Index searchIndex=SearchManager.GetIndex(“MyArticleIndexName”);
使用(IndexSearchContext=searchIndex.CreateSearchContext())
{
//通配符搜索允许我们从索引中提取所有项目
var query=新的通配符查询(新术语(Constants.LuceneFields.Name,“*”);
SearchHits=context.Search(查询);
//检查结果
SearchResultCollection结果=hits.FetchResults(0,hits.Length);
Parallel.ForEach(结果,结果=>
{
//这是在foreach中完成的,以防在添加到集合之前添加任何处理或检查
Item searchItem=result.GetObject();
添加(搜索项);
});
}
return articles.ToList();
}
您仍然需要创建索引,如果您使用的是advanced database crawler模块,则只需向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>

$(id)
__新闻
主人
/网站核心/内容
真的
{3DD181B0-0F39-4E7A-8C94-DFA129DE6C81}
从没有索引的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 + "']"));
    }
//
///返回当前项下具有指定模板的所有项
/// 
/// 
///要返回的项目的模板
/// 
公共静态列表GetAllSubstands(此项,字符串templateName)
{
返回新列表(Context.Database.SelectItems(item.Paths.LongID+“//*[@@templatename=”“+templatename+”]”);
}
物料桶

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

Sitecore项目存储桶解决了内容树中大量项目的管理问题,能够快速高效地检索和使用这些项目。要决定是否应该将一个项转换为一个bucket,并隐藏其所有子项,只需问问自己是否关心bucket下的数据结构即可。例如,如果内容树中有一个产品存储库、电影存储库或标记存储库,那么您很可能只想将它们全部转储到一个文件夹中,当您想使用特定的产品、电影或标记时,只需搜索并打开它

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研讨会上介绍了项目桶。尽管这是一个共享源模块,但它受Sitecore支持,并且在研讨会主题演讲中作为企业级解决方案提供,用于处理Sitecore内容树中的大型数据集

链接:

有什么原因不能使用树状列表字段,请设置一些数据源/模板限制,并让编辑选择他们希望在新闻稿中包含哪些文章(以及以何种顺序)


除非您确实想要完全动态且无需用户干预的产品?

谢谢您的回答。这个周末我需要试一试。关于代码的一个问题:这是否意味着文章列表应该是固定的?如果编辑正在创建5篇文章,但在新闻稿中只使用了3篇,我如何控制哪些文章被使用或未被使用?上面的示例用于一个非常简单的基于模板的过滤。您可以通过字段值或类似的方式进行更高级的筛选,或者使用单独的模板
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);