/// <summary> /// Gets a Taxonomy Term by Name /// </summary> /// <param name="termSetId"></param> /// <param name="term"></param> /// <param name="clientContext"></param> /// <returns></returns> public static Term GetTermByName(this Site site, Guid termSetId, string term) { if (string.IsNullOrEmpty(term)) { throw new ArgumentNullException("term"); } TermCollection termMatches = null; ExceptionHandlingScope scope = new ExceptionHandlingScope(site.Context); string termId = string.Empty; TaxonomySession tSession = TaxonomySession.GetTaxonomySession(site.Context); TermStore ts = tSession.GetDefaultSiteCollectionTermStore(); TermSet tset = ts.GetTermSet(termSetId); var lmi = new LabelMatchInformation(site.Context); lmi.Lcid = 1033; lmi.TrimUnavailable = true; lmi.TermLabel = term; termMatches = tset.GetTerms(lmi); site.Context.Load(tSession); site.Context.Load(ts); site.Context.Load(tset); site.Context.Load(termMatches); site.Context.ExecuteQuery(); if (termMatches.AreItemsAvailable) { return(termMatches.FirstOrDefault()); } else { return(null); } }
private static string ReplaceTaxonomyTokens(ClientContext ctx, string schemaXml) { var tokens = new List <string>() { "{@DefaultValue:", "{@SspId}", "{@TermSet:", "{@AnchorTermId:" }; var foundTokens = tokens.Where(t => schemaXml.Contains(t)).ToList(); if (foundTokens.Count == 0) { return(schemaXml); } var taxonomySession = TaxonomySession.GetTaxonomySession(ctx); var termStore = taxonomySession.GetDefaultSiteCollectionTermStore(); ctx.Load(termStore, ts => ts.Id); ctx.ExecuteQuery(); TermCollection terms = null; schemaXml = schemaXml.Replace("{@SspId}", termStore.Id.ToString()); var termSetName = schemaXml.GetInnerText("{@TermSet:", "}"); var termSets = termStore.GetTermSetsByName(termSetName, (int)ctx.Web.Language); ctx.Load(termSets, ts => ts.Include(t => t.Id)); ctx.ExecuteQueryRetry(); if (termSets.Count == 0) { throw new InvalidOperationException($"Unable to find term set {termSetName}."); } schemaXml = schemaXml.Replace($"{{@TermSet:{termSetName}}}", termSets[0].Id.ToString()); terms = termSets[0].GetAllTerms(); ctx.Load(terms); ctx.ExecuteQueryRetry(); if (foundTokens.Contains("{@AnchorTermId:")) { var anchorTermName = schemaXml.GetInnerText("{@AnchorTermId:", "}"); var foundAnchorTerm = terms.FirstOrDefault(t => t.Name == anchorTermName); ctx.ExecuteQuery(); if (foundAnchorTerm != null) { schemaXml = schemaXml.Replace($"{{@AnchorTermId:{anchorTermName}}}", foundAnchorTerm.Id.ToString()); } } if (foundTokens.Contains("{@DefaultValue:")) { var defaultValueTermName = schemaXml.GetInnerText("{@DefaultValue:", "}"); var foundDefaultTerm = terms.FirstOrDefault(t => t.Name == defaultValueTermName); ctx.ExecuteQueryRetry(); if (foundDefaultTerm != null) { schemaXml = schemaXml.Replace($"{{@DefaultValue:{defaultValueTermName}}}", $"-1;#{defaultValueTermName}|{foundDefaultTerm.Id.ToString()}"); } } return(schemaXml); }
private void CreateStackOTerms(Stack<Tuple<string, Guid>> rowStack, TermCollection allTerms, TermSet termSet) { var arrayStack = rowStack.ToArray(); for(int x = 0; x < arrayStack.Length; ++x) { var currentItem = arrayStack[x]; if(currentItem.Item2 == Guid.Empty) { var newGuid = Guid.NewGuid(); if (x != 0) { var previousTermId = arrayStack[x - 1].Item2; var previousTerm = allTerms.FirstOrDefault(o=>o.Id == previousTermId); //termSet.Context.Load(previousTerm); if (previousTerm.IsReused && previousTerm.IsSourceTerm == false) { // get term var sourceTerm = previousTerm.SourceTerm; termSet.Context.Load(sourceTerm, sc=>sc.Id, sc => sc.Terms, sc => sc.Terms.Include(t => t.Name, t => t.Id)); termSet.Context.ExecuteQuery(); var sourceNewTerm = sourceTerm.Terms.FirstOrDefault(trm => trm.Name == currentItem.Item1); // not in the original either if (sourceNewTerm == null) { // add new term var newTerm = sourceTerm.CreateTerm(currentItem.Item1, 1033, newGuid); // reuse it in the term-set we are iterating previousTerm.ReuseTerm(newTerm, false); } else{ previousTerm.ReuseTerm(sourceNewTerm, false); newGuid = sourceNewTerm.Id; } } else { previousTerm.CreateTerm(currentItem.Item1, 1033, newGuid); } } else { // Create a new term at the root of the termset termSet.CreateTerm(currentItem.Item1, 1033, newGuid); } arrayStack[x] = Tuple.Create(currentItem.Item1, newGuid); allTerms = termSet.GetAllTerms(); termSet.Context.Load(allTerms, ax => ax.Include(t => t.Terms, t => t.PathOfTerm, t => t.IsReused, t => t.SourceTerm, t => t.IsSourceTerm, t => t.IsPinned, t => t.Name, t => t.Id, t => t.Parent, t => t.PathOfTerm, t => t.Parent.Name, t => t.Parent.Id)); termSet.Context.ExecuteQuery(); } } }