public void Describe(DescribeSortCriterionContext describe) { foreach (var part in _contentDefinitionManager.ListUserDefinedPartDefinitions()) { if (!part.Fields.Any()) { continue; } var descriptor = describe.For(part.Name + "ContentFields", T("{0} Content Fields", part.Name.CamelFriendly()), T("Content Fields for {0}", part.Name.CamelFriendly())); foreach (var field in part.Fields) { var localField = field; var localPart = part; var drivers = _contentFieldDrivers.Where(x => x.GetFieldInfo().Any(fi => fi.FieldTypeName == localField.FieldDefinition.Name)).ToList(); var membersContext = new DescribeMembersContext( (storageName, storageType, displayName, description) => { // look for a compatible field type editor IConcreteFieldTypeEditor fieldTypeEditor = _fieldTypeEditors.FirstOrDefault(x => x.CanHandle(localField.FieldDefinition.Name, storageType)) ?? _fieldTypeEditors.FirstOrDefault(x => x.CanHandle(storageType)); if (fieldTypeEditor == null) { return; } descriptor.Element( type: localPart.Name + "." + localField.Name + "." + storageName ?? "", name: new LocalizedString(localField.DisplayName + (displayName != null ? ":" + displayName.Text : "")), description: description ?? T("{0} property for {1}", storageName, localField.DisplayName), sort: context => fieldTypeEditor.ApplySortCriterion(context, storageName, storageType, localPart, localField), display: context => DisplaySortCriterion(context, localPart, localField), form: SortCriterionFormProvider.FormName); }); foreach (var driver in drivers) { driver.Describe(membersContext); } } } }
public bool Build() { // user-defined parts // except for those parts with the same name as a type (implicit type's part or a mistake) var userDefinedParts = _contentDefinitionManager .ListUserDefinedPartDefinitions() .Select(cpd => new DynamicTypeDefinition { Name = cpd.Name, Fields = cpd.Fields.Select(f => new DynamicFieldDefinition { Name = f.Name, Type = GetFieldType(f.FieldDefinition.Name) }) }).ToList(); if (userDefinedParts.Any()) { Build(userDefinedParts); return(true); } return(false); }