Radi Atanassov

SharePoint MCM, MVP, MCT and owner of OneBit Software

Формите на списъци в SharePoint 2007 - как работят те – Втора Част

Този пост е продължение на предишния, в който разглеждам как можем да заменим “NewFormUrl”, “EditFormUrl” и “DisplayFormUrl” притежанията на Content Type обекти, с цел да се заменят формите, с които SharePoint показва данни за определен list item. Тука ще опиша как SharePoint използва Rendering Templates по време на зареждането на тези форми, и как можем да ги заменим с произволни, така че да добавиме функционалност.

Ето как работят Rendering Templates:

Всеки list item в SharePoint списък е под формата на определен Content Type. В повечето случай това е или “Item”, или “Document” Content Type, в зависимост от списъка, в който този list item се намира. Като разработчици, ние създаваме нови Content Types, които имат смисъл за съответния бизнес: Invoice, Quote, Proposal и т.н.

Всеки Content Type има свой “New”, “Edit” и “Display” форми за събиране и показване на своите данни. Всяка една от тези форми е дефинирана чрез “Form Rendering Template”, който съдържа HTML markup, или ASCX контролки.

Тези Rendering Templates са дефинирани в ASCX файлове в _CONTROLTEMPLATES папката (...12\TEMPLATE\CONTROLTEMPLATES). На повечето обекти в SharePoint са им дефинирани Rendering Templates в DefaultTemplates.ascx, там ще намерите HTML на много обекти като Toolbar, ListFieldIterator и т.н. Ето как е дефиниран DocumentLibraryForm:

<SharePoint:RenderingTemplate ID="DocumentLibraryForm" runat="server">
    <Template>
        <SharePoint:InformationBar runat="server"/>
        <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" 
        RightButtonSeparator="" runat="server">
            <Template_RightButtons>
                <SharePoint:SaveButton runat="server"/>
                <SharePoint:GoBackButton runat="server"/>
            </Template_RightButtons>
        </wssuc:ToolBar>
        <SharePoint:FormToolBar runat="server"/>
        <SharePoint:FormComponent TemplateName="DocumentLibraryFormCore" 
        runat="server"/>
    </Template>
</SharePoint:RenderingTemplate>

Забележете, че този Rendering Template вика други “FormCompontent” обекти чрез “TemplateName” атрибута. Това е много сходно с PHP…

Нашата цел, е да заменим тези Rendering Templates, за да променим това, което крайните потребители виждат като работят с нашите Content Types.

Имаме 2 варианта:

Вариант 1: посочване на наши Rendering Templates в самата дефиниция на наш Content Type.

Дефиниции на Content Types ни дават тази възможност чрез XmlDocument елементи:

<!-- Document Content Type -->
<ContentType ID="0x0101006BD6DAD38F7947799A6F2EE72F5C3C24"
    Name="TemporaryContentType"
    Group="Custom Content Types"
    Description="">
    <FieldRefs>
        <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" />
    </FieldRefs>
    <XmlDocuments>
        <XmlDocument 
        NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
            <FormTemplates 
            xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
                <Display>MyCustomForm</Display>
                <Edit>MyCustomForm</Edit>
                <New>MyCustomForm</New>
            </FormTemplates>
        </XmlDocument>
    </XmlDocuments>
</ContentType>

 

С горният FormTemplates елемент (в XmlDocument) съм посочил на този Content Type да използва MyCustomForm за Display, New и Edit формите си.

За да създадем MyCustomForm като Rendering Template, трябва да си направим свой ASCX файл и да го сложим в CONTROLTEMPLATES папката. Това е хубаво да стане чрез Feature.

Ето примерен Rendering Template в свой ASCX файл. SharePoint ще разгледа и запомни всички RenderingTemplate обекти по време на зареждане на своя Application Pool, стига те да се намират в CONTROLTEMPLATES папката.

<SharePoint:RenderingTemplate ID="MyCustomForm" runat="server">
    <Template>
        Hello
    </Template>
</SharePoint:RenderingTemplate>

Можете да добавите HTML и свой ASCX контролки и напълно да промените това, което крайните потребители виждат и използват.

Ето какво всъщност става „зад сцената“:

В първата част описах как ListFormWebPart се добавя от платформата на ASPX страници, които по принцип SharePoint би използвал за да покаже свойте “New”, “Edit” и “Display” форми. Този Web Part върши цялата работа в намирането на точния Rendering Template за текущия Content Type, върху който крайният потребител иска да работи.

Ето малко код от Reflector… Това е TemplateName, притежанието на този ListFormWebPart, който проверява текущия Content Type и връща името на конфигурирания Rendering Template.

image

Това ни води до следващата опция:

Вариант 2: Да посочим името на Rendering Template чрез код.

Кода е много прост (: SPContentType обекта открива 3 притежания:

cType.NewFormTemplateName = “MyCustomForm”;
cType.EditFormTemplateName = “MyCustomForm”;;
cType.DisplayFormTemplateName = “MyCustomForm”;
cType.Update(true);

С това ще се постигне същото нещо като Опция 1, но няма нужда от декларативен CAML. Чрез cType.Update(true); изпращаме промените към дъщерни Content Types.

Успех.

Comments (2) -

  • Коцето

    3/29/2010 4:19:52 AM | Reply

    Похвално!
    Ще пуснеш ли и целия source-code?!

  • Ради Атанасов

    4/17/2010 8:07:57 AM | Reply

    Здрасти!

    Еми то това е принципа, няма повече код (:

    Самият Rendering Template е като ASPX, по принцип там слагам UserControl обекти.
    А ако просто заменяш URL-a като в първа част, тогава обикновенно сочи към Application Page.

    Поздрави!

Add comment

Loading