Одна из наиболее часто возникающих задач при разработке порталов на SharePoint - создание веб-части , отображающей ближайшие дни рождения пользователей.
В SharePoint 2010 есть служба профилей пользователей, которая хранит данные о пользователях, в том числе дни рождения, в масштабах фермы. Для отображения списка пользователей можно использовать веб-часть "Основные результаты поиска людей". Но если разместить веб-часть на форму, то она не выводит результатов.
Чтобы отобразить результаты необходимо "Добавить текст в запрос".
Так как используется поиск надо заранее выполнить обход и в службе профилей должны быть записи.
Веб-часть отображения результатов поиска наследует DataFormWebPart, поэтому можно настроить отображение в виде xslt. Но для этого надо отключить отображение по-умолчанию.
XSL для отображения:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<table>
<tr>
<th>
User name
</th>
<th>
Account name
</th>
</tr>
<xsl:apply-templates select="All_Results/Result"/>
</table>
</xsl:template>
<xsl:template match="Result">
<tr>
<td>
<xsl:value-of select="preferredname"/>
</td>
<td>
<xsl:value-of select="accountname"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Веб-части поиска выводят управляемые свойства поиска, которые задаются в central administration. Чтобы выводить (и использовать в запросах) дату рождения необходимо создать управляемое свойство, которое отображается на свойство профиля.
После добавления свойства обязательно надо выполнить полный обход содержимого.
После обходи можно добавить элемент в свойства columns веб-части и дописать xslt для вывод нужного значения.
Даты в профиле пользователя вводятся в формате “Месяц День”, 2000 год дописывается сам (чтобы можно было 29 февраля ввести). При выводе вам надо самостоятельно форматировать даты.
Теперь остается две проблемы:
- Сортировка результатов. По-умолчанию веб часть не поддерживает сортировку по произвольному полю.
- Динамический запрос. В параметрах веб-части можно ввести только статическую строку и получить текущую дату нельзя.
Для того чтобы победить обе проблемы можно наследоваться от веб-части поиска, но веб-часть поиска людей sealed. Поэтому надо наследоваться от веб-части поиска контента.
Для этого нужно создать веб-часть в visual studio.
public class WebPart1 : CoreResultsWebPart
{
protected override string DefaultSearchLocation
{
get
{
//For people search
return "LocalPeopleSearchIndex";
}
}
protected override void ConfigureDataSourceProperties()
{
base.ConfigureDataSourceProperties();
var ds = this.DataSource as CoreResultsDatasource;
ds.SortOrder.Clear();
ds.SortOrder.Add("Birthday", Microsoft.Office.Server.Search.Query.SortDirection.Descending);
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
var today2000 = new DateTime(2000, DateTime.Today.Month, DateTime.Today.Day);
this.AppendedQuery = string.Format("Birthday>=\"{0}\" AND Birthday<\"{1}\" ",
today2000.ToShortDateString(),
today2000.AddDays(3).ToShortDateString());
}
}
Свойство AppendedQuery – это “Добавить текст в запрос” в интерфейсе.
Результат после размещения на форме и правки представления:
Заключение
Стандартные веб-части поиска – очень мощный механизм вывода данных. Если мощности стандартных веб-частей не хватает, то их очень легко расширить с помощью кода.
