Одна из наиболее часто возникающих задач при разработке порталов на 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 – это “Добавить текст в запрос” в интерфейсе.
Результат после размещения на форме и правки представления:
Заключение
Стандартные веб-части поиска – очень мощный механизм вывода данных. Если мощности стандартных веб-частей не хватает, то их очень легко расширить с помощью кода.