我正在为SharePoint 2010编写一个webpart,根据发布日期恢复某个(自定义)类型的最新页面。它仅考虑使用指定术语标记的页面。我希望它能够使用标记有所选术语的子项的页面来执行此操作。
如果我有这样的术语树:
然后通过选择Kent,我希望我的webpart显示标记有Kent,Dover或Canterbury的最新页面。
这在C#中是否可行?
感谢您的时间。
答案 0 :(得分:5)
您正在寻找的功能是Term.GetTerms
您需要从您的字段中获取TaxonomyValue
然后您必须获取当前的TaxonomySession,然后使用TaxonomySession获取字段中使用的术语。从该术语开始,您可以使用Parent字段获取父Term。 这里有一些粗略的代码向您展示所使用的对象。
TaxonomyFieldValue v = null; // Notsurehowtodothisbit();
TaxonomySession session = new TaxonomySession(site);
if (session.TermStores != null && session.TermStores.Count > 0)
{
TermStore termStore = session.TermStores[0];
Term t = termStore.GetTerm(v.TermGuid);
Term parentTerm = t.Parent;
TermCollection childTerms = t.GetTerms();
}
获得树之后,您可以使用caml查询生成一个SPList.GetList查询,该查询会返回以此方式标记的任何内容。
我没有在这方面做过实验...... 但是Bart-Jan Hoeijmakers已经
了 private SPListItemCollection GetItemsByTerm(Term term, SPList list)
{
// init some vars SPListItemCollection items = null;
SPSite site = SPContext.Current.Site; // set up the TaxonomySession
TaxonomySession session = new TaxonomySession(site);
// get the default termstore TermStore termStore = session.TermStores[0];
// If no wssid is found, the term is not used yet in the sitecollection, so no items exist using the term
int[] wssIds = TaxonomyField.GetWssIdsOfTerm(SPContext.Current.Site, termStore.Id, term.TermSet.Id, term.Id, false, 1);
if (wssIds.Length > 0)
{
// a TaxonomyField is a lookupfield. Constructing the SPQuery
SPQuery query = new SPQuery();
query.Query = String.Format("<Where><Eq><FieldRef Name='MyTaxonomyField' LookupId='TRUE' /><Value Type='Lookup'>{0}</Value></Eq></Where>", wssIds[0]);
items = list.GetItems(query);
}
return items;
}
答案 1 :(得分:2)
Nat使用GetTerms方法为父母提供的部分答案很棒。查询一个列表的代码看起来也不错。
要获取父术语的ID,您可以对标题使用TermStore.GetTerms。
要搜索网站集中的所有列表和库,您可以使用Search API的FullTextSQLQuery方法,在owstaxIdMyTaxonomyField作为列的where子句中指定guid。
有一个很好的例子,可以按标题获取ID,并在Using taxonomy fields in SharePoint 2010: Part III
按ID搜索名词商店