Etiquetado: Sharepoint

AJAX y WebParts

ASP.NET AJAX Extensions se publicó hace ya algún tiempo y aún no hay una versión oficial de sharepoint con soporte directo para éstas.
En ASP.NET siempre se ha podido leer contenido de manera asíncrona usando la cláusula Async y un par de trucos de javascript; pero todos sabemos que AJAX hace mucho más que eso y de manera mucho más fácil y elegante… hasta que lo intentas usar en sharepoint!
Instalar las extensiones es una tarea complicada pero no imposible si tenemos algo de experiencia con sharepoint, aunque hacer que funcionen como esperamos puede ser un buen rompecabezas.

Afortunadamente hay un montón de gente con ganas de usar AJAX. Ahí tenéis dos ejemplos:

  • El sr. Zlatan ha dado con una solución para el refresco cíclico de datos en una webpart
  • Como ya comenté en la presentación, lo verdaderamente complicado de AJAX en Sharepoint son las conexiones entre webparts, aunque siempre podemos usar la nueva SmartPart de Jan Tielens.

Espero que os sirvan.

Anuncios

SharePoint 2007 Learning Guide

Para los que os haya entrado el gusanillo Sharepoint aquí teneis un sitio con montones de links para aprender sobre él:

http://searchvb.techtarget.com/generic/0,295582,sid8_gci1274283,00.html

Mi primer evento

El pasado día 21 tuve la ocasión de dar mi primera charla sobre el desarrollo sobre Sharepoint en un evento del grupo Baleares on .Net. Podéis encontrar la presentación powerpoint en la web del grupo. En breve mandaré algunos ejemplos más que me pidieron pero que fue imposible hacer en directo por falta de tiempo.

Nos vemos en el próximo evento!

Copia de listas en Sharepoint

Hace unos días en el foro Baleares On .Net pedían un ejemplo para fusionar listas en MOSS 2007. Aquí tenéis un ejemplo rápido de cómo se pueden hacer estas cosas gracias al modelo de objetos de WSS. Basta con crear una aplicación de consola con una referencia a la librería Microsoft.Sharepoint.dll (v12) y escribir un código parecido a éste (si lo parametrizais un poco quedará mucho más bonito):

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;

namespace ListMerge
{
class Program
{
static void Main(string[] args)
{
//abre el sitio
Console.WriteLine("Abriendo sitio...");
SPSite mySite
= new SPSite("http://localhost");
SPWeb myWeb
= mySite.OpenWeb();

//obtiene las listas
Console.WriteLine("Obteniendo listas...");
SPList list1
= myWeb.Lists["task list 1"];
SPList list2
= myWeb.Lists["task list 2"];

//crea una nueva lista para copiar las dos anteriores
Console.WriteLine("Creando nueva lista...");
Guid newListId
= myWeb.Lists.Add("nueva Lista",
"nueva lista a partir de otras dos",
list1.BaseTemplate);

SPList newList
= myWeb.Lists[newListId];
newList.Update();

//copia la primera lista
Console.WriteLine("copiando lista 1");
foreach (SPListItem item in list1.Items)
{
SPListItem newItem
=newList.Items.Add();
foreach (SPField field in item.Fields)
{
if (!field.ReadOnlyField)
{
if (newList.Fields.GetField(field.Title) != null)
{
try
{
newItem[field.Title]
= item[field.Title];
}
catch (Exception ex)
{
//algunos campos puede que no se puedan
//copiar (attachments, etc...)
Console.WriteLine(ex.Message);
}
}
}
}
//necesario para crear el item
newItem.Update();
}

//copia la segunda lista, código exacto al anterior
Console.WriteLine("copiando lista 2");
foreach (SPListItem item in list2.Items)
{
SPListItem newItem
= newList.Items.Add();
foreach (SPField field in item.Fields)
{
if (!field.ReadOnlyField)
{
if (newList.Fields.GetField(field.Title) != null)
{
try
{
newItem[field.Title]
= item[field.Title];
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
newItem.Update();

}

newList.Update();
Console.WriteLine(
"Finalizado!!!");
Console.ReadLine();
}
}
}

Webparts conectadas y el ciclo de vida

La mayoría de las quejas que oigo sobre el modelo de eventos de ASP.Net son por desconocimiento del ciclo de vida de las páginas. La más habitual suele estar relacionada con la gestión de eventos, ya que ocurren después del OnLoad de la página. Es muy importante conocer el orden pues en cada postback se vuelve a repetir todo el ciclo, así que aquí teneis una lista completa de qué pasa cuando se carga una página ASP.Net: http://blogs.thesitedoctor.co.uk/tim/2006/06/30/Complete+Lifecycle+Of+An+ASPNet+Page+And+Controls.aspx

Para el caso de webparts conectadas hay un paso adicional a tener en cuenta: los eventos de consumición de datos. Para no liarnos hay que tener en cuenta siempre este orden:

  • OnInit
  • CreateChildControls
  • OnLoad
  • Gestión de eventos de postback
  • Consumición de datos de webparts conectadas
  • OnPreRender
  • RenderContents