示例#1
0
        /// <summary>
        /// Gets the content of the related items.
        /// </summary>
        /// <param name="part">The part.</param>
        /// <returns></returns>
        public IEnumerable<RelatedContentTypeModel> GetRelatedContent(RelatedContentPart part)
        {
            var culture = orchardServices.WorkContext.CurrentCulture;

            var settings = part.Settings.GetModel<RelatedContentRelationshipSettings>();
            var relatedcontentFields = settings.RelatedContentFields.Split(new string[] { "<field>", "</field>" }, StringSplitOptions.RemoveEmptyEntries).ToList();//new List<string> { settings.RelatedContentFields1, settings.RelatedContentFields2, settings.RelatedContentFields3 };
            var relatedcontentTypes = settings.RelatedcontentType.Split(new string[] { "<field>", "</field>" }, StringSplitOptions.RemoveEmptyEntries).ToList();//new List<string> { settings.RelatedcontentType1, settings.RelatedcontentType2, settings.RelatedcontentType3 };
            var displayNames = settings.DisplayName.Split(new string[] { "<field>", "</field>" }, StringSplitOptions.RemoveEmptyEntries).ToList();//List<string> { settings.DisplayName1, settings.DisplayName2, settings.DisplayName3 };
            var relatedContent = new List<RelatedContentTypeModel>();
            var relatedContentfield = relatedcontentFields.GetEnumerator();
            var displayNameEnumerator = displayNames.GetEnumerator();

            foreach (var relatedcontentType in relatedcontentTypes)
            {
                var relatedContentTypes = new RelatedContentTypeModel
                {
                    RelatedItems = new List<ContentItem>(),
                };
                relatedContentfield.MoveNext();
                displayNameEnumerator.MoveNext();
                if (relatedcontentType == null)
                    continue;

                if (relatedContentfield.Current == null)
                    continue;
                var contentItems = contentManager.Query().ForType(relatedcontentType).List();

                relatedContentTypes.Name = displayNameEnumerator.Current;

                foreach (var contentItem in contentItems)
                {
                    var fieldElements = relatedContentfield.Current.Split('.');
                    dynamic element = Dynamic.InvokeGet(contentItem, contentItem.ContentType);
                    foreach (var fieldElement in fieldElements)
                    {
                        element = Dynamic.InvokeGet(element, fieldElement.Trim());
                    }
                    element = Dynamic.InvokeGet(element, "Ids");
                    int[] participantIds = element;
                    if (participantIds.Contains(part.Id))
                    {
                        if (CanAdd(contentItem, contentItems, culture, fieldElements, part.Id))
                            relatedContentTypes.RelatedItems.Add(contentItem);
                    }


                }

                relatedContentTypes.RelatedItems = relatedContentTypes.RelatedItems.OrderBy(i => i.As<TitlePart>().Title).ToList();

                relatedContent.Add(relatedContentTypes);
            }
            return relatedContent;
        }
        private void SetupLazyFields(ActivatedContentContext context, RelatedContentPart part)
        {
            part.RelatedContentTypesField.Loader(() => relatedContentService.GetRelatedContent(part));

        }