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