예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        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();

                }
            }
        }