miércoles, 29 de octubre de 2008

Abrir los datos adjuntos de una lista en una nueva ventana y cambiar el literal "Datos adjuntos"

Las cosas pequeñas son las que al final mas trabajo nos dan. Esto me llevo un día entero y al final lo tuvo que resolver el de siempre, Miguel Ángel.

Si tenemos una lista en sharepoint, y a un elemento le hemos agregado datos adjuntos, cuando vemos las propiedades del elemento y pinchamos en el enlace del adjunto, si el dato adjunto se puede abrir directamente en el explorador de internet (*.jpg, *.pdf, etc), el enlace se nos abre en la ventana actual.

Para modificar esto, basta con agregar un pequeño javascript en la página DispForm.aspx de la lista que deseamos modificar. Abrimos la pagina con Sharepoint Designer y agregamos este código:

Si ademas queremos modificar la etiqueta por defecto "Datos adjuntos", debemos agregar en este mismo script la siguiente línea:

document.getElementById("idAttachmentsRow").childNodes[0].innerHTML="Descárgate los adjuntos";

Ambos script debe incluirse aquí:


Saludos y de nuevo muchas gracias por su ayuda a Miguel Ángel.

martes, 21 de octubre de 2008

Editar formulario de InfoPath en pagina customizada

En el post anterior hemos conseguido incrustar nuestro InfoPath dentro de una página customizada de SharePoint el siguiente problema es que al intentar editar dicho formulario tenemos que ir a la vista de la librería de documentos, hacer clic en el vínculo del InfoPath y el formulario se abre en la página de _layouts/FormServer.aspx por lo cual la masterpage se pierde mostrándonos una página en blanco con el formulario en medio. Esto hace perder la navegación e incluso hacer pensar que te has salido de tu sitio.

La vista normal seria asi, el usuario hace clic en el elemento:


Al hacer clic se veria esto (página en blanco):


La solución que encontré, de nuevo no es la más óptima pero funciona, es modificar la página DispForm.aspx de dicha librería. Esto hara que al hacer clic en "Ver propiedades" de los elementos abra el Infopath.

Al crear la librería de documentos que contiene el InfoPath automáticamente te crea 2 páginas para mostrar las propiedades de los elementos (DispForm.aspx y EditForm.aspx), lo que vamos a hacer es incrustar un iframe dentro de DispForm.aspx para que se muestre el formulario seleccionado por medio de la ayuda de una función de javascript.

Inicialmente la página DispForm.aspx muestra los campos que pueden ser editados desde SharePoint del campo seleccionado, por Url se envía el ID del elemento, sin embargo el ID no nos sirve de mucho ya que nosotros requerimos la url del InfoPath almacenado.





Como se ve en la imagen nosotros tenemos dentro de una tabla el nombre del formulario InfoPath, y eso es justo lo que necesitamos. Para ello usaremos javascript para obtener ese nombre y junto con la ruta de la librería formar la url del formulario que deseamos mostrar.

Abriremos nuestro SharePoint Designer en el sitio donde esta nuestra librería, nos vamos a la carpeta que genera, en este caso se llama Notificaciones.



Crear una copia de la página DispForm.aspx para tener un backup en caso de algún error y desprotegerla para comenzar a editar. Abrirla y agregar este código en la parte de arriba justo debajo del primer <table> que se crea:

<tr><td><iframe marginwidth="0" marginheight="0" id="marco" src="" frameborder="0" width="99%" scrolling="no" height="600"></iframe></td></tr>



Lo que estamos haciendo es crear un iframe que será contenedor del formulario de InfoPath. Debajo de nuestro código estarán los valores que se muestran en la página, si nosotros no queremos que nuestros usuarios vean esa tabla hay que agregar un div para hacerlos invisibles quedando de esta forma:

<div style="display:none">
<WebPartPages:WebPartZone
…..
</WebPartPages:WebPartZone>
<div>


Asi conseguimos que el webpart que muestra la tabla con los campos editables por SharePoint sea invisible para el usuario.

Lo que nos quedaría sería obtener el nombre del formulario, formar la url completa y hacer que el iframe lo abra, para eso debemos poner este código de javascript justo antes del tag </table> que cierra la tabla de html.


<tr><td> <script>
infopath = document.getElementById("formTbl").rows[0].cells["SPFieldFile"].innerHTML;
infopath = infopath.substring(infopath.indexOf("href=")+6,infopath.indexOf(".xml")+4);
if (document.getElementById("formTbl").rows.length > 0)
{
nextUrl = "
http://servidor/_layouts/FormServer.aspx?XmlLocation="
+infopath+
"&Source=
http://servidor/Libreria/Forms/AllItems.aspx&DefaultItemOpen=1";
document.getElementById("marco").src = nextUrl;
}
</script></td></tr>


Este script busca el id SPFieldFile que contiene el nombre de nuestro InfoPath y después generemos la URL para pasársela al Iframe llamado “marco” a su propiedad src. No olvides cambiar el servidor por el nombre de tu servidor.


Guardamos y el resultado es:



El formulario se muestra dentro de la pagina DispForm.aspx la cual tiene la apariencia de nuestro sitio y al cerrar el formulario se va a la pagina que hemos puesto en el código de javascript con el parámetro &Source.

Ahora solo nos faltaria crear una vista para que no sea necesario hacer clic en el menu del elemento, pero eso lo dejamos para otro post.

Saludos.

miércoles, 1 de octubre de 2008

Cerrar formulario de InfoPath con un redirect

Uno de los problemas mas fastidiosos de cuando tenemos un InfoPath dentro de una pagina web customizada en un sitio de SharePoint es cuando cerramos el formulario y nos muestra el tipico texto de:
Se ha cerrado el formulario.

Dando miles de vueltas al asunto encontre una opción, no la mas optima como siempre sucede en proyectos de sharepoint, pero al final una opción que hace que nos desaparezca ese mensaje y nos haga un redirect a la pagina que deseamos.

Primero bajar el InfoPath view webpart creado por Marwan Tarek en su blog, descargarlo de aqui: http://www.sharepointblogs.com/files/folders/marwantarek/entry13087.aspx

Una vez que se ha bajado hay que instalarlo en el servidor de SharePoint, la descarga tiene dos archivos:
- InfoPathFormViewer.wsp: Archivo de la solución web part.
- InfoPathFormViewer.bat: Archivo batch que deberá ser ejecutado en el servidor (editar el batch y reemplazar "http://londonmoss/" con el url de tu sitio)

Ya instalado deberas crear tu InfoPath con la opcion de web enable.

Crea una pagina customizada y dentro de una zona de web parts agrega el webpart de Marwan llamado InfoPathFormViewer. Modifica sus propiedades:

Html code: Codigo html que contiene el Iframe, ejemplo:
<div class="EForms">
<div class="EForms2">
<div class="EForms3">
<h5>form title</h5>
<div style="MARGIN-TOP: 10px; TEXT-ALIGN: center">
<iframe marginwidth="0" marginheight="0" src="%formurl%" frameborder="0" width="99%" scrolling="no" height="600">info path here</iframe>
</div>
</div>
</div>
</div>


Form URL: La url del formulario, ejemplo:
http://moss.dep/English/_layouts/FormServer.aspx?XsnLocation=http://moss.dep/English/Meeting%20Request%20English/Forms/template.xsn&amp;SaveLocation=http%3A%2F%2Fmoss%2Edep%2FEnglish%2FMeeting%20Request%20English&amp;DefaultItemOpen=1

Una vez hecho eso el fomulario Infopath sera visible desde la pagina customizada, ahora deberemos crear otra pagina html que contendrá un redirect.

Crear la nueva pagina llamada Redirect.html con este contenido dentro del head:

<script language="javascript" type="text/javascript">
window.open('/Paginas/Inicio.aspx', '_top');
</script>


Ahora solo deberemos agregar el parametro de Source dentro de la cadena de la url del form. Ir a la pagina customizada donde se encuentra el formulario de Infopath y editar sus propiedades, en la opcion de Form URL agregar este texto: &Source=/Paginas/Redirect.html

Por lo que nos quedaria de esta forma:

Form URL
http://moss.dep/English/_layouts/FormServer.aspx?XsnLocation=http://moss.dep/English/Meeting%20Request%20English/Forms/template.xsn&amp;SaveLocation=http%3A%2F%2Fmoss%2Edep%2FEnglish%2FMeeting%20Request%20English&amp;Source=/Paginas/Redirect.html&amp;DefaultItemOpen=1

Lo que hace es que al cerrar el formulario se va directamente a esa pagina, pero al estar dentro de un Iframe es necesario crear una pagina intermedia que haga un redirect al target top.

Y lo que da de resultado es que al cerrar o enviar el formulario nos manda a la pagina que hemos puesto dentro de la pagina de redirect.html.

Saludos