воскресенье, 29 июня 2008 г.

Русский язык зло!!!

Во всяком случае применительно к развертыванию в среде MOSS. Причина этого в следующем, как я уже писал в передыдущем посте о кастомизации поиска, если при создании столбца указать имя столбца в национальной символике, то название данного столбца сохраниться во внутренних структурах в виде ows_x0414_x0420_2007_x002d_7. Так что следуйте простому совету: создавайте столбцы только на английском языки и только после этого переименовывайте их в русскоязычные. При таком алгоритме вы получите удобочитаемую конструкцию при программировании запросов с помощью технологии CAML.
P.S. В данный момент занимаюсь системой подачизаявок в список SharePoint, общая мысль такая: создается документ MS Word с макросами и после выделения куска текста можно отослать комментарий в список SharePoint.

вторник, 24 июня 2008 г.

MOSS 2007 customization search

Организация расширенного поиска в MOSS 2007
Руководство по развертыванию расширенного поиска для внедренцев

Автор: Коротенко Владимир Николаевич
Yappi.biz

Источник: http://mossdevel.blogspot.com
Опубликовано: 11.06.2008
Версия текста: 1.0

Введение

Целью данного решение является предоставление законченного решения для организации поиска по дополнительным аргументам документа в библиотеке MOSS 2007.

В ходе разработки данного внедрения будут освещены вопросы создания библиотеки документов с дополнительными атрибутами и организация поиска по этим атрибутам.

MOSS предоставляет очень мощьный и одновременно гибкий механизм поиска. Большинство стандартных форматов офисных файлов индексируются по умолчанию, и предоставляет очень удобный механизм для извлечения данных.

Кратко алгоритм добавления нового поля можно описать так:

  • Добавление нового типа столбца в определение сайта
  • Создание библиотеки или списка содержащих этот столбец
  • Обход содержимого, для внесения информации о добавленном столбце
  • Сопоставление метаданных для обеспечения поиска по данному столбцу
  • Создание сайта и страниц для поиска
  • Настройка файла определения для формы расширенного поиска
  • Настройка фильтруемых столбцов при отображении
  • Настройка шаблона для вывода результатов поиска

Создание узла для кастомизации поиска

Создайте узел с помощью следующих действий:

  • В меню Действия узла выберите пункт создать веб узел
  • Заполните поля для вновь создаваемого узла (Название и описание, Адрес веб-узла)
  • Выберите шаблон Центр поиска на вкладке Корпоративный
  • Нажмите кнопку Создать для создания узла.
  • Настройте дополнительную вкладку для обеспечения ваших условий поиска

Ссылка на блог http://www.sharepoint-tips.com/2006/07/found-it-how-to-add-properties-to.html

Модификация столбцов узла

  • Выполните команду Изменение параметров узла выбрав Действия узла \ Параметры узла
  • Перейдите по ссылке Столбцы узла
  • Щелкните по кнопке создать и заполните поля предлагаемые вам

После этого этапа создайте библиотеку содержащую данный тип столбца.

Внесите в данную библиотеку один элемент и переходите к Добавление свойств для поиска в центре поиска

Добавление свойств для поиска в центре поиска

Для проведения данного этапа необходимо произвести полную индексацию содержимого того узла в который был добавлен новый столбец, только после этого появиться возможность его индексировать.

Оригинал данной статьи http://www.codeproject.com/KB/sharepoint/MOSS_Advanced_Search.aspx

  • Перейдите в центр администрирования и выберите пункт настройки общих сервисов для фермы.
  • Перейдите по ссылке Поиск \ Параметры поиска
  • Перейдите по ссылке Сопоставление свойств метаданных
  • Щелкните на кнопке Создать управляемое свойство
  • Выберите имя свойства, укажите тип и щелкните на кнопку добавить сопоставление
  • Укажите имя поля, которое вы определили на этапе модификации столбцов узла для меппинга на это поле
ПРИМЕЧАНИЕ

Обратите внимание что нужные вам категории находятся в категории SharePoint и русские имена полей кодируются в виде значений типа ows_x0414_x0420_2007_x002d_7

Создание вкладки для поиска

Создайте страницы для поиска и результатов поиска с помощью команд меню Действия узла \ Создание страницы

СОВЕТ

В поле URL-имя: лучше вводить полный путь начиная от корня сайта например http://portal/custsearch/result.aspx

Создайте новую вкладку на панели поиска и выберите ссылку добавить вкладку.

Укажите страницу которую вы создали на предыдущем этапе

Сбросьте галочку Показать список выбора языков

Отредактируйте перенаправление на вашу страницу

Настройте правила настройки поиска для отбора различных параметров поиска

Изменение параметров для поисковой формы

Ниже приведен код определения для поискового запроса, после внесения правок в данный документ удалите символы переноса строки. Документ должен быть в одну строку. Ниже приведен код который надо сохранить в файл с расширением .html. внешний вид приведен на рисунке:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <LangDefs>
  <!-- Определения языков для отображения в панели выбора языков -->
  <LangDef DisplayName="финский" LangID="11"/>  
  <LangDef DisplayName="немецкий" LangID="7"/>  
  <LangDef DisplayName="иврит" LangID="13"/>  
  <LangDef DisplayName="латышский" LangID="38"/>
  <LangDef DisplayName="литовский" LangID="39"/>  
  <LangDef DisplayName="русский" LangID="25"/>  
  <LangDef DisplayName="украинский" LangID="34"/>  
 </LangDefs>
 <Languages>
  <!-- Список отображаемых языков для вывода в поле выбора языка -->
  <Language LangRef="11"/>
  <Language LangRef="7"/>
  <Language LangRef="13"/>
  <Language LangRef="38"/>
  <Language LangRef="39"/>
  <Language LangRef="25"/>
  <Language LangRef="34"/>
 </Languages>
 <PropertyDefs>
  <!-- Определения аттрибутов документв для поискового запроса -->
  <!-- <PropertyDef Name="Имя столбца" DataType="тип данных" DisplayName="Имя для отображения на экране"/> -->
  <PropertyDef Name="Path" DataType="text" DisplayName="URL-адрес"/>
  <PropertyDef Name="Size" DataType="integer" DisplayName="Размер"/>
  <PropertyDef Name="Write" DataType="datetime" DisplayName="Дата изменения"/>
  <PropertyDef Name="FileName" DataType="text" DisplayName="Имя"/>
  <PropertyDef Name="Description" DataType="text" DisplayName="Описание"/>
  <PropertyDef Name="Title" DataType="text" DisplayName="Название"/>
  <PropertyDef Name="Author" DataType="text" DisplayName="Автор"/>
  <PropertyDef Name="DocSubject" DataType="text" DisplayName="Тема"/>
  <PropertyDef Name="DocKeywords" DataType="text" DisplayName="Ключевые слова"/>
  <PropertyDef Name="DocComments" DataType="text" DisplayName="Заметки"/>
  <PropertyDef Name="Manager" DataType="text" DisplayName="Руководитель"/>
  <PropertyDef Name="Company" DataType="text" DisplayName="Организация"/>
  <PropertyDef Name="Created" DataType="datetime" DisplayName="Дата создания"/>
  <PropertyDef Name="CreatedBy" DataType="text" DisplayName="Кем создано"/>
  <PropertyDef Name="ModifiedBy" DataType="text" DisplayName="Кем изменено"/>
  <PropertyDef Name="Company" DataType="text" DisplayName="Компания"/>
  <!-- Новый пользовательский столбец с штрих кодом документа -->
  <PropertyDef Name="BarCode" DataType="text" DisplayName="Штрих код"/>
  <!-- Новый пользовательский столбец с именем отдела -->
  <PropertyDef Name="Department" DataType="text" DisplayName="Отдел"/>
 </PropertyDefs>
 <ResultTypes>
  <!-- набор предопределенных типов содержимого для поиска -->
  <!-- 
  Определены 5 типов запросов: запрос без фильтрации,запрос документов, запрос документов Word, 
  запрос таблиц Excel,запрос презентаций 
  -->
  <ResultType DisplayName="Все результаты" Name="default">   
   <Query/>
   <PropertyRef Name="Author" />
   <PropertyRef Name="Description" />
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Company" />
   <PropertyRef Name="Department" />
   <PropertyRef Name="BarCode" />
  </ResultType>
  <ResultType DisplayName="Документы" Name="documents">
   <!-- Условие фильтрации -->
   <Query>IsDocument=1</Query>
   <PropertyRef Name="Author" />
   <PropertyRef Name="DocComments"/>
   <PropertyRef Name="Description" />
   <PropertyRef Name="DocKeywords"/>
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="DocSubject"/>
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Title"/>
   <PropertyRef Name="Manager" />
   <PropertyRef Name="Company"/>
  </ResultType>
  <ResultType DisplayName="Документы Word" Name="worddocuments">
   <!-- Выборка документов по содержимому -->
   <Query>FileExtension='doc' Or FileExtension='docx' Or FileExtension='dot'</Query>
   <PropertyRef Name="Author" />
   <PropertyRef Name="DocComments"/>
   <PropertyRef Name="Description" />
   <PropertyRef Name="DocKeywords"/>
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="DocSubject"/>
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Title"/>
   <PropertyRef Name="Manager" />
   <PropertyRef Name="Company"/>
  </ResultType>
  <ResultType DisplayName="Документы Excel" Name="exceldocuments">
   <Query>FileExtension='xls' Or FileExtension='xlsx' Or FileExtension='xlt'</Query>
   <PropertyRef Name="Author" />
   <PropertyRef Name="DocComments"/>
   <PropertyRef Name="Description" />
   <PropertyRef Name="DocKeywords"/>
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="DocSubject"/>
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Title"/>
   <PropertyRef Name="Manager" />
   <PropertyRef Name="Company"/>
  </ResultType>
  <ResultType DisplayName="Презентации" Name="presentations">
   <Query>FileExtension='ppt'</Query>
   <PropertyRef Name="Author" />
   <PropertyRef Name="DocComments"/>
   <PropertyRef Name="Description" />
   <PropertyRef Name="DocKeywords"/>
   <PropertyRef Name="FileName" />
   <PropertyRef Name="Size" />
   <PropertyRef Name="DocSubject"/>
   <PropertyRef Name="Path" />
   <PropertyRef Name="Created" />
   <PropertyRef Name="Write" />
   <PropertyRef Name="CreatedBy" />
   <PropertyRef Name="ModifiedBy" />
   <PropertyRef Name="Title"/>
   <PropertyRef Name="Manager" />
   <PropertyRef Name="Company"/>
  </ResultType>
 </ResultTypes>
</root>
ПРИМЕЧАНИЕ

Обратите внимание на то, что после редактирования данного определения вы должны убрать из всего кода переносы, т.е. файл должен быть очищен от символов \r\n, я пользуюсь для данных целей следующим кодом, сохраненным в файл crunch.html

<script type="text/javascript">
function ClearForm()
{
var arr = codes.value.split('\r\n');
var buf = '';
for (i=0; i<arr.length; i++)
{
var b = arr[i].replace(/^\s+/, '');
b.replace(/\s+$/, '');
buf += b;
}
codes.value = buf;
}
</script>

<textarea id="codes" name="codes" rows=20 cols="80">
</textarea>
<input type=button value="Очистить" onclick="ClearForm('codes')"/>

Настройка шаблона для вывода результатов поиска

Механизм поиска в MOSS реализован следующим образом:

  • Формирование поискового запроса в веб части поиска или веб части расширенного поиска с определением результатов поиска и ограничивающими условиями. Данные правила представлены в виде специально оформленного документа XML который содержиться в одном из свойств веб части поиска.
  • Выполнение поискового запроса в соответствии с переданными параметрами поиска
  • Передача результатов поиска в виде документа XML в веб часть отображения результатов поиска.
  • Фильтрация отбираемых столбцов на основе заданных параметров в веб части отображения результатов поиска.
  • Применение шаблона XSLT к результатам поиска для получения представления отображения

Для настройки вывода результатов поиска вам необходимо произвести следующие действия:

  • Определить столбцы, которые будут выводиться в результирующий набор.
  • Отредактировать шаблон для обработки результатов поиска.

Определение столбцов для вывода производится путем изменения свойства веб части Основные результаты поиска.

Выберите пункт настройки веб части щелкнув на треугольнике в правом верхнем углу веб части в режиме редактирования страницы.

Измените набор столбцов на нужный вам при получении результатов.

Ниже приведен код определения столбцов с определением 2 дополнительных столбцов; KvnBarCode и KvnDepartment.

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <Columns>
  <Column Name="WorkId"/>
  <Column Name="Title"/>
  <Column Name="Author"/>
  <Column Name="Path"/>
  <Column Name="Description"/>
  <Column Name="Write"/>
  <Column Name="IsDocument"/>
  <Column Name="KvnBarCode"/>
  <Column Name="KvnDepartment"/>
 </Columns>
</root>
ПРЕДУПРЕЖДЕНИЕ

Внимание после редактирования данного документа удалите все символы переноса строки с помощью файла trim.htm, который описан выше

После определения столбцов перейдите к редактированию шаблона отображения.

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

Первоначально я привожу 2 шаблона для отображения результатов поиска, первый предназначен для тестового использования и выдает код ответа на поисковый запрос без изменения.

<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="/" >
  <xmp><xsl:copy-of select="*"/> </xmp>
 </xsl:template>

</xsl:stylesheet> 

Второй шаблон предназначен для вывода данных в виде таблицы и применяется для группировки результатов поиска в табличном представлении. Внимательно читайте комментарии написанные по-русски. Так - же приветствуются знание технологии XSL. Краткое руководство по данному языку можно найти по адресу http://www.rol.ru/news/it/helpdesk/xslt01.htm

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
 <xsl:param name="ResultsBy" />
 <xsl:param name="ViewByUrl" />
 <xsl:param name="ViewByValue" />
 <xsl:param name="IsNoKeyword" />
 <xsl:param name="IsFixedQuery" />
 <xsl:param name="ShowActionLinks" />
 <xsl:param name="MoreResultsText" />
 <xsl:param name="MoreResultsLink" />
 <xsl:param name="CollapsingStatusLink" />
 <xsl:param name="CollapseDuplicatesText" />
 <xsl:param name="AlertMeLink" />
 <xsl:param name="AlertMeText" />
 <xsl:param name="SrchRSSText" />
 <xsl:param name="SrchRSSLink" />
 <xsl:param name="ShowMessage" />
 <xsl:param name="IsThisListScope" />
 <xsl:param name="DisplayDiscoveredDefinition" select="True" />
 <xsl:param name="NoFixedQuery" />
 <xsl:param name="NoKeyword" />
 <xsl:param name="NoResults" />
 <xsl:param name="NoResults1" />
 <xsl:param name="NoResults2" />
 <xsl:param name="NoResults3" />
 <xsl:param name="NoResults4" />
 <xsl:param name="DefinitionIntro" />

 <!-- When there is keywory to issue the search -->
 <xsl:template name="dvt_1.noKeyword">
  <span class="srch-description">
   <xsl:choose>
    <xsl:when test="$IsFixedQuery">
     <xsl:value-of select="$NoFixedQuery" />
    </xsl:when>
    <xsl:otherwise>
     <xsl:value-of select="$NoKeyword" />
    </xsl:otherwise>
   </xsl:choose>
  </span>
 </xsl:template>


 <!-- When empty result set is returned from search -->
 <!—Отображается когда запрос не вернул ответов -->
 <xsl:template name="dvt_1.empty">
  <div class="srch-sort">
   <xsl:if test="$AlertMeLink and $ShowActionLinks">
    <span class="srch-alertme" >
     <a href ="{$AlertMeLink}" id="CSR_AM1" title="{$AlertMeText}">
      <img style="vertical-align: middle;" src="/_layouts/images/bell.gif" alt="" border="0"/>
      <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
      <xsl:value-of select="$AlertMeText" />
     </a>
    </span>
   </xsl:if>

   <xsl:if test="string-length($SrchRSSLink) &gt; 0 and $ShowActionLinks">
    <xsl:if test="$AlertMeLink">
     |
    </xsl:if>
    <a type="application/rss+xml" href ="{$SrchRSSLink}" title="{$SrchRSSText}" id="SRCHRSSL">
     <img style="vertical-align: middle;" border="0" src="/_layouts/images/rss.gif" alt=""/>
     <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
     <xsl:value-of select="$SrchRSSText"/>
    </a>
   </xsl:if>
  </div>
  <br/>
  <br/>

  <span class="srch-description" id="CSR_NO_RESULTS">
   <xsl:value-of select="$NoResults" />

   <ol>
    <li>
     <xsl:value-of select="$NoResults1" />
    </li>
    <li>
     <xsl:value-of select="$NoResults2" />
    </li>
    <li>
     <xsl:value-of select="$NoResults3" />
    </li>
    <li>
     <xsl:value-of select="$NoResults4" />
    </li>
   </ol>
  </span>
 </xsl:template>


 <!-- Main body template. Sets the Results view (Relevance or date) options -->
 <xsl:template name="dvt_1.body">
  <!-- Выборка всех результатов из набора столбцов -->
  <xsl:variable name="Rows" select="/All_Results/Result"/>
  <div class="srch-results">
   <xsl:if test="$ShowActionLinks">
    <div class="srch-sort">
     <xsl:value-of select="$ResultsBy" />
     <xsl:if test="$ViewByUrl">
      |
      <a href ="{$ViewByUrl}" id="CSR_RV" title="{$ViewByValue}">
       <xsl:value-of select="$ViewByValue" />
      </a>
     </xsl:if>
     <xsl:if test="$AlertMeLink">
      |
      <span class="srch-alertme" >
       <a href ="{$AlertMeLink}" id="CSR_AM2" title="{$AlertMeText}">
        <img style="vertical-align: middle;" src="/_layouts/images/bell.gif" alt="" border="0"/>
        <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
        <xsl:value-of select="$AlertMeText" />
       </a>
      </span>
     </xsl:if>
     <xsl:if test="string-length($SrchRSSLink) &gt; 0">
      |
      <a type="application/rss+xml" href ="{$SrchRSSLink}" title="{$SrchRSSText}" id="SRCHRSSL">
       <img style="vertical-align: middle;" border="0" src="/_layouts/images/rss.gif" alt=""/>
       <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
       <xsl:value-of select="$SrchRSSText"/>
      </a>
     </xsl:if>
    </div>
    <br />
    <br />
   </xsl:if>
<!—Шапка таблицы с результатами запроса информации. Обязательно вносите изменения в этом месте и в блоке запросов для каждой строки, шаблон отмечен комментариями "выполняется для каждой строки"   -->
   <table border="0" width="100%" cellpadding="2" cellspacing="0">
    <tr valign="top">
     <th class="ms-vh" nowrap="nowrap">Title</th>
     <th class="ms-vh" nowrap="nowrap">Summary</th>
     <th class="ms-vh" nowrap="nowrap">Last Modified</th>
     <!-- Заголовки для столбца KvnBarCode -->
     <th class="ms-vh" nowrap="nowrap">KvnBarCode</th>
     <!-- Заголовки для столбца KvnDepartment -->
     <th class="ms-vh" nowrap="nowrap">KvnDepartment</th>

    </tr>
    <xsl:call-template name="results">
     <xsl:with-param name="Rows" select="$Rows"/>
    </xsl:call-template>
   </table>
   <xsl:call-template name="DisplayMoreResultsAnchor" />
  </div>
 </xsl:template>
 <xsl:template name="results">
  <xsl:param name="Rows"/>
  <xsl:for-each select="$Rows">
   <xsl:call-template name="Result3"/>
  </xsl:for-each>
 </xsl:template>

 <!-- This template is called for each result -->
 <!-- выполняется для каждой строки -->
 <!— Формирование строки для таблицы результатов -->
<!— при добавлении нового столбца обязательно добавьте в шапку таблицы определение этого столбца -->


 <xsl:template name="Result3">
  <tr>
   <td class="ms-vb">
    <a href="{url}">
     <xsl:value-of select="title" />
    </a>
   </td>
   <td>
    <xsl:value-of select="description" disable-output-escaping="yes"/>
   </td>
   <td class="ms-vb">
    <xsl:value-of select="write" disable-output-escaping="yes"/>
   </td>

   <td class="ms-vb">
    <xsl:value-of select="kvnbarcode" disable-output-escaping="yes"/>
   </td>
   <td class="ms-vb">
    <xsl:value-of select="kvndepartment" disable-output-escaping="yes"/>
   </td>
  </tr>
 </xsl:template>
 <xsl:template name="HitHighlighting">
  <xsl:param name="hh" />
  <xsl:apply-templates select="$hh"/>
 </xsl:template>

 <xsl:template match="ddd">
  &#8230;
 </xsl:template>
 <xsl:template match="c0">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c1">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c2">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c3">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c4">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c5">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c6">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c7">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c8">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c9">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c10">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c11">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>
 <xsl:template match="c12">
  <b>
   <xsl:value-of select="."/>
  </b>
 </xsl:template>




 <!-- The size attribute for each result is prepared here -->
 <xsl:template name="DisplaySize">
  <xsl:param name="size" />
  <xsl:if test='string-length($size) &gt; 0'>
   <xsl:if test="number($size) &gt; 0">
    -
    <xsl:choose>
     <xsl:when test="round($size div 1024) &lt; 1">
      <xsl:value-of select="$size" /> Bytes
     </xsl:when>
     <xsl:when test="round($size div (1024 *1024)) &lt; 1">
      <xsl:value-of select="round($size div 1024)" />KB
     </xsl:when>
     <xsl:otherwise>
      <xsl:value-of select="round($size div (1024 * 1024))"/>MB
     </xsl:otherwise>
    </xsl:choose>
   </xsl:if>
  </xsl:if>
 </xsl:template>



 <!-- A generic template to display string with non 0 string length (used for author and lastmodified time -->
 <xsl:template name="DisplayString">
  <xsl:param name="str" />
  <xsl:if test='string-length($str) &gt; 0'>
   -
   <xsl:value-of select="$str" />
  </xsl:if>
 </xsl:template>

 <!-- document collapsing link setup -->
 <xsl:template name="DisplayCollapsingStatusLink">
  <xsl:param name="status"/>
  <xsl:param name="urlEncoded"/>
  <xsl:param name="id"/>
  <xsl:if test="$CollapsingStatusLink">
   <xsl:choose>
    <xsl:when test="$status=1">
     <br/>
     <xsl:variable name="CollapsingStatusHref" select="concat(substring-before($CollapsingStatusLink, '$$COLLAPSE_PARAM$$'), 'duplicates:&quot;', $urlEncoded, '&quot;', substring-after($CollapsingStatusLink, '$$COLLAPSE_PARAM$$'))"/>
     <span class="srch-dup">
      [<a href="{$CollapsingStatusHref}" id="$id" title="{$CollapseDuplicatesText}">
       <xsl:value-of select="$CollapseDuplicatesText"/>
      </a>]
     </span>
    </xsl:when>
   </xsl:choose>
  </xsl:if>
 </xsl:template>
 <!-- The "view more results" for fixed query -->
 <xsl:template name="DisplayMoreResultsAnchor">
  <xsl:if test="$MoreResultsLink">
   <a href="{$MoreResultsLink}" id="CSR_MRL">
    <xsl:value-of select="$MoreResultsText"/>
   </a>
  </xsl:if>
 </xsl:template>

 <xsl:template match="All_Results/DiscoveredDefinitions">
  <xsl:variable name="FoundIn" select="DDFoundIn" />
  <xsl:variable name="DDSearchTerm" select="DDSearchTerm" />
  <xsl:if test="$DisplayDiscoveredDefinition = 'True' and string-length($DDSearchTerm) &gt; 0">
   <script language="javascript">
    function ToggleDefinitionSelection()
    {
    var selection = document.getElementById("definitionSelection");
    if (selection.style.display == "none")
    {
    selection.style.display = "inline";
    }
    else
    {
    selection.style.display = "none";
    }
    }
   </script>
   <div>
    <a href="#" onclick="ToggleDefinitionSelection(); return false;">
     <xsl:value-of select="$DefinitionIntro" />
     <b>
      <xsl:value-of select="$DDSearchTerm"/>
     </b>
    </a>
    <div id="definitionSelection" class="srch-Description" style="display:none;">
     <xsl:for-each select="DDefinitions/DDefinition">
      <br/>
      <xsl:variable name="DDUrl" select="DDUrl" />
      <xsl:value-of select="DDStart"/>
      <b>
       <xsl:value-of select="DDBold"/>
      </b>
      <xsl:value-of select="DDEnd"/>
      <br/>
      <xsl:value-of select="$FoundIn"/>
      <a href="{$DDUrl}">
       <xsl:value-of select="DDTitle"/>
      </a>
     </xsl:for-each>
    </div>
   </div>
  </xsl:if>
 </xsl:template>

 <!-- XSL transformation starts here -->
 <xsl:template match="/">
  <xsl:if test="$AlertMeLink">
   <input type="hidden" name="P_Query" />
   <input type="hidden" name="P_LastNotificationTime" />
  </xsl:if>
  <xsl:choose>
   <xsl:when test="$IsNoKeyword = 'True'" >
    <xsl:call-template name="dvt_1.noKeyword" />
   </xsl:when>
   <xsl:when test="$ShowMessage = 'True'">
    <xsl:call-template name="dvt_1.empty" />
   </xsl:when>
   <xsl:otherwise>
    <xsl:call-template name="dvt_1.body"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>

 <!-- End of Stylesheet -->
</xsl:stylesheet>

Заключение

Данное исследование позволит вам изменить атрибуты при поиске документов, и изменить вывод результатов поиска для соответствия потребностям ваших заказчиков. Данная статьтья служит продолжением исследования возможностей изменения внешнего вида MOSS (кастомизации). Комплексное применение материалов приведенных в этих статьях позволяет настроить внешний вид портала и изменить поведение приложения для соответствия нуждам заказчика.


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.

понедельник, 23 июня 2008 г.

jQuery links

Наиболее часто используемые расширения для jQuery. Очень качественная подборка и главное наиболее необходимая для работы с данным фремеворком.

вторник, 17 июня 2008 г.

Exchange new user greetin message

Отправка сообщений новым пользователям Exchange. Использование:
  • сохранить в файл greeting.vbs
  • настроить парамеметры почтового сервера
  • Отредактировать тело сообщения
  • Отредактировать заголовок
  • Отредактировать отправителя и копии
  • запланировать выполнение в планировщике с нужной периодичностью
Это источник http://www.exchangecookbook.com/archives/2005/10/sending_a_welco.html
'Created by Mike Ruman 8/13/05
'Sends an email to accounts created today.

Dim StrDate, CurrentUTC
 
'Create the current date and time stamp for query for day before last
CurrentUTC = DatePart("yyyy", Date) 
'now add Month in mm if only M add leading 0 
if DatePart("m" , Now) < 10 then 
   CurrentUTC = CurrentUTC & 0 & DatePart("m" , Now) 
  else 
   CurrentUTC = CurrentUTC & DatePart("m" , Now) 
end if 
'now add Day in dd if only d add leading 0 
if DatePart("d" , Now) < 10 then 
'OPTIONAL - FOR MANY DAYS, replace line below with CurrentUTC = CurrentUTC & 0 & DatePart("d" , Now - X)  where X = # of days

   CurrentUTC = CurrentUTC & 0 & DatePart("d" , Now) 
  else 
'OPTIONAL - FOR MANY DAYS, replace line below with CurrentUTC = CurrentUTC & DatePart("d" , Now - X)  where X = # of days
   CurrentUTC = CurrentUTC & DatePart("d" , Now) 
end if 
' Tag hour, minute, second on 
strDate = CurrentUTC&"000001.0Z"
 
'Create AD Connection
Set oConnection1 = CreateObject("ADODB.Connection")
Set oCommand1 = CreateObject("ADODB.Command")
oConnection1.Provider = "ADsDSOObject"  ' This is the ADSI OLE-DB provider name
oConnection1.Open "Active Directory Provider"
' Create a command object for this connection.
Set oCommand1.ActiveConnection = oConnection1
'Set Query definition
' тут задаем параметры доступа к AD
oCommand1.CommandText = "select mail from 'LDAP://DC=Fabrikam, DC=com' WHERE objectCategory='Person' AND objectClass='user'AND msExchHideFromAddressLists<>'True' AND whenCreated>='" & strDate & "'"

oCommand1.Properties("Page Size") = 30000
' Execute the query.
Set rs = oCommand1.Execute
 

rs.movefirst
'Create the loop of results
Do Until rs.EOF = True
 
'Create Email
' настройки письма для пользователя
Set objEmail = CreateObject("CDO.Message")
' кодировка письма
objEmail.BodyPart.Charset="windows-1251"; 
' Адрес отправителя
objEmail.From = "Admin@fabrikam.com"
' Адрес получателя
objEmail.To = rs.Fields("mail")
'Optional BCC field Кому слать копию письма, можно закомментировать
'objEmail.BCC = "Admin@fabrikam.com"
' Тема сообщения
objEmail.Subject = "A welcome message from Exchange"
' Тело сообщения
objEmail.HTMLbody = "Welcome to Fabrikam. Please click on the attached file for a message."
 
'Optional Add an attachment. Добавление прикрепленного файла, можно закомментировать 
objEmail.AddAttachment "C:\new_hire_audio_message.wav"
 

objEmail.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/sendusing  ") = 2

' Имя или IP почтового сервера
objEmail.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/smtpserver  ") = _
        "ExchangeServer" 'Replace ExchangeServer with server IP or name
objEmail.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/smtpserverport  ") = 25
objEmail.Configuration.Fields.Update
 
'Optional - Read the message before it's sent
'MsgBox objEmail.GetStream.ReadText
objEmail.Send
rs.movenext
Loop
 
'Close AD Connection
oConnection1.close


понедельник, 16 июня 2008 г.

Google Group

Сегодня создал группу в Google Group посвященную разработке в среде MOSS 2007. Цели этой группы собрать людей которые занимаются разработкой для MOSS в сообщество и предложить место для обмена опытом. Сообщество разработчиков MOSS 2007. Примеры кода, методика разработки. Обзор технологий и переводы статей.

среда, 11 июня 2008 г.

MOSS Search Customizing

Ссылка по изменению результатов http://www.sharepointblogs.com/zimmer/archive/2007/10/28/moss-2007-customize-the-search-result-using-xslt-part-3-customize-using-sharepoint-designer-2007.aspx

понедельник, 9 июня 2008 г.

SPGridView and SPMenuField: Displaying custom data through SharePoint lists

Очень интересная статья про использование контролов для отображения данных в виде сетки http://blogs.msdn.com/powlo/archive/2007/02/25/displaying-custom-data-through-sharepoint-lists-using-spgridview-and-spmenufield.aspx. Нашел роя материалы по поиску. http://blogs.msdn.com/arbindo/archive/2008/04/04/test.aspx

среда, 4 июня 2008 г.

Война броузеров

Еще одно предвзятое отношение встретил на сайте http://noie.ru/blog/ собственно намекают на то что Internet Explorer плохой броузер. Однако не замечают что основная "смотрелка" это уже версия 7, а не 6 - как полагает автор блога. Да и 8 - я версия не за горами. Кстати вот картинка пресловутого гомера :), именно картинка снятая с моего броузера.

вторник, 3 июня 2008 г.

New Sites

Итак поделюсь новостью, зарегистрировал два новых сайта. Первый Сообщество разработчиков Microsoft Office SharePoint Server второй Взятки и все про них, а также откаты, менеджерское вознаграждение. В данный момент это только домены с пустыми страницами, однако в течении 3 месяцев я планирую вывести их по посещаемости на рубеж 1000 и 5000 соответственно. О своих успехах в этом начинании буду делиться с вами.