lunes, 13 de julio de 2009

PÁGINA DE SALTO al DispForm del nuevo elemento sin saber el ID

Escenario:

Cuando creamos un nuevo elemento (NewForm.aspx) en las listas por defecto sharepoint nos redirecciona al Source, es decir la pagina que nos envió al NewForm.aspx, pero no podemos ir a la pagina de Display o Edit del elemento que acabamos de Rellenar.


Objetivo:

Insertar un nuevo elemento y saltar a la pagina de edicion del mismo.

Estrategia:

Tras insertar el nuevo elemento, este recibe un ID asignado por sharepoint, ID que desconocemos y no podemos calcular (Sobre todo para entornos con muchos usuarios).
Como siempre lo más sencillo es lo mejor, vamos a crear una pagina de salto que obtenga el ultimo elemento que acabamos de insertar.


Ingredientes:

Una pagina ASPX que creemos nueva y la llamamos RedirectToNew.aspx , junto a la newForm.aspx de la lista sharepoint.


Un dataview web part conectado con un datasource a la lista en cuestion.

Un parámetro que recoge el Logon_USER de las Server variables

Un trocito de javascript


Receta:

Para hacer esto nos basta con ordenar descendentemente por Id y limitar la lista a un elemento, sin olvidar filtrar por usuario no sea que nos salte a otro elemento que acabe de crear un compañero.


Vamos a construir un javascript con parámetros que se ejecute al cargar la pagina y nos redireccione al Editform.asxp o al DispForm.aspx del nuevo elemento que acaba de crear.

Truco:

Yo suelo dejar la pagina en blanco al completo, o pongo una animación de cargando y ni se nota.

Más trucos:

A la gente le gusta hacer workflows pero yo si puedo los evito, sobre todo si son muy simples.

Podemos usar esta página de salto para hacer recálculos, ajustar totales de otra lista que necesite refrescarse, o redireccionar a otro lugar que necesitemos cuando se cumpla una condición


Para filtrar por usuario usamos un parameter, hay otras formas de hacer esto pero yo prefiero convertir todo a mayúsculas (con el translate) para evitar problemas.


<xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable>

<xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>

<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[translate(@Propietario,$lcletters,$ucletters) = translate($UID,$lcletters,$ucletters)]"/>


Para redireccionar a la página de Display arrastramos el Elemento "ID" (saldrá un xsl:value-Of) del dataSoruce y lo reemplazamos por este javascript :
<script language="javascript" type="text/javascript">

document.location.href=&apos;DispForm.aspx?ID=&apos;+ <xsl:value-of select="@ID" />;

</script>


Si quieres redireccionar al Edit puedes hacerlo reemplazando DispForm.aspx por EditForm.aspx


Por ultimo solo hay que tocar el boton del NewForm.aspx poniendo en lugar de "redirect to source", que redireccione a la pagina de salto de esta forma.


<input type="button" value="Aceptar" name="btnSave" onclick="{ddwrt:GenFireServerEvent('__commit;__redirect={RedirectToNew.aspx}')}" />

Espero que resulte de utilidad.
RobertoMarcos.com

1 comentario:

  1. Buenas,
    ¿que tal? Me parece muy interesante tu articulo, y se asemeja bastante a la necesidad que tengo ahora mismo...Necesito que al ver la pantalla Aprobar/Rechazar tarea de un WF (la propia de MOSS), y en la que te aparece un vinculo al DispForm del ID del item de la tarea. En vez de ir al Dispform, se redireccione a otra pagina, cogiendo un valor tipo URL, que aparece en el item...No se si me he explicado bien...

    No he logrado conseguirlo...

    Gracias ;)

    ResponderEliminar