我有来自客户的以下要求:
我将不得不在将成为网站页面一部分的子布局中列出一组项目。
这些项目将组成时事通讯。
每个项目(“文章”)都必须列出(文章名称+查看文章的链接)这里的逻辑是什么?我怎样才能找回那些文章?应该在特定文件夹中创建而不是在 C# 中解析文件夹吗?我们可以通过 parsign / 查看时事通讯项目本身来检索项目路径吗?
谢谢你,
为了优化,您可能想要创建要列出的项目的索引。您可以不这样做,但您将开始遇到大量文章的性能问题。
以下代码块显示了从索引中加载项目的一种方法的示例。如果你用谷歌搜索,你可以找到很多这方面的信息,尤其是使用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 中提取,您将需要查找具有特定模板 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 + "']"));
}
有什么理由你不能使用 Treelist 字段,放置一些数据源/模板限制,让编辑选择他们想要包含在时事通讯中的文章(以及按什么顺序)?
http://firebreaksice.com/tame-your-sitecore-treelists/
除非您真的想要完全动态且无需用户干预的东西?
您可能需要考虑 Item Bucket 共享源模块,它允许您将大量项目存储在内容树中的一个位置并按分类类别进行搜索。这将支持您当前的需求,并支持随着您的需求发展以新的方式呈现此内容,例如,在侧边栏中显示有关相关主题的文章。
Sitecore 项目存储桶解决了内容树中大量项目的管理问题,并且能够以快速有效的方式检索和使用它们。要决定是否应该将一个项目变成一个桶,然后隐藏它的所有后代,就像问自己是否关心桶下数据的结构一样简单。例如,如果您在内容树中有一个产品存储库、电影存储库或标签存储库,您很可能只想将它们全部转储到一个文件夹中,当您想要使用特定产品、电影或标签时,您会只需搜索并打开它。
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);
Item Buckets 于 2012 年在 Sitecore Symposium 上推出。虽然这是一个共享源模块,但受 Sitecore 支持,并在 Symposium 主题演讲中作为企业级解决方案用于处理 Sitecore 内容树中的大型数据集。