Одна из наиболее часто возникающих задач при разработке порталов на SharePoint  - создание веб-части , отображающей ближайшие дни рождения пользователей.

В SharePoint 2010 есть служба профилей пользователей, которая хранит данные о пользователях, в том числе дни рождения, в масштабах фермы. Для отображения списка пользователей можно использовать веб-часть "Основные результаты поиска людей". Но если разместить веб-часть на форму, то она не выводит результатов.

image

Чтобы отобразить результаты необходимо "Добавить текст в запрос".

image

Так как используется поиск надо заранее выполнить обход и в службе профилей должны быть записи.

 

Веб-часть отображения результатов поиска наследует DataFormWebPart, поэтому можно настроить отображение в виде xslt. Но для этого надо отключить отображение по-умолчанию.

image

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. Чтобы выводить (и использовать в запросах) дату рождения необходимо создать управляемое свойство, которое отображается на свойство профиля.

image

image

После добавления свойства обязательно надо выполнить полный обход содержимого.

После обходи можно добавить элемент в свойства columns веб-части и дописать xslt для вывод нужного значения.

image

Даты в профиле пользователя вводятся в формате “Месяц День”, 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 – это “Добавить текст в запрос” в интерфейсе.

Результат после размещения на форме и правки представления:

image

Заключение

Стандартные веб-части поиска – очень мощный механизм вывода данных. Если мощности стандартных веб-частей не хватает, то их очень легко расширить с помощью кода.

Теги : SharePoint