Используйте Web Money - это очень удобно

вторник, 25 марта 2008 г.

LinkTitle - используем скрипты Sharepoint

Собственно это попытка повторить функционал этого меню документа в списке.
Зачем:
В библиотеке есть документ 1 в той же библиотеке есть связанный с ним документ 2.
В карточке документа 1 отобразить LinkTitle документа 2.
Непосредственно разметка:

<TD Class="ms-vb-title" height="100%">
<table height="100%" cellspacing="0"
class="ms-unselectedtitle"
onmouseover="ggg();OnItem(this)"
CTXName="ctx1"
Id="4"
Url="/sites/test/DocLib2/Поиск.aspx"
DRef="sites/test/DocLib2"
Perm="0x400001f07fff1bff"
Type="SharePoint.WebPartPage.Document"
Ext="aspx"
Icon="icsmrtpg.gif|Microsoft Office SharePoint Designer|SharePoint.OpenDocuments"
OType="0"
COUId=""
SRed="1"
COut="0"
HCD=""
CSrc=""
MS="0"
CType="Документ"
CId="0x0101004C213AE6D661A548A1237AF7852AFA98"
UIS="512"
SUrl="">
<tr>
<td width="100%" Class="ms-vb">
<A onfocus="OnLink(this)"
HREF="/sites/test/DocLib2/Поиск.aspx"
onclick="return DispEx(this,event,'TRUE','FALSE','FALSE','','0','SharePoint.OpenDocuments',
'SharePoint.WebPartPage.Document','1','',
'1073741823','0','0','0x400001f07fff1bff')">
Поиск<img src="/_layouts/images/blank.gif" class="ms-hidden" border="0" width="1" height="1" alt="Для открытия меню воспользуйтесь сочетанием клавиш SHIFT+ВВОД (в новом окне).">
</A>
</td>
<td>
<img src="/_layouts/images/blank.gif" width="13" style="visibility:hidden" alt="">
</td>
</tr>
</table>
</TD>
<td>

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

<script>
var ctx1 = new ContextInfo();
function ggg()
{

ctx1.ContentTypesEnabled=false;
ctx1.ctxId=1;
ctx1.CurrentUserId=1073741823;
ctx1.displayFormUrl="/sites/test/DocLib2/Forms/DispForm.aspx";
ctx1.editFormUrl="/sites/test/DocLib2/Forms/EditForm.aspx";
ctx1.EnableMinorVersions=false;
ctx1.HttpPath="/sites/test/_vti_bin/owssvr.dll?CS=65001";
ctx1.HttpRoot="http://server/sites/test";
ctx1.imagesPath="/_layouts/images/";
ctx1.isForceCheckout=false;
ctx1.isModerated=false;
ctx1.isPortalTemplate=null;
ctx1.isVersions=0;
ctx1.isWebEditorPreview=0;
ctx1.listBaseType=1;
ctx1.listName="{AC2D4CC5-7971-4627-8E58-F6A40E80AA70}";
ctx1.listTemplate=101;
ctx1.ListTitle="Библиотека документов";
ctx1.listUrlDir="/sites/test/DocLib2";
ctx1.ModerationStatus=0;
ctx1.newFormUrl=null;
ctx1.OfficialFileName="";
ctx1.PortalUrl=null;
ctx1.recursiveView=false;
ctx1.RecycleBinEnabled -=1;
ctx1.rootFolderForDisplay=null;
ctx1.SendToLocationName="Lib";
ctx1.SendToLocationUrl="http://server/sites/test/DocLib/";
ctx1.serverUrl=null;
ctx1.SiteTitle="test2";
ctx1.verEnabled=1;
ctx1.view="{B810C9B4-434E-4EA3-BADB-C466199D3F74}";
ctx1.WorkflowsAssociated=true;
ctx1.WriteSecurity="1";
}
</script>

У меня возник ряд сложностей с разбором кода: не совсем понимаю откуда берутся некоторые параметры и что это за параметры:

onmouseover="OnItem(this)" - это вызов js функции она строит меню.
CTXName="ctx1" - ContextInfo данные об объекте.
Id="4" - это ИД элемента в списке
Url="/sites/test/DocLib2/Поиск.aspx" - БК
DRef="sites/test/DocLib2" БК
Perm="0x400001f07fff1bff" - ? я так понимаю необходимый уровень разрешений - где его брать пока не знаю
Type="SharePoint.WebPartPage.Document" -БК
Ext="aspx" - БК
Icon="icsmrtpg.gif|Microsoft Office SharePoint Designer|SharePoint.OpenDocuments" - БК
OType="0" - ?
COUId="" -?
SRed="1" -?
COut="0" -?
HCD="" -?
CSrc="" -?
MS="0" -?
CType="Документ" - БК
CId="0x0101004C213AE6D661A548A1237AF7852AFA98" - ИД типа содержимого
UIS="512" - ?
SUrl="" -?

Отдельный вопрос как раздобыть ИД текущего пользователя.
ctx1.CurrentUserId=1073741823;
Собственно решение:
Создаем свой тип поля (наследуя MultiColumn) в котором сохраняем все необходимые переменные.
Далее повторяем HTML разметку меню в схеме отображения нашего поля.
Создаем контрол/вебчасть которая записывает ИД текущего пользователя в скрытое поле с известным идом.
Добавляем скрипт на мастер-страницу (либо на нашу страницу) который задает значение ctx1.CurrentUserId из скрытого поля.

Если кто-то может что-то дополнить буду благодарен.

четверг, 20 марта 2008 г.

Веб часть основные результаты поиска - использование фиксированных запросов.

В url страницы где размещается веб часть основных результатов можно добавить параметры по следующему принципу:
?k=contentType%3A%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82
k - строка запроса
(%3A - ":") (%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82 - Элемент)
&u=http%3A%2F%2Fserver%3Aport
u - ограничение по url (узел)
%3A%2F%2 - :\\ %3A - :
Удобно использовать в случае необходимости показать пользователю результаты поиска без заполнения пользователем формы запроса
Т.е. тогда когда запрос известен заранее или известна формула а пареметр берется в зависимости от (пользователя, группы, узла, страницы, элемента и т.п.) Можно реализовать как скрипт или через redirect(url).
Учитывая большие возможности форматирования таким образом можно отображать сводную информацию с различных узлов в любом удобном формате.
Статья на сайте микрософт

понедельник, 3 марта 2008 г.

Мой фильтр для списка.

Ранее я написал как можно подступисться к внешнему виду listViewИзменение перечня столбцов в ListViewWebPart "на лету".
Хочу более подробно остановиться на использовании фильтра.
Стандартные фильтры неудобны тем, что работают только по равно и только по одному значению. Т.Е. их нужно набирать из веб частей долго настраивать и т.п.
Для тех кто умеет создавать веб части предлагаю пойти другим путем:
Создать свою веб часть фильтрации - поиска в списке.
Итак входящие параметры:
Название списка.
Перечень полей для фильтрации.
Сразу хочу сказать чтов качестве пробы сил реализовал фильтрацию только для строки и даты, но думаю и для других типов это не сложно.
Для каждого текстового поля создаем динамические элементы: Надписи - label, условие - DropDownList - содержит\равно\не равно\начинается с (в соотвествии с возможностями CALM) тексбокс со значением фильтра и DropDownList соединение (и\или)если полей несколько. Можно реализовать любой метод постбека я разместил кнопку.
Для даты создаем надписи и DateTimeControl в моем случае это с значение по значение - поиск в диапазоне.
Далее ищем нашу веб часть по параметру имя списка:

SPList list = SPContext.Current.Web.Lists[_listName];
String guid = "{" + list.ID.ToString().ToUpper() + "}";
ListViewWebPart lv = (ListViewWebPart)wp;
if (lv.ListName == guid)// guid списка (c {})

Читаем xml схему:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.InnerXml = lv.ListViewXml;
XmlNode node;
node = xmlDoc.DocumentElement;

Итак запрос(фильтр) лежит в теге Query.
node["Query"].InnerXml - сюда запишем нашу строку запроса.
Сам запрос легко собирается из значений формы запроса типов полей списка. Самый простой способ - две строки на этапе формирования запроса для простоты в первую часть
тег соединения() + тег запроса
во вторую тег закрытия соединения(/And)).

В конце соединяем строки и записываем xml в веб часть.

Кастомизация поиска. - Дополнение.

В дополнение хочу сказать что в схеме параметров можно ограничить результаты поиска query выражениями типа:
Contains('Имя свойства','Значение') OR Title!='' AND ContentType!='Папка'
1 - очень удобно использовать для свойства "Path" - получам результат как с областями.
указывая урл билиотеки или списка мы ограничиваем поиск этой библиотекой списком.
2 - понятно
3 - тип содержимого - как мне кажется довольно удобно ограничивать поиск среди своего портала по своим типам содержимого - очень удобно!
Удачи!
P.S.
1. Когда будете настраивать схему результатов не забудте указать параметры в перечне столбцов основных результатов поиска.
2. Имена столбцов пишутся маленькими буквами поэтому в XLS схеме загалвные нужно перевести в маленькие.