Замена стандартного поведения тулбара у библиотеки документов sharepoint
Шарепоинт использует файл schema.xml для того чтобы сказать как
отображать лист (а библиотека тоже является листом) на страницах и формах сайта.
Режим отображения данных (но не ввода) в библиотеке или листе описывается с
помощью тега <view>. Один из этих view (обычно с ид =1) описывается с атрибутом “defaultview=true” , ниже дана
выдержка из описания нашей библиотеки.
<View BaseViewID="1"
Type="HTML" WebPartZoneID="Main"
DisplayName="$Resources:core,All_Documents;"
DefaultView="TRUE" MobileView="True"
MobileDefaultView="True" SetupPath="pages\viewpage.aspx"
ImageUrl="/_layouts/images/dlicon.png"
Url="Forms/AllItems.aspx">
Здесь можно заменить ="$Resources:core,All_Documents;"
на какую-нибудь абракадабру и увидеть, что справа на тулбаре после слова view название изменится. Кстати
"$Resources:core,All_Documents берет из en-us файла ресурсов,
находящегося по адресу Program Files\Common Files\Microsoft Shared\web server extensions\12\Resources и имеющего имя core.en-US.resx название индексированное словом All_Documents.
Моя задача заключается в переделке тулбара и затем в
переделке форм для ввода данных. В этом виде есть элемент <Toolbar
Type="”standart> я его изменил на <Toolbar
Type="FreeForm"> и так далее.
Действительно после замены этого элемента тулбар изменился.
Продолжение следует ...
Вставил описание тулбара из другого места этого файла:
<Toolbar Type="FreeForm">
<IfHasRights>
<RightsChoices>
<RightsGroup
PermAddListItems="required" />
</RightsChoices>
<Then><HTML><![CDATA[ <table width=100% cellpadding=0
cellspacing=0 border=0 > <tr> <td colspan="2"
class="ms-partline"><IMG
SRC="/_layouts/images/blank.gif" width=1 height=1 alt=""></td>
</tr> <tr> <td class="ms-addnew"
style="padding-bottom: 3px"> <img
src="/_layouts/images/rect.gif" alt=""> <a
class="ms-addnew" ID="idAddNewDoc"
href="]]></HTML>
<HttpVDir
/><HTML><![CDATA[/_layouts/Upload.aspx?List=]]></HTML>
<ListProperty Select="Name"
/><HTML><![CDATA[&RootFolder=]]></HTML>
<GetVar Name="RootFolder"
URLEncode="TRUE" /><HTML><![CDATA["
ONCLICK="javascript:NewItem(']]></HTML>
<HttpVDir
/><HTML><![CDATA[/_layouts/Upload.aspx?List=]]></HTML>
<ListProperty Select="Name"
/><HTML><![CDATA[&RootFolder=]]></HTML>
<GetVar Name="RootFolder"
URLEncode="TRUE" /><HTML><![CDATA[',
true);javascript:return false;"
target="_self">]]></HTML>
<HTML>$Resources:core,Add_New_Document;</HTML>
<HTML><![CDATA[</a>
</td> </tr> <tr><td><IMG
SRC="/_layouts/images/blank.gif" width=1 height=5
alt=""></td></tr> </table>]]></HTML>
</Then>
</IfHasRights>
</Toolbar>
На месте тулбара появилась ссылка “Add new document”:
Мы видим достаточно забавный язык:
<IfHasRights>
<RightsChoices>
<RightsGroup
PermAddListItems="required" />
</RightsChoices>
<Then> - здесь
проверяется что юзер имеет право добавлять новый элемент в лист.
Далее формируется гиперссылка, указывающая на страницу upload.aspx в текущем каталоге (HttpVDir) и
в нее вставляется GUID листа (ListProperty
Select="Name") и текущий фолдер листа (<GetVar Name="RootFolder"):
<Then><HTML><![CDATA[
<table width=100% cellpadding=0 cellspacing=0 border=0 > <tr>
<td colspan="2" class="ms-partline"><IMG SRC="/_layouts/images/blank.gif"
width=1 height=1 alt=""></td> </tr> <tr> <td
class="ms-addnew" style="padding-bottom: 3px"> <img
src="/_layouts/images/rect.gif" alt=""> <a
class="ms-addnew" ID="idAddNewDoc"
href="]]></HTML>
<HttpVDir
/><HTML><![CDATA[/_layouts/Upload.aspx?List=]]></HTML>
<ListProperty Select="Name"
/><HTML><![CDATA[&RootFolder=]]></HTML>
<GetVar Name="RootFolder"
URLEncode="TRUE" /><HTML><![
Продолжение следует...
Формирование тулбара с типом “standart”,
по-видимому, происходит по другому пути. При ее формировании листвьювебпарт
обращается к юзер контролям, находящимся в директории Program Files\Common
Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES. Там
есть файл DefaultTemplates.ascx в котором расположены темплаты для листов, тулбаров.
Впечатление такое, что <SharePoint:RenderingTemplate ID="DocumentLibraryViewToolBar" runat="server">
как раз отвечает за то какие кнопки (new,action,setting) будут у стандартного
темплата. Конкретное содержимое в этих раскрывающихся пунктах, видимо, берется
из имеющихся в листе контент тайпов. Можно провести интересный эксперимент:
скопировать файл nonewbuttonfordoclibtemplates.ascx (взятый из блога http://blogs.msdn.com/dipper/archive/2006/10/05/How-to-Remove-or-hiding-items-in-List-toolbar-in-Sharepoint-Server-2007.aspx) в директорию Files\Common Files\Microsoft Shared\web server
extensions\12\TEMPLATE\CONTROLTEMPLATES и перезапустить
(iisreset). В этом случае кнопка new у листов и библиотек будет отсутсвовать. Объясняется это
просто: как только в директории CONTROLTEMPLATES
появился пользовательский контроль с имеющимся ID="DocumentLibraryViewToolBar", который
перезаписывает стандартный (может быть только один такой кроме стандартного),
то используется этот файл, а там кнопка убрана.
Вообще кастомизацию форм листов как раз предалагают делать
по варианту изменения сначала юзер контроля, а потом самого веб контроля
отображающего этот темплат (см. How SharePoint Forms Work в share point service sdk, а там How To:
Create a Custom Control for a Form).
Теперь выводы:
Чтобы не вызывать ворд при добавлении нового документа, надо
удалить этот пункт из меню new –
это можно сделать либо написав, весь код тулбара самому в schema.xml, либо дав свойству hidden контент тайпа значение true (в
текущей версии этого свойства нет, хотя оно обозначено в sdk).
Далее с помощью feature добавить
в new пункт меню (все-таки
думаю что свойсвто hidden появится)
указывающее на кастом форму, которая будет служить для ввода нового документа.