Первая часть этой серии была написана примерно полтора года назад, после этого появился SharePoint 2013, в котором добавили очень много возможностей для использовании поиска в решениях. Но недавний опрос в сообществе (https://www.facebook.com/groups/sharepointrussian/permalink/514677285314072/?stream_ref=2) показал, что наиболее популярной версией до сих пор является SharePoint 2010.
В первой части я рассказывал как использовать стандартные веб-части поиска в SharePoint 2010, теперь расскажу как с помощью небольшого объема кода получить максимальное мощное решение для создания порталов.
DataFormWebPart
Стандартная веб-часть SharePoint позволяет использовать различные источники данных и формировать разметку с помощью XSL. Источник данных описывается с помою класса наследника System.Web.UI.DataSourceControl. В разметке страницы или .webpart файле можно указать какой DataSource использовать в веб-части.
SearchDataource
Для начала создадим DataSource, который возвращает результаты поискового запроса. На MSDN есть инструкция по созданию класса DataSource - http://msdn.microsoft.com/RU-RU/library/92e191zc(v=vs.90)
public class SearchDataSource: DataSourceControl
{
protected override DataSourceView GetView(string viewName)
{
return new SearchDataSourceView(this);
}
public string QueryText { get; set; }
public string SelectProperties { get; set; }
}
Основная работа делается в классе SearchDataSourceView, наследнике DataSourceView. class SearchDataSourceView: DataSourceView
{
SearchDataSource dataSource;
public SearchDataSourceView(SearchDataSource dataSource): base(dataSource,"")
{
this.dataSource = dataSource;
}
public override bool CanPage
{
get
{
return true;
}
}
public override bool CanSort
{
get
{
return true;
}
}
public override bool CanRetrieveTotalRowCount
{
get
{
return true;
}
}
protected override System.Collections.IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
{
var query = GetQuery(arguments.SortExpression);
query.StartRow = arguments.StartRowIndex;
query.RowLimit = arguments.MaximumRows;
var results = query.Execute()[ResultType.RelevantResults];
arguments.TotalRowCount = results.TotalRows;
return results.Table.DefaultView;
}
private KeywordQuery GetQuery(string sortExpression)
{
/* omited for clarity */
}
}
Основной метод класса – ExecuteSelect, он должен возвращать IEnumerable, поддерживающий TypeDescriptor, например DataView. Про TypeDescriptors я писал ранее – http://gandjustas.blogspot.ru/2011/08/blog-post_22.html. Класс DataSourceView может поддерживать разбиение на страницы и сортировку, это определяется свойствами, которые я переопределил в начале.
Код создания запроса:
private KeywordQuery GetQuery(string sortExpression)
{
var query = new KeywordQuery(SPContext.Current.Site);
query.QueryText = this.dataSource.QueryText;
query.ResultTypes = ResultType.RelevantResults;
if (!string.IsNullOrEmpty(this.dataSource.SelectProperties))
{
query.SelectProperties.Clear();
foreach (var property in this.dataSource.SelectProperties.Split(','))
{
query.SelectProperties.Add(property.Trim());
}
}
if (!string.IsNullOrEmpty(sortExpression))
{
query.SortList.Clear();
foreach (var sort in sortExpression.Split(','))
{
if (sort.EndsWith(" DESC"))
{
query.SortList.Add(sort.Substring(0, sort.IndexOf(" DESC")), SortDirection.Descending);
}
else
{
query.SortList.Add(sort, SortDirection.Ascending);
}
}
}
return query;
}
Этот код заполняет базовые параметры, запрашиваемые свойства и параметры сортировки.
Настройка веб-части
Добавляем веб-часть на страницу
Далее заменяем DataSource и вставляем identity transform
Директиву Register нужно вставлять прямо в раздел DataSource. В XSL надо вставить Identity Transform, чтобы получить данные в виде XML :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/" >
<xmp>
<xsl:copy-of select="." />
</xmp>
</xsl:template>
</xsl:stylesheet>
В результате получим такое:
Далее можно скопировать полученный XML и сделать необходимый XSL в Visual Studio или в SharePoint Designer.
Например так:
Создаем пакет решения
Чтобы завернуть полученный результат в WSP надо экспортировать веб-часть с сайта. Получившийся .webpart файл включить в решение. Это все.
Причем можно деплоить сборку с DataSource в farm solution, а .webpart файлы в sandbox.
Для конкретных задач можно расширить функционал:
- Добавить обработку параметров DataSource. Параметры позволяют использовать значения QueryString, связи между веб-частями и другие внешние факторы. Также можно создавать свои параметры.
- Сделать аналогичный DataSource для RefinementResults, чтобы получать статистику. Что очень часто нужно для главной страницы порталов.
Если вам нужна веб-часть в одном экземпляре (что бывает чуть менее, чем всегда), то можно не париться с сохранением .webpart и ковырянием в SharePoint Designer. Достаточно просто сделать наследника DataFormWebPart и переопределить метод GetDataSouce. При этом можно также переопределить XSL, чтобы он всегда указывал на файл в виртуальной файловой системе. Это значительно облегчит сопровождение решения.
Заключение
Как обычно исходники можно найти на http://spsamples.codeplex.com. Также сделал релиз: https://spsamples.codeplex.com/releases/view/117762.
Качайте, смотрите, изучайте, интегрируйте в свои решения.

