2014-09-05 2 views
0

В Sitecore, как я могу определить имена полей индекса для производных свойств класса SearchResultItem, отличных от атрибута [IndexField]?Sitecore SearchResulItem - свободный API?

Я пытаюсь использовать те же интерфейсы, которые я использую для определения модели Glass.Mapper, и он уже содержит атрибут [SitecoreField] для свойств, которые определяют имя поля Sitecore (и, следовательно, имя поля индекса).

Спасибо!

ответ

0

Я не думаю, вот это возможно, так как «IndexField» и «SitecoreField» представляют собой различные вещи, атрибут «IndexField» задает имя поля индекса, например, "IndexField (» _id ") ',' IndexField (" _ language ") 'представляет имена полей id и языка внутри документа lucene.

Теперь, Sitecore по умолчанию, сохранить имена индексов всех полей по его имени в Sitecore, например, поле, называемое «Content» будет храниться в Lucene документе как «содержание» по умолчанию. которые вы можете изменить на что-то еще, если хотите.

Атрибут SitecoreField представляет фактическое имя поля для элемента, так что стекло может отображать это значение поля в свойство.

Нижняя линия, вам просто нужно указать IndexField и SitecoreField на каждого свойства в классе, так как каждый атрибут работает иначе

+0

Да, они не нужны то же самые, но по умолчанию поля документа Lucene (.ToLower(). Замените ('', _ '), но так как это преобразование выполняется автоматически, я получаю атрибуты IndexField и SitecoreField с тем же параметром. Так что я хочу найти и ввести точку, чтобы добавить картографию программно. В качестве альтернативы, я попытался найти способ создания настраиваемого картографа и использовать его для этого, но я не мог его найти - есть слишком много кода, и поскольку он открыт с помощью отражателя, комментариев для описания поведения нет. – Zenima

0

Я считаю, что вы могли бы изменить Sitecore Glass Mapper SitecoreFieldAttribute для достижения этой цели.

Вы можете реализовать интерфейс IIndexFieldNameFormatterAttribute на стекле Mapper SitecoreFieldAttribute.

Этот интерфейс вы найдете в Sitecore.ContentSearch.Linq.dll и выглядит следующим образом:

namespace Sitecore.ContentSearch 
{ 
    public interface IIndexFieldNameFormatterAttribute : _Attribute 
    { 
     string GetIndexFieldName(string fieldName); 

     string GetTypeFieldName(string fieldName); 
    } 
} 

Ваша реализация будет то, что, я вставил только методы интерфейса здесь.

namespace Glass.Sitecore.Mapper.Configuration.Attributes 
{ 
    /// <summary> 
    /// Used to populate the property with data from a Sitecore field 
    /// </summary> 
    public class SitecoreFieldAttribute: AbstractSitecorePropertyAttribute, IIndexFieldNameFormatterAttribute 
    { 
     public string GetIndexFieldName(string fieldName) 
     { 
      return this.FieldName; 
     } 

     public string GetTypeFieldName(string fieldName) 
     { 
      return fieldName; 
     } 

я проверить его убежищем `т, но, как я мог видеть Sitecore Linq полагаться на этот интерфейс, чтобы найти имена полей. Вы можете исследовать это самостоятельно, но вот кусок кода, который заставил меня сделать вывод, что:

var variable = (from p in (IEnumerable<PropertyInfo>)typeof(TItem).GetProperties() 
       select new { Property = p, Attribute = (IIndexFieldNameFormatterAttribute)p.GetCustomAttributes().FirstOrDefault<Attribute>((Attribute a) => a is IIndexFieldNameFormatterAttribute) }).FirstOrDefault((p) => p.Attribute != null); 
      if (variable != null && variable.Attribute.GetIndexFieldName(variable.Property.Name) == this.FieldName) 
      { 
       property = variable.Property; 
      } 

Надеется, что это помогает ..

Смежные вопросы