Eng | Rus
 
Обучение -> Статьи -> Замена тулбара у библиотеки документов
 
 
 
Simple Seo Solutions
SEO и Продвижение
сайтов
Speechpad.ru
Голосовой набор текстаГолосовой набор текста

Замена стандартного поведения тулбара у библиотеки документов 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="">&nbsp;<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="">&nbsp;<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 появится) указывающее на кастом форму, которая будет служить для ввода нового документа.

 

© prjsoft.ru