miércoles, 18 de diciembre de 2013

Sharepoint 2007 y adjuntar elementos en formularios personalizados

Hoy me ha tocado personalizar algunos formularios de nuevo elemento (NewForm.aspx) de algunas listas en un MOSS (SharePoint 2007). Y al comprobar que todo estaba correcto he visto que el componente de adjuntar elementos no funcionaba correctamente.
Daba un error:
Este formulario se ha personalizado no funciona con archivos adjuntos
O:
No se han habilitado los archivos adjuntos en esta lista 

Buscando en San Google he encontrado una entrada del "MVP" Gustavo Velez:
http://support.microsoft.com/kb/953271/es

Como Microsoft suele eliminar sus entradas, replico el contenido que Gustavo nos comenta y que funciona a la perfección:

En el código XSL que hemos generado al insertar nuestro formulario personalizado, buscaremos:

<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>

Y lo reemplazamos por:

 <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>

Teniendo en cuenta que el ControlMode, si estamos personalizando un formulario de nuevo tendrá el valor New.

Lo siguiente a buscar es la línea:

<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">

Y justo antes de ella, insertamos:

<tr id="idAttachmentsRow">
<td nowrap="true" valign="top" class="ms-formlabel" width="20%">
<SharePoint:FieldLabel ControlMode="Edit" FieldName="Attachments" runat="server"/>
</td>
    <td valign="top" class="ms-formbody" 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>

Teniendo en cuenta otra vez, que si estamos en un formulario de nuevo elemento, ControlMode tendrá el valor de New y _designer:bind, tendrá como primer parámetro "i" (insert), en lugar de "u" (update) que se utilizaría para los formularios de edición.

Tras esto, guardamos nuestro formulario y magia... Ya se adjuntan los documentos.

Y para ver los documentos adjuntos en un formulario de vista de datos (DispForm.aspx) bastaría con añadir:

<SharePoint:AttachmentsField ControlMode="Display" FieldName="Attachments" runat="server" Visible="true"/>

Nota: Vuelvo a recordar que no he inventado la rueda. Esto es una copia del artículo de Gustavo Velez que a mi me ha resultado muy útil.