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.