Пример #1
0
        public TermPartHandler(
            IRepository<TermPartRecord> repository, 
            ITaxonomyService taxonomyService,
            ITermPathConstraint termPathConstraint ) {
            Filters.Add(StorageFilter.For(repository));

            OnRemoved<IContent>(
                (context, tags) =>
                    taxonomyService.DeleteAssociatedTerms(context.ContentItem)
                );

            OnInitializing<TermPart>(
                (context, part) => 
                    part.Selectable = true
                );

            OnPublished<TermPart>(
                (context, part) => {
                    termPathConstraint.AddPath(part.Slug);
                    foreach (var child in taxonomyService.GetChildren(part)) {
                        termPathConstraint.AddPath(child.Slug);
                    }
                });

            OnUnpublishing<TermPart>(
                (context, part) =>
                    termPathConstraint.RemovePath(part.Slug)
                );
        }
Пример #2
0
        public IEnumerable <TreeNode> GetChildren(string nodeType, string nodeId)
        {
            switch (nodeType)
            {
            case "root":
                return(new[] {
                    GetTaxonomiesNode()
                });

            case "taxonomies":
                return(_taxonomyService.GetTaxonomies()
                       .Select(GetTaxonomyNode)
                       .OrderBy(n => n.Title)
                       .ToList());

            case "taxonomy":
                var taxonomyId = int.Parse(nodeId);
                return(_taxonomyService.GetTerms(taxonomyId)
                       .Where(t => t.Path.Trim('/') == "")
                       .Select(
                           t => new TreeNode {
                    Title = t.Name,
                    Type = "taxonomy-term",
                    Id = t.Id.ToString(CultureInfo.InvariantCulture),
                    Url = _url.ItemEditUrl(t)
                }
                           )
                       .OrderBy(n => n.Title)
                       .ToList());

            case "taxonomy-term":
                var termId         = int.Parse(nodeId);
                var term           = _taxonomyService.GetTerm(termId);
                var childTermNodes = _taxonomyService
                                     .GetChildren(term)
                                     .Select(GetTermNode)
                                     .OrderBy(n => n.Title);
                var childItems = _taxonomyService
                                 .GetContentItemsQuery(term)
                                 .Where(i => i.Terms.Any(tr => tr.TermRecord.Id == term.Id))
                                 .List()
                                 .Select(GetContentItemNode)
                                 .OrderBy(n => n.Title);
                return(childTermNodes
                       .Union(childItems)

                       .ToList());
            }
            return(new TreeNode[0]);
        }
Пример #3
0
        public void ApplyFilter(dynamic context)
        {
            var termIds = (string)context.State.TermIds;

            if (!String.IsNullOrEmpty(termIds))
            {
                var ids = termIds.Split(new[] { ',' }).Select(Int32.Parse).ToArray();

                if (ids.Length == 0)
                {
                    return;
                }

                int op = Convert.ToInt32(context.State.Operator);

                var terms       = ids.Select(_taxonomyService.GetTerm).ToList();
                var allChildren = new List <TermPart>();
                foreach (var term in terms)
                {
                    allChildren.AddRange(_taxonomyService.GetChildren(term));
                    allChildren.Add(term);
                }

                allChildren = allChildren.Distinct().ToList();

                var allIds = allChildren.Select(x => x.Id).ToList();

                switch (op)
                {
                case 0:
                    // is one of
                    Action <IAliasFactory>         s = alias => alias.ContentPartRecord <TermsPartRecord>().Property("Terms", "terms").Property("TermRecord", "termRecord");
                    Action <IHqlExpressionFactory> f = x => x.InG("Id", allIds);
                    context.Query.Where(s, f);
                    break;

                case 1:
                    // is all of
                    foreach (var id in allIds)
                    {
                        var termId = id;
                        Action <IAliasFactory> selector =
                            alias => alias.ContentPartRecord <TermsPartRecord>().Property("Terms", "terms" + termId);
                        Action <IHqlExpressionFactory> filter = x => x.Eq("TermRecord.Id", termId);
                        context.Query.Where(selector, filter);
                    }
                    break;
                }
            }
        }
        public JObject Terms(IContent content, int maxLevel = 10)
        {
            JObject json;

            _maxLevel = maxLevel;
            dynamic contentToSerialize = null, termPart = null;

            try {
                if (content.ContentItem.ContentType.EndsWith("Taxonomy"))
                {
                    contentToSerialize = content;
                    json = new JObject(SerializeObject(content, 0, 0, new string[] { "TaxonomyPart" }));
                    var terms       = content.As <TaxonomyPart>().Terms;
                    var resultArray = new JArray();
                    foreach (var resulted in terms)
                    {
                        resultArray.Add(new JObject(SerializeObject(resulted.ContentItem, 0, content.Id)));
                    }
                    JObject taxonomy = json.First.First as JObject; //The Taxonomy node
                    taxonomy.Add("Terms", resultArray);
                    //NormalizeSingleProperty(json);
                    return(json);
                }
                else if (content.ContentItem.ContentType.EndsWith("Term") || !string.IsNullOrWhiteSpace(content.ContentItem.TypeDefinition.Settings["Taxonomy"]))
                {
                    termPart = ((dynamic)content.ContentItem).TermPart;
                    if (termPart != null)
                    {
                        json = new JObject(SerializeObject(content, 0, 0));
                        contentToSerialize = _taxonomyService.GetChildren(termPart, false);
                        var resultArray = new JArray();
                        foreach (var resulted in contentToSerialize)
                        {
                            resultArray.Add(new JObject(SerializeObject(resulted.ContentItem, 0, termPart.Id)));
                        }
                        JObject rootTerm = json.First.First as JObject; //The first term node
                        rootTerm.Add("SubTerms", resultArray);
                        return(json);
                    }
                }
            }
            catch {
            }
            return(null);
        }
        private IEnumerable <TermPart> GetTerms(int termId, bool andChildren)
        {
            var term = _taxonomyService.GetTerm(termId);

            if (term == null)
            {
                return(Enumerable.Empty <TermPart>());
            }
            var ts = new List <TermPart>()
            {
                term
            };

            if (andChildren)
            {
                ts.AddRange(_taxonomyService.GetChildren(term));
            }
            return(ts);
        }
        protected override DriverResult Editor(TermPart termPart, IUpdateModel updater, dynamic shapeHelper)
        {
            updater.TryUpdateModel(termPart, Prefix, null, null);
            StringBuilder fullWeightBuilder   = new StringBuilder();
            string        parentOldFullWeight = termPart.FullWeight == null ? termPart.FullWeight : "";
            TermPart      containerTerm       = termPart;

            for (int i = 0; i < termPart.Path.Count(x => x == '/') - 1; i++)
            {
                containerTerm = containerTerm.Container.As <TermPart>();
                fullWeightBuilder.Insert(0, containerTerm.Weight.ToString("D6") + "." + containerTerm.Id.ToString() + "/");
            }
            fullWeightBuilder.Append(termPart.Weight.ToString("D6") + "." + "/");

            termPart.FullWeight = fullWeightBuilder.ToString();

            foreach (var childTerm in _taxonomyService.GetChildren(termPart))
            {
                childTerm.FullWeight = _taxonomyService.ProcessChildrenFullWeight(childTerm.FullWeight, termPart.FullWeight, parentOldFullWeight);
            }

            return(Editor(termPart, shapeHelper));
        }
        public JObject Terms(IContent content, int maxLevel = 10)
        {
            JObject json;

            _maxLevel = maxLevel;
            dynamic contentToSerialize = null, termPart = null;

            try {
                if (content.ContentItem.ContentType.EndsWith("Taxonomy"))
                {
                    contentToSerialize = content;
                    json = new JObject(SerializeObject(content, 0));
                    //NormalizeSingleProperty(json);
                    return(json);
                }
                else if (content.ContentItem.ContentType.EndsWith("Term") || !String.IsNullOrWhiteSpace(content.ContentItem.TypeDefinition.Settings["Taxonomy"]))
                {
                    termPart = ((dynamic)content.ContentItem).TermPart;
                    if (termPart != null)
                    {
                        json = new JObject(SerializeObject(content, 0));
                        contentToSerialize = _taxonomyService.GetChildren(termPart, false);
                        var resultArray = new JArray();
                        foreach (var resulted in contentToSerialize)
                        {
                            resultArray.Add(new JObject(SerializeObject(resulted, 0)));
                        }
                        json.Add("SubTerms", resultArray);
                        //NormalizeSingleProperty(json);
                        return(json);
                    }
                }
            } catch {
            }
            return(null);
        }
        public void DumpList(DumperServiceContext context)
        {
            if (ShouldDoSomething(context.Content.ContentItem))
            {
                var part = context.Content
                           .ContentItem
                           .As <TermPart>();

                if (part != null)
                {
                    var mainSb = new StringBuilder();
                    mainSb.Append("{");
                    Func <IContent, int, XElement> dumpFunc;
                    if (context.ResultTarget == ResultTarget.Contents)
                    {
                        mainSb.AppendFormat("\"n\": \"{0}\"", "TaxonomyTermList");
                        mainSb.AppendFormat(", \"v\": \"{0}\"", "ContentItem[]");
                        dumpFunc = (item, index) => context.GetDumper()
                                   .Dump(item.ContentItem, string.Format("[{0}]", index));
                    }
                    else
                    {
                        mainSb.AppendFormat("\"n\": \"{0}\"", "TermPartList");
                        mainSb.AppendFormat(", \"v\": \"{0}\"", "TermPart[]");
                        dumpFunc = (item, index) => context.GetDumper()
                                   .Dump(item, "TermPart");
                    }
                    mainSb.Append(", \"m\": [");

                    IEnumerable <IContent> termContentItems;
                    if (context.ResultTarget == ResultTarget.Terms)
                    {
                        termContentItems = _taxonomyService
                                           .GetChildren(part, true);
                    }
                    else if (context.ResultTarget == ResultTarget.SubTerms)
                    {
                        termContentItems = _taxonomyService
                                           .GetChildren(part, false);
                    }
                    else
                    {
                        termContentItems = _taxonomyService
                                           .GetContentItems(part, (context.Page - 1) * context.PageSize, context.PageSize);
                    }

                    if (termContentItems.Any())
                    {
                        mainSb.Append(
                            string.Join(",", termContentItems
                                        .Select((ci, index) => {
                            var sb = new StringBuilder();
                            sb.Append("{");
                            context.ConvertToJson(dumpFunc(ci, index), sb);
                            sb.Append("}");
                            return(sb.ToString());
                        }))
                            );
                    }

                    mainSb.Append("]");
                    mainSb.Append("}");

                    // Add the serialization to the results
                    context.ContentLists.Add(mainSb.ToString());
                }
            }
        }
        public void ApplyFilter(dynamic context)
        {
            var httpContext = _orchardServices.WorkContext.HttpContext;
            var path        = httpContext.Request.AppRelativeCurrentExecutionFilePath.Replace("~/", string.Empty);

            var routeValues = _aliasService.Get(path);

            if (routeValues == null)
            {
                return;
            }

            object id;

            if (routeValues.TryGetValue("id", out id))
            {
                var castedId = Convert.ToInt32(id);
                var ids      = _taxonomyService.GetTermsForContentItem(castedId).Select(o => o.Id).ToList();

                if (ids.Any())
                {
                    int op         = Convert.ToInt32(context.State.Operator);
                    int?taxonomyId = context.State.TaxonomyId != null?Convert.ToInt32(context.State.TaxonomyId) : default(int?);

                    var terms       = ids.Select(_taxonomyService.GetTerm);
                    var allChildren = new List <TermPart>();

                    if (taxonomyId != null)
                    {
                        var selectedTerm = _taxonomyService.GetTermsForContentItem(castedId).FirstOrDefault(x => x.TaxonomyId == taxonomyId);

                        if (selectedTerm != null)
                        {
                            terms = terms.Where(x => x.Id == selectedTerm.Id);
                        }
                    }

                    foreach (var term in terms)
                    {
                        allChildren.AddRange(_taxonomyService.GetChildren(term));
                        allChildren.Add(term);
                    }

                    allChildren = allChildren.Distinct().ToList();

                    var predicates = allChildren.Select(localTerm => (Action <IHqlExpressionFactory>)(a => a.Eq("Id", localTerm.Id))).ToList();

                    switch (op)
                    {
                    case 0:
                        // is one of
                        Action <IAliasFactory>         selector1 = alias => alias.ContentPartRecord <TermsPartRecord>().Property("Terms", "terms").Property("TermRecord", "termRecord");
                        Action <IHqlExpressionFactory> filterA   = x => x.Disjunction(predicates.Take(1).Single(), predicates.Skip(1).ToArray());
                        context.Query.Where(selector1, filterA);

                        if (context.State.IncludeSelf == null)
                        {
                            Action <IAliasFactory>         selector2  = alias => alias.ContentItem();
                            Action <IHqlExpressionFactory> filter2    = x => x.Eq("Id", castedId);
                            Action <IHqlExpressionFactory> filter2Not = x => x.Not(filter2);
                            context.Query.Where(selector2, filter2Not);
                        }

                        break;

                    case 1:
                        // is not one of
                        Action <IAliasFactory>         selector = alias => alias.ContentPartRecord <TermsPartRecord>().Property("Terms", "terms").Property("TermRecord", "termRecord");
                        Action <IHqlExpressionFactory> filterB  = x => x.Disjunction(predicates.Take(1).Single(), predicates.Skip(1).ToArray());
                        context.Query.Where(selector, filterB);
                        break;

                    case 2:
                        // is all of
                        break;
                    }
                }
            }
        }
        private ActionResult GetContent(IContent content, SourceTypes sourceType = SourceTypes.ContentItem, ResultTarget resultTarget = ResultTarget.Contents, string fieldspartsFilter = "", int page = 1, int pageSize = 10, bool tinyResponse = true, bool minified = false, bool realformat = false, int deeplevel = 10, string[] complexBehaviour = null)
        {
            var result = new ContentResult {
                ContentType = "application/json"
            };
            var jsonString = "{}";

            var      _filterContentFieldsParts = fieldspartsFilter.ToLower().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            XElement dump;
            XElement projectionDump = null;
            // il dump dell'oggetto principale non filtra per field
            ObjectDumper    dumper = new ObjectDumper(deeplevel, null, false, tinyResponse, complexBehaviour);
            dynamic         shape; //, specificShape;
            var             sb          = new StringBuilder();
            List <XElement> listContent = new List <XElement>();

            // verifico se l'oggetto è soggetto all'accettazione delle policies
            var policy = content.As <Policy.Models.PolicyPart>();

            //if (policy != null) {
            //    if ((String.IsNullOrWhiteSpace(_orchardServices.WorkContext.HttpContext.Request.QueryString["v"]))) {// E' soggetto a privacy, quindi faccio sempre il redirect se manca il parametro in querystring v=
            //        if (policy.HasPendingPolicies ?? false) { // se ha delle pending policies deve restituire le policy text, legate al contenuto, qui ndi non deve mai servire cache
            //            var redirectUrl = String.Format("{0}{1}v={2}", _orchardServices.WorkContext.HttpContext.Request.RawUrl, (_orchardServices.WorkContext.HttpContext.Request.RawUrl.Contains("?") ? "&" : "?"), Guid.NewGuid());
            //            _orchardServices.WorkContext.HttpContext.Response.Redirect(redirectUrl, true);
            //        } else {// se NON ha delle pending policies deve restituire un url non cacheato (quindi aggiungo v=),
            //            var redirectUrl = String.Format("{0}{1}v={2}", _orchardServices.WorkContext.HttpContext.Request.RawUrl, (_orchardServices.WorkContext.HttpContext.Request.RawUrl.Contains("?") ? "&" : "?"), "cached-content");
            //            _orchardServices.WorkContext.HttpContext.Response.Redirect(redirectUrl, true);
            //            //_orchardServices.WorkContext.HttpContext.Response.Redirect(redirectUrl, true);
            //        }
            //        return null; // in entrambi i casi ritorno null come risultato della current request
            //    }
            //}
            if (policy != null && (_policyServices.HasPendingPolicies(content.ContentItem) ?? false))   // Se l'oggetto ha delle pending policies allora devo serivre la lista delle pending policies
            //policy.PendingPolicies
            {
                sb.Insert(0, "{");
                sb.AppendFormat("\"n\": \"{0}\"", "Model");
                sb.AppendFormat(", \"v\": \"{0}\"", "VirtualContent");
                sb.Append(", \"m\": [{");
                sb.AppendFormat("\"n\": \"{0}\"", "VirtualId"); // Unused property for mobile mapper needs
                sb.AppendFormat(", \"v\": \"{0}\"", "0");
                sb.Append("}]");

                sb.Append(", \"l\":[");

                int i = 0;
                sb.Append("{");
                sb.AppendFormat("\"n\": \"{0}\"", "PendingPolicies");
                sb.AppendFormat(", \"v\": \"{0}\"", "ContentItem[]");
                sb.Append(", \"m\": [");

                foreach (var item in _policyServices.PendingPolicies(content.ContentItem))
                {
                    if (i > 0)
                    {
                        sb.Append(",");
                    }
                    sb.Append("{");
                    dumper         = new ObjectDumper(deeplevel, _filterContentFieldsParts, false, tinyResponse, complexBehaviour);
                    projectionDump = dumper.Dump(item, String.Format("[{0}]", i));
                    JsonConverter.ConvertToJSon(projectionDump, sb, minified, realformat);
                    sb.Append("}");
                    i++;
                }
                sb.Append("]");
                sb.Append("}");

                sb.Append("]"); // l : [
                sb.Append("}");
            }
            else     // Se l'oggetto NON ha delle pending policies allora posso servire l'oggetto stesso
            {
                shape = _orchardServices.ContentManager.BuildDisplay(content);
                if (sourceType == SourceTypes.ContentItem)
                {
                    dump = dumper.Dump(content, "Model");
                }
                else
                {
                    dump = dumper.Dump(shape, "Model");
                }
                //dump.XPathSelectElements("");
                //var filteredDump = dump.Descendants();
                //ConvertToJSon(dump, sb);
                JsonConverter.ConvertToJSon(dump, sb, minified, realformat);
                sb.Insert(0, "{");
                sb.Append(", \"l\":[");
                // Dopo avere convertito il contentItem in JSON aggiungo i Json delle eventuali liste
                dynamic part                 = null;
                var     firstList            = true;
                var     listDumpedContentIds = new List <int>();

                #region [ProjectionPart ]

                try {
                    part = shape.ContentItem.ProjectionPart;
                } catch {
                    part = null;
                }
                if (part != null)
                {
                    if (!firstList)
                    {
                        sb.Append(",");
                    }
                    firstList = false;
                    var queryId    = part.Record.QueryPartRecord.Id;
                    var queryItems = _projectionManager.GetContentItems(queryId, (page - 1) * pageSize, pageSize);
                    int i          = 0;
                    sb.Append("{");
                    sb.AppendFormat("\"n\": \"{0}\"", "ProjectionList");
                    sb.AppendFormat(", \"v\": \"{0}\"", "ContentItem[]");
                    sb.Append(", \"m\": [");

                    foreach (var item in queryItems)
                    {
                        if (i > 0)
                        {
                            sb.Append(",");
                        }
                        sb.Append("{");
                        dumper         = new ObjectDumper(deeplevel, _filterContentFieldsParts, false, tinyResponse, complexBehaviour);
                        projectionDump = dumper.Dump(item, String.Format("[{0}]", i));
                        JsonConverter.ConvertToJSon(projectionDump, sb, minified, realformat);
                        sb.Append("}");
                        i++;
                    }
                    sb.Append("]");
                    sb.Append("}");
                }
                part = null;

                #endregion [ProjectionPart ]

                #region [CalendarPart ]

                try {
                    part = shape.ContentItem.CalendarPart;
                } catch {
                    part = null;
                }
                if (part != null)
                {
                    if (!firstList)
                    {
                        sb.Append(",");
                    }
                    firstList = false;
                    if (_orchardServices.WorkContext.TryResolve <IEventsService>(out _eventsService))  // non sempre questo modulo è attivo quindi se non riesce a risolvere il servizio, bypassa la chiamata
                    {
                        var queryItems = _eventsService.GetAggregatedList(part, page, pageSize);
                        int i          = 0;
                        sb.Append("{");
                        sb.AppendFormat("\"n\": \"{0}\"", "EventList");
                        sb.AppendFormat(", \"v\": \"{0}\"", "ContentItem[]");
                        sb.Append(", \"m\": [");

                        foreach (var item in queryItems)
                        {
                            if (i > 0)
                            {
                                sb.Append(",");
                            }
                            sb.Append("{");
                            dumper         = new ObjectDumper(deeplevel, _filterContentFieldsParts, false, tinyResponse, complexBehaviour);
                            projectionDump = dumper.Dump(item, String.Format("[{0}]", i));
                            JsonConverter.ConvertToJSon(projectionDump, sb);
                            sb.Append("}");
                            i++;
                        }
                        sb.Append("]");
                        sb.Append("}");
                    }
                }
                part = null;

                #endregion [CalendarPart ]

                #region [ExernalField]

                var ExtertalFields = (dynamic)
                                     (from parte in ((ContentItem)shape.ContentItem).Parts
                                      from field in parte.Fields
                                      where (field.GetType().Name == "FieldExternal" && ((dynamic)field).Setting.GenerateL)
                                      select field).FirstOrDefault();
                if (ExtertalFields != null)
                {
                    if (!firstList)
                    {
                        sb.Append(",");
                    }
                    firstList = false;
                    //sb.Append("{");
                    //sb.AppendFormat("\"n\": \"{0}\"", "ExternalContent");
                    //sb.AppendFormat(", \"v\": \"{0}\"", "ExternalContent");
                    //sb.Append(", \"m\": [");

                    sb.Append("{");
                    dumper = new ObjectDumper(deeplevel, _filterContentFieldsParts, false, tinyResponse, complexBehaviour);
                    //nameDynamicJsonArray = "List<generic>";
                    if (ExtertalFields.ContentObject != null)
                    {
                        if (ExtertalFields.ContentObject.GetType() == typeof(ExternalFieldRemoteException))
                        {
                            throw new ExternalFieldRemoteException();
                        }
                        projectionDump = dumper.Dump(cleanobj(ExtertalFields.ContentObject), ExtertalFields.Name, "List<generic>");
                        JsonConverter.ConvertToJSon(projectionDump, sb, minified, realformat);
                    }
                    //    sb.Append("}]}");
                    sb.Append("}");
                }

                #endregion [ExernalField]

                #region [ WidgetsContainerPart ]

                try {
                    part = shape.ContentItem.WidgetsContainerPart;
                } catch {
                    part = null;
                }
                if (part != null)
                {
                    //var queryId = part.Record.QueryPartRecord.Id;
                    if (_orchardServices.WorkContext.TryResolve <IWidgetManager>(out _widgetManager))  // non semepre questo modulo è attivo quindi se non riesce a risolvere il servizio, bypassa la chiamata
                    {
                        if (!firstList)
                        {
                            sb.Append(",");
                        }
                        firstList = false;
                        var queryItems = _widgetManager.GetWidgets(part.Id);
                        int i          = 0;
                        sb.Append("{");
                        sb.AppendFormat("\"n\": \"{0}\"", "WidgetList");
                        sb.AppendFormat(", \"v\": \"{0}\"", "ContentItem[]");
                        sb.Append(", \"m\": [");

                        foreach (var item in queryItems)
                        {
                            if (i > 0)
                            {
                                sb.Append(",");
                            }
                            sb.Append("{");
                            dumper         = new ObjectDumper(deeplevel, _filterContentFieldsParts, false, tinyResponse, complexBehaviour);
                            projectionDump = dumper.Dump(item, String.Format("[{0}]", i));
                            JsonConverter.ConvertToJSon(projectionDump, sb, minified, realformat);
                            sb.Append("}");
                            i++;
                        }
                        sb.Append("]");
                        sb.Append("}");
                    }
                }

                #endregion [ WidgetsContainerPart ]

                #region [ Taxonomy/TermsPart ]

                part = null;
                try {
                    if (shape.ContentItem.ContentType.EndsWith("Term") || !String.IsNullOrWhiteSpace(shape.ContentItem.TypeDefinition.Settings["Taxonomy"]))
                    {
                        part = shape.ContentItem.TermPart;
                    }
                } catch {
                    part = null;
                }
                if (part != null)
                {
                    if (!firstList)
                    {
                        sb.Append(",");
                    }
                    firstList = false;
                    dynamic termContentItems;
                    if (resultTarget == ResultTarget.Terms)
                    {
                        termContentItems = _taxonomyService.GetChildren(part, true);
                    }
                    else if (resultTarget == ResultTarget.SubTerms)
                    {
                        termContentItems = _taxonomyService.GetChildren(part, false);
                    }
                    else
                    {
                        termContentItems = _taxonomyService.GetContentItems(part, (page - 1) * pageSize, pageSize);
                    }

                    int i = 0;
                    sb.Append("{");
                    if (resultTarget == ResultTarget.Contents)
                    {
                        sb.AppendFormat("\"n\": \"{0}\"", "TaxonomyTermList");
                        sb.AppendFormat(", \"v\": \"{0}\"", "ContentItem[]");
                    }
                    else
                    {
                        sb.AppendFormat("\"n\": \"{0}\"", "TermPartList");
                        sb.AppendFormat(", \"v\": \"{0}\"", "TermPart[]");
                    }
                    sb.Append(", \"m\": [");

                    foreach (var item in termContentItems)
                    {
                        if (i > 0)
                        {
                            sb.Append(",");
                        }
                        sb.Append("{");
                        dumper = new ObjectDumper(deeplevel, _filterContentFieldsParts, false, tinyResponse, complexBehaviour);
                        if (resultTarget == ResultTarget.Contents)
                        {
                            projectionDump = dumper.Dump(item.ContentItem, String.Format("[{0}]", i));
                            JsonConverter.ConvertToJSon(projectionDump, sb, minified, realformat);
                        }
                        else
                        {
                            var dumperForPart = new ObjectDumper(deeplevel, _filterContentFieldsParts, true, tinyResponse, complexBehaviour);
                            projectionDump = dumperForPart.Dump(item, "TermPart");
                            JsonConverter.ConvertToJSon(projectionDump, sb, minified, realformat);
                        }
                        sb.Append("}");
                        i++;
                    }
                    sb.Append("]");
                    sb.Append("}");
                }
                part = null;

                #endregion [ Taxonomy/TermsPart ]

                sb.Append("]"); // l : [
                sb.Append("}");
            }
            jsonString     = sb.ToString().Replace("\t", " ");
            result.Content = jsonString;
            return(result);
        }
        public IEnumerable <MenuItem> Filter(IEnumerable <MenuItem> items)
        {
            foreach (var item in items)
            {
                if (item.Content != null && item.Content.ContentItem.ContentType == "TaxonomyNavigationMenuItem")
                {
                    var taxonomyNavigationPart = item.Content.As <TaxonomyNavigationPart>();

                    var rootTerm = _taxonomyService.GetTerm(taxonomyNavigationPart.TermId);

                    TermPart[] allTerms;

                    if (rootTerm != null)
                    {
                        // if DisplayRootTerm is specified add it to the menu items to render
                        allTerms = _taxonomyService.GetChildren(rootTerm, taxonomyNavigationPart.DisplayRootTerm).ToArray();
                    }
                    else
                    {
                        allTerms = _taxonomyService.GetTerms(taxonomyNavigationPart.TaxonomyId).ToArray();
                    }

                    var rootLevel = rootTerm != null
                        ? rootTerm.GetLevels()
                        : 0;

                    var menuPosition = item.Position;
                    var rootPath     = rootTerm == null || taxonomyNavigationPart.DisplayRootTerm ? "" : rootTerm.FullPath;

                    var startLevel = rootLevel + 1;
                    if (rootTerm == null || taxonomyNavigationPart.DisplayRootTerm)
                    {
                        startLevel = rootLevel;
                    }

                    var endLevel = Int32.MaxValue;
                    if (taxonomyNavigationPart.LevelsToDisplay > 0)
                    {
                        endLevel = startLevel + taxonomyNavigationPart.LevelsToDisplay - 1;
                    }

                    foreach (var contentItem in allTerms)
                    {
                        if (contentItem != null)
                        {
                            var part  = contentItem;
                            var level = part.GetLevels();

                            // filter levels ?
                            if (level < startLevel || level > endLevel)
                            {
                                continue;
                            }

                            // ignore menu item if there are no content items associated to the term
                            if (taxonomyNavigationPart.HideEmptyTerms && part.Count == 0)
                            {
                                continue;
                            }

                            var menuText = _contentManager.GetItemMetadata(part).DisplayText;
                            var routes   = _contentManager.GetItemMetadata(part).DisplayRouteValues;

                            if (taxonomyNavigationPart.DisplayContentCount)
                            {
                                menuText += " (" + part.Count + ")";
                            }

                            // create
                            var positions = contentItem.FullPath.Substring(rootPath.Length)
                                            .Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries)
                                            .Select(p => Array.FindIndex(allTerms, t => t.Id == Int32.Parse(p)))
                                            .ToArray();

                            var inserted = new MenuItem {
                                Text             = new LocalizedString(menuText),
                                IdHint           = item.IdHint,
                                Classes          = item.Classes,
                                Url              = item.Url,
                                Href             = item.Href,
                                LinkToFirstChild = false,
                                RouteValues      = routes,
                                LocalNav         = item.LocalNav,
                                Items            = new MenuItem[0],
                                Position         = menuPosition + ":" + String.Join(".", positions.Select(x => x.ToString(CultureInfo.InvariantCulture)).ToArray()),
                                Permissions      = item.Permissions,
                                Content          = part
                            };

                            yield return(inserted);
                        }
                    }
                }
                else
                {
                    yield return(item);
                }
            }
        }
Пример #12
0
        public IEnumerable <MenuItem> Filter(IEnumerable <MenuItem> items)
        {
            foreach (var item in items)
            {
                if (item.Content != null && item.Content.ContentItem.ContentType == "TaxonomyNavigationMenuItem")
                {
                    // expand query

                    var taxonomyNavigationPart = item.Content.As <TaxonomyNavigationPart>();

                    var rootTerm = _taxonomyService.GetTerm(taxonomyNavigationPart.TermId);

                    List <int> positionList = new List <int>();

                    var allTerms = rootTerm != null
                                       ? _taxonomyService.GetChildren(rootTerm).ToArray()
                                       : _taxonomyService.GetTerms(taxonomyNavigationPart.TaxonomyId).ToArray();

                    var rootlevel = rootTerm == null ? 0 : rootTerm.GetLevels();

                    positionList.Add(0);

                    var menuPosition = item.Position;
                    int parentLevel  = rootlevel;

                    foreach (var contentItem in allTerms)
                    {
                        if (contentItem != null)
                        {
                            var part = contentItem;

                            if (taxonomyNavigationPart.HideEmptyTerms == true && part.Count == 0)
                            {
                                continue;
                            }
                            string termPosition = "";
                            if (part.GetLevels() - rootlevel > parentLevel)
                            {
                                positionList.Add(0);
                                parentLevel = positionList.Count - 1;
                            }
                            else
                            if ((part.GetLevels() - rootlevel) == parentLevel)
                            {
                                positionList[parentLevel]++;
                            }
                            else
                            {
                                positionList.RemoveRange(1, positionList.Count - 1);
                                parentLevel = positionList.Count - 1;
                                positionList[parentLevel]++;
                            }

                            termPosition = positionList.First().ToString();
                            foreach (var position in positionList.Skip(1))
                            {
                                termPosition = termPosition + "." + position.ToString();
                            }


                            var menuText = _contentManager.GetItemMetadata(part).DisplayText;
                            var routes   = _contentManager.GetItemMetadata(part).DisplayRouteValues;

                            if (taxonomyNavigationPart.DisplayContentCount)
                            {
                                menuText = String.Format(menuText + " ({0})", part.Count.ToString());
                            }

                            var inserted = new MenuItem {
                                Text             = new LocalizedString(menuText),
                                IdHint           = item.IdHint,
                                Classes          = item.Classes,
                                Url              = item.Url,
                                Href             = item.Href,
                                LinkToFirstChild = false,
                                RouteValues      = routes,
                                LocalNav         = item.LocalNav,
                                Items            = new MenuItem[0],
                                Position         = menuPosition + ":" + termPosition,
                                Permissions      = item.Permissions,
                                Content          = part
                            };

                            yield return(inserted);
                        }
                    }
                }
                else
                {
                    yield return(item);
                }
            }
        }