Поиск По Контенту — Повторное Использование Поля Вычисляемого Индекса Для Нескольких Полей Шаблона.

  • Автор темы Kochemasov6
  • Обновлено
  • 22, Oct 2024
  • #1

Есть ли способ повторно использовать код для вычисляемого индексного поля, не создавая производные классы? Я хотел бы иметь в конфигурации дополнительное свойство, которое сообщает методу ComputeFieldValue, из какого поля шаблона следует читать.

Итак, мой патч конфигурации будет выглядеть так:

 
 public class MyComputedIndexField : AbstractComputedIndexField
{

public string TemplateFieldName { get; set; }

public override object ComputeFieldValue(IIndexable indexable)

{

Item item = indexable as SitecoreIndexableItem;

if (item == null)

{

return null;

}

var values = item[TemplateFieldName]?.Split(new[] {";"}, StringSplitOptions.RemoveEmptyEntries); //readthe TemplateFieldName property here

return values?.Select(v => v.Trim()).ToList();

}
}
 

И мой класс индексации будет следующим:

<field fieldName="mounting" templateFieldName="Mounting" <<new property here returnType="stringCollection"> MyNamespace.MyComputedIndexField, MyAssembly </field>

Очевидно, я мог бы просто установить для свойства fieldName по умолчанию имя поля шаблона, но это ограничило бы имя моего поля, названное в честь имени поля шаблона.

#content-search

Kochemasov6


Рег
01 Mar, 2014

Тем
83

Постов
229

Баллов
684
  • 26, Oct 2024
  • #2

Да, вы можете извлечь пользовательские параметры из

 
 
 public class MyComputedIndexField : AbstractComputedIndexField
{

public string TemplateFieldName { get; set; }

public MyComputedIndexField(XmlNode configNode) : base(configNode)

{

this.TemplateFieldName = XmlUtil.GetAttribute("templateFieldName", configNode);            

}

public override object ComputeFieldValue(IIndexable indexable)

{

Item item = indexable as SitecoreIndexableItem;

if (item == null)

{

return null;

}

var values = item[TemplateFieldName]?.Split(new[] {";"}, StringSplitOptions.RemoveEmptyEntries); //readthe TemplateFieldName property here

return values?.Select(v => v.Trim()).ToList();

}
}
 
of your field configuration:

AbstractComputedIndexField using System.Xml; using Sitecore.ContentSearch; using Sitecore.ContentSearch.ComputedFields; using Sitecore.Data.Fields; using Sitecore.Data.Items; using Sitecore.Xml; public class MyComputedIndexField : IComputedIndexField { public string FieldName { get; set; } public string ReturnType { get; set; } public string TemplateFieldName { get; set; } public MyComputedIndexField(XmlNode configNode) { this.FieldName = XmlUtil.GetAttribute("fieldName", configNode); this.ReturnType = XmlUtil.GetAttribute("returnType", configNode); this.TemplateFieldName = XmlUtil.GetAttribute("templateFieldName", configNode); } public virtual object ComputeFieldValue(IIndexable indexable) { Item item = indexable as SitecoreIndexableItem; if (item == null) { return null; } var values = item[TemplateFieldName]?.Split(new[] {";"}, StringSplitOptions.RemoveEmptyEntries); //readthe TemplateFieldName property here return values?.Select(v => v.Trim()).ToList(); } }

или с наследованием от <field fieldName="mounting" templateFieldName="Mounting" returnType="stringCollection"> MyNamespace.MyComputedIndexField, MyAssembly </field> :

XmlNode
 

Apishap


Рег
27 May, 2006

Тем
89

Постов
188

Баллов
643
Похожие темы Дата
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно