Partager via


Création de modèles de formulaires personnalisés

Dernière modification : mercredi 22 septembre 2010

S’applique à : SharePoint Foundation 2010

Les modèles de contrôle Microsoft ASP.NET qui sont définis dans le fichier DefaultTemplates.ascx situé dans %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES\ déterminent la mise en page des formulaires d’éléments de liste Microsoft SharePoint Foundation 2010. Ces modèles peuvent imbriquer des contrôles qui à leur tour utilisent davantage de modèles de contrôle pour la définition de la mise en page du formulaire. Les contrôles peuvent contenir des balises HTML et des contrôles Web, mais aucune instruction liée à des données impliquant la syntaxe <%#...%>. Pour remplacer globalement un modèle de contrôle par défaut sur un serveur Web frontal, vous pouvez ajouter un fichier .ascx personnalisé dans le répertoire \CONTROLTEMPLATES avec un identificateur (ID) de modèle de contrôle qui correspond à l’ID du modèle existant dans le fichier DefaultTemplates.ascx. Pour plus d’informations sur la création d’un contrôle dans Microsoft Visual Studio, voir Comment : créer un contrôle utilisateur pour un composant WebPart ou une page d'application SharePoint.

Création de modèles personnalisés

En plus de remplacer les modèles par défaut, vous pouvez créer vos propres modèles de formulaires personnalisés et y faire référence par type de liste ou type de contenu. Pour enregistrer un modèle de formulaire personnalisé par type de liste, spécifiez le nom du modèle de formulaire via l’attribut Template dans une balise <Form> dans le fichier Schema.xml de la définition de liste, comme dans l’exemple suivant :

<Forms>
  <Form Type="DisplayForm" Url="DispForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> 
  <Form Type="EditForm" Url="EditForm.aspx" SetupPath="pages\form.aspx" Template="MyCustomForm" WebPartZoneID="Main" /> 
  <Form Type="NewForm" Url="NewForm.aspx" SetupPath="pages\form.aspx" Template="MyCustomForm" WebPartZoneID="Main" /> 
</Forms>

L’exemple suivant définit deux formulaires personnalisés supplémentaires.

<Forms>
  <Form 
    Type="DisplayForm" 
    Url="DispForm.aspx" 
    SetupPath="pages\form.aspx" 
    WebPartZoneID="Main" Default="FALSE"/>
  <Form 
    Type="DisplayForm" 
    Url="MyDispForm.aspx" 
    SetupPath="pages\form.aspx" 
    WebPartZoneID="Main" 
    UseDefaultListFormWebPart="False" 
    Default="TRUE">
    <WebParts>
      <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="3"><![CDATA[
        <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
          <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly
          <TypeName>Microsoft.SharePoint.WebPartPages.ListFormWebPart</TypeName>
          <PageType>PAGE_DISPLAYFORM</PageType>
        </WebPart>]]>
      </AllUsersWebPart>
      <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="1"><![CDATA[
        <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
          <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
          <TypeName>Microsoft.SharePoint.WebPartPages.ListViewWebPart</TypeName>
          <PageType>PAGE_VIEW</PageType>
          <ViewFlags>Hidden ReadOnly Html</ViewFlags>
        </WebPart>]]>
      </AllUsersWebPart>
    </WebParts>
  </Form>
  <Form 
    Type="EditForm" 
    Url="EditForm.aspx" 
    SetupPath="pages\form.aspx" 
    WebPartZoneID="Main" />
  <Form
    Type="EditForm"
    Url="MyEditForm.aspx"
    SetupPath="pages\form.aspx"
    WebPartZoneID="Main"
    Default="TRUE"
    UseDefaultListFormWebPart="False"
    WebPartOrder="1">
    <WebParts>
      <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="1"><![CDATA[
         <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
           <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>                         
           <TypeName>Microsoft.SharePoint.WebPartPages.ListViewWebPart</TypeName>
           <PageType>PAGE_VIEW</PageType>
           <ViewFlags>Hidden ReadOnly Html</ViewFlags>
         </WebPart>]]>
       </AllUsersWebPart>
       <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="2"><![CDATA[
         <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2" xmlns:iwp="https://schemas.microsoft.com/WebPart/v2/Image">
           <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
           <TypeName>Microsoft.SharePoint.WebPartPages.ImageWebPart</TypeName>
           <FrameType>None</FrameType>
           <Title>Site Image</Title>
           <iwp:ImageLink>/_layouts/images/homepage.gif</iwp:ImageLink>
           <iwp:AlternativeText>Logo</iwp:AlternativeText>
         </WebPart>]]>
       </AllUsersWebPart>
       <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="3"><![CDATA[
         <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
           <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>            
           <TypeName>Microsoft.SharePoint.WebPartPages.ListFormWebPart</TypeName>
           <PageType>PAGE_EDITFORM</PageType>
         </WebPart>]]>
       </AllUsersWebPart>
       <View BaseViewID="1" WebPartZoneID="Main" WebPartOrder="4" />
     </WebParts>
   </Form>
   <Form 
     Type="NewForm" 
     Url="NewForm.aspx" 
     SetupPath="pages\form.aspx" 
     WebPartZoneID="Main" />
</Forms>

Pour enregistrer un modèle de formulaire personnalisé par type de contenu, ajoutez une définition telle que la suivante en tant qu’enfant de la balise <ContentType> dans votre fichier Elements.xml pour le Composant fonctionnel.

<XmlDocuments>
  <XmlDocument NamespaceURI="https://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
    <FormTemplates  xmlns="https://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
      <Display>MyCustomForm</Display>
      <Edit>MyCustomForm</Edit>
      <New>MyCustomForm</New>
    </FormTemplates>
  </XmlDocument>
</XmlDocuments>

Dans les exemples précédents, « MyCustomForm » correspond à l'ID d'un modèle de contrôle personnalisé que vous ajoutez dans le répertoire \CONTROLTEMPLATES.

Structure des modèles

Les modèles de contrôle ASCX fournissent plusieurs contrôles dans une structure imbriquée, où les contrôles proprement dits sont des modèles qui peuvent être utilisés pour étendre les formulaires de liste.

Le modèle de formulaire de bibliothèque de documents qui est défini dans %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES est un bon exemple d’une structure de modèle de contrôle. Le code exemple suivant montre le modèle de contrôle par défaut qui est défini pour le formulaire de bibliothèque de documents.

<SharePoint:RenderingTemplate ID="DocumentLibraryForm" runat="server">
  <Template>
    <SharePoint:InformationBar runat="server"/>
      <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator="&nbsp;" 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>

Dans cet exemple, le modèle de formulaire de bibliothèque de documents contient plusieurs composants pour la mise en page du modèle de formulaire complet. Parmi ces composants, plusieurs dérivent de la classe de base Microsoft.SharePoint.WebControls.FormComponent, qui elle-même dérive de Microsoft.SharePoint.WebControls.TemplateBasedControl. Cela signifie que les composants peuvent eux-mêmes être transformés en modèles.

Toutefois, la majeure partie du formulaire est en fait rendue par le biais d’un modèle distinct qui est défini dans le fichier DefaultTemplates.ascx dont l’ID est DocumentLibraryFormCore. Ce modèle est constitué de plusieurs autres composants et comprend notamment une structure HTML basée sur des tableaux qui permet d’organiser la mise en page, comme illustré dans l’exemple suivant.

<SharePoint:RenderingTemplate ID="DocumentLibraryFormCore" runat="server">
  <Template>
    <TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 id="formTbl" cellspacing=0 width=100%>
      <SharePoint:ChangeContentType runat="server"/>
      <SharePoint:DocumentLibraryFields runat="server"/>
      <SharePoint:ApprovalStatus runat="server"/>
    </TABLE>

    <SharePoint:WebPartPageMaintenanceMessage runat="server"/>
    <SharePoint:DocumentTransformersInfo runat="server"/>
    <table cellpadding=0 cellspacing=0 width=100%><tr><td class="ms-formline"><IMG SRC="/_layouts/images/blank.gif" width=1 height=1 alt=""></td></tr></table>
    <TABLE cellpadding=0 cellspacing=0 width=100% style="padding-top: 7px"><tr><td width=100%>
      <SharePoint:ItemHiddenVersion runat="server"/>
      <SharePoint:InitContentType runat="server"/>
      <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator="&nbsp;" runat="server">
        <Template_Buttons>
          <SharePoint:CreatedModifiedInfo runat="server"/>
        </Template_Buttons>
        <Template_RightButtons>
          <SharePoint:SaveButton runat="server"/>
          <SharePoint:GoBackButton runat="server"/>
        </Template_RightButtons>
      </wssuc:ToolBar>
    </td></tr></TABLE>
  </Template>
</SharePoint:RenderingTemplate>

Le composant clé dans le modèle DocumentLibraryFormCore de cet exemple est le composant DocumentLibraryFields, qui fait référence au contrôle Microsoft.SharePoint.WebControls.DocumentLibraryFields, lequel dérive de la classe Microsoft.SharePoint.WebControls.ListFieldIterator. L’itérateur du champ de liste contient la logique de mise en page des champs dans un ordre basé sur des colonnes. Toutefois, la classe ListFieldIterator rend uniquement les contrôles s’ils n’ont pas été remplacés dans les modèles. Par conséquent, si vous ajoutez un contrôle de champ pour un champ spécifique (par exemple, un contrôle qui place le contrôle de champ Title dans le coin supérieur droit et le contrôle de champ Author dessous), l’itérateur ne dispose pas ce contrôle. Vous pouvez également, au lieu de cela, choisir de spécifier votre itérateur de champ de liste, qui dérive de la classe ListFieldIterator et fournit la logique personnalisée nécessaire à l’itération des champs.

Vous pouvez remplacer le modèle DocumentLibraryForm et spécifier un autre modèle DocumentLibraryFormCore. Vous pouvez ensuite personnaliser davantage le modèle de formulaire à partir de là et spécifier des contrôles existants ou ajouter des références à d'autres contrôles personnalisés qui sont définis dans un assembly ou un fichier .ascx.

Important

La modification des fichiers Default.ascx par défaut que SharePoint Foundation installe sur les serveurs Web frontaux n’est pas prise en charge. Les modifications que vous apportez aux fichiers initialement installés avec le produit risquent d’être remplacées lorsque vous installez les mises à jour ou les Service Packs de SharePoint Foundation ou bien, lorsque vous mettez à niveau une installation vers la version ultérieure du produit.