Sharepoint: Niestandardowy formularz listy i załączniki

Autor: Mariusz N.

W artykule http://office.microsoft.com/pl-pl/sharepointdesigner/HA101191111045.aspx opisany jest sposób tworzenia niestandardowych formularzy dla list SharePoint. Wszystko ładnie, ale za pomocą takich formularzy nie można dodawać załączników. Jeśli w trakcie tworzenia formularza pozostawimy domyślnie zaznaczoną opcję Pokaż standardowy pasek narzędzi, to mimo istnienia przycisku Dołącz plik nie uda nam się pliku dołączyć :( Aby ten problem rozwiązać należy w pierwszej kolejności ściągnąć i zainstalować poprawkę http://support.microsoft.com/kb/953749/en-us. Jeśli macie środowisko MOSS to sugerowane jest dodatkowe zainstalowanie poprawki http://www.microsoft.com/downloads/details.aspx?FamilyId=3811C371-0E83-47C8-976B-0B7F26A3B3C4&displaylang=en. Service Pack 2 dla SharePoint zawiera już te poprawki, więc jeśli mamy go zainstalowanego to jesteśmy gotowi na modyfikacje formularza .aspx. Po wykonaniu aktualizacji trzeba zmodyfikować kod XSL w plikach ASPX będących niestandardowymi formularzami. W tym celu musimy dokonać dwóch zmian. 1) Odnaleźć w kodzie strony następujący fragment kodu: <xsl:template name="dvt_1"> <xsl:variable name="dvt_StyleName">ListForm</xsl:variable> <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/> <table border="0" width="100%"> <xsl:call-template name="dvt_1.body"> <xsl:with-param name="Rows" select="$Rows"/> </xsl:call-template> </table> </xsl:template> i ZAMIENIĆ go na następujący kod: <xsl:template name="dvt_1"> <xsl:variable name="dvt_StyleName">ListForm</xsl:variable> <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/> <div> <span id="part1"> <table border="0" width="100%"> <xsl:call-template name="dvt_1.body"> <xsl:with-param name="Rows" select="$Rows"/> </xsl:call-template> </table> </span> <SharePoint:AttachmentUpload runat="server" ControlMode="Edit"/> <SharePoint:ItemHiddenVersion runat="server" ControlMode="Edit"/> </div> </xsl:template> 2) Odnaleźć linię definiującą szablon <xsl:template name="dvt_1.rowedit"> a następnie odszukać ostatni tag <xsl:if ...> wewnątrz definicji szablonu. Przed tym ostatnim tagiem należy wstawić następujący kod: <tr id="idAttachmentsRow"> <td nowrap="true" valign="top" width="20%"> <SharePoint:FieldLabel ControlMode="Edit" FieldName="Attachments" runat="server"/> </td> <td valign="top" width="80%"> <SharePoint:FormField runat="server" id="AttachmentsField" ControlMode="Edit" FieldName="Attachments" __designer:bind=" {ddwrt:DataBind('u','AttachmentsField','Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Attachments')}"/> <script> var elm = document.getElementById("idAttachmentsTable"); if (elm == null || elm.rows.length == 0) document.getElementById("idAttachmentsRow").style.display='none'; </script> </td> </tr> UWAGA: Oba wstawione fragmenty kodu dotyczą formularza edycji. Jeśli chcemy wykorzystać ten kod w np. formularzu dodawania nowego elementu to należy zmienić wartość ControlMode="Edit" na ControlMode="New".