我有来自客户的以下要求:
我必须在一个子网页布局中列出一组项目。
这些项目将撰写时事通讯。
必须列出每个项目(“文章”)(文章名称+链接查看文章) 这里的逻辑是什么?我该如何审阅这些文章? 是应该在特定文件夹中创建,还是在C#中解析文件夹? 我们可以通过解析/查看新闻稿项目本身来检索项目路径吗?
谢谢,
答案 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撤消,您将需要查找具有特定模板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共享源模块,该模块允许您在内容树中的一个位置存储大量项目,并按分类类别进行搜索。这将支持您当前的要求,并支持在您的需求发展时以新的方式呈现此内容,例如,在侧栏中显示相关主题的文章。
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内容树中处理大型数据集