¿Que nos faltó para crear un ToolBoxData para SharePoint Designer?

Bueno, esta entrada va dedicada a quienes quieran crear sus propios Menús, u otro tipo de ToolBoxData para ser ocupados a través de Designer para un sitio SharePoint (WSS o MOSS).

Primero que todo, debemos crear nuestro proyecto WSPBuilder (recuerden que éste se baja desde codeplex, es gratuito, y queda como una extensión de nuestro Visual Studio).

Al ser un proyecto que afectará a Designer, no tenemos que crear páginas .aspx ni trabajar con masterPages, sólo debemos indicarle a nuestro código, que lo que estamos creando pasará a ser parte de nuestro Designer y que quedará disponible para ser agregado en SharePoint.

Manos a la obra!

La magia está en esta simple línea de código: [ToolboxData(“<{0}:<nombre de la clase> runat=\”server\” />”)]

Otro Detalle: debemos revisar los “Permisos”… :

[AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]

y porsupuesto… debemos indicarle a nuestro código, que éste heredará de la clase “System.Web.UI.WebControls.Menu”

public class <nombre de la clase> : System.Web.UI.WebControls.Menu

Acá les dejo la lista completa de los WebControls que se pueden crear, el link completo de MSDN (la tabla de clases y especificaciones es muy larga como para colocarla acá).

http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols(v=VS.90).aspx

y bueno… un poco de código guía:

foreach (SPList list in SPContext.Current.Web.Lists)            {

String vista= VirtualPathUtility.GetDirectory(list.DefaultViewUrl);

List<MenuItem> itemList;

if (itemByUrlDictionary.TryGetValue(vista, out itemList) == false) { continue; }
foreach (MenuItem menuItem in itemList)                {

menuItem.ChildItems.Clear();

foreach (SPView view in list.Views)                    {

String menuItemValue = menuItem.Value == menuItem.Text ? String.Empty : menuItem.Value;

if (view.Hidden == true || view.Title.StartsWith(menuItemValue) == false) { continue; }

MenuItem childItem = new MenuItem(view.Title) {

NavigateUrl = String.Format(“{0}/{1}”,serverRelativeUrl,view.Url)

};

menuItem.ChildItems.Add(childItem);

}

}

}

Bueno espero que les haya parecido interesante, y acá les dejo algunos links de MSDN para tener más información.

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.toolpane.aspx

http://msdn.microsoft.com/en-us/library/system.web.ui.toolboxdataattribute.aspx

Un nuevo desafío “Desarrollar sobre el Modelo de Objetos de SharePoint”

Buenas tardes a todos.

Mi nombre es Constanza Herrera, Llevo aproximadamente 2 años y fracción trabajando con SharePoint, pero ya hace un año comencé a especializarme en esta herramienta, formando parte del equipo de Colaboración, liderado por Juan Andrés Valenzuela.

Dentro de los desafíos que han aparecido en este camino, se me dio la “oportunidad” de comenzar a Desarrollar sobre esta plataforma (Razón por la cual escribo esta entrada), ¿nunca les ha pasado que cuando están trabajando con SharePoint (sea WSS 3.0 o MOSS) les aparece la necesidad de enviar un archivo a distintos lugares?, claro! existe la opción de “Enviar a”, pero esto nos ayuda en una sola… por lo cual, el trabajo es RE PE TI TI VO…

Bueno, Manos a la obra!.

(Si se ha trabajado antes con SharePoint + C# es una gran ayuda).

Lo primero que tenemos que hacer es iniciar un nuevo proyecto WSPBuilder. (si no lo tenemos, se puede descargar aqui: http://wspbuilder.codeplex.com/).

Una vez hecho esto, debemos comenzar a crear nuestro “árbol”

Los archivos que componen este tipo de “features” son diversos, la idea, es trabajar con la MasterPage por defecto del propio SharePoint (cosa que aveces VS2008 no lo muestra en “preview” a diferencia de VS2005), y en ésta crear la nueva .aspx que nos enviará el documento.

Se necesita, además, los archivos “feature.xml” y “elements.xml”, en los cuales tendremos la información de la Feature, imagen que aparecerá en el menú asociado al nombre del archivo, nombre de la Feature, etc.

Por supuesto, no podemos dejar atrás nuestra .aspx, con su respectivo código, el cual será quien haga la magia en nuestro Site.

Es en este punto donde WSPBuilder nos ayuda… quienes han desarrollado antes para SharePoint saben lo incómodo que era generar la .dll, luego copiarla a la GAC, y luego firmarla como SafeControl, sin contar que hay que generar la key asociada… bueno, el WSPBuilder hace esta magia, además de ayudarnos en compilar, deployar, etc hacia SharePoint (adiós stsadm!!!).

Siguiendo con el tema, ¿donde está la magia?, bueno, el modelo de objetos de SharePoint cuenta con un método “MoveTo” que lo que hace es poder copiar el archivo a un/os Destino/s Asociados, manteniendo la Metadata. (ideal! ya que respeta el historial de versiones, a diferencia de su hermano CopyTo, que pisa al 100% el documento y no mantiene éste).

El resto va en la imaginación de cada uno, en mi caso, presente las URL’s en una Grilla separadas, así el ciclo recorre cada uno de los campos de la grilla y envía el archivo.

Finalmente, les dejo un extracto del código… para que vean como interactuan…

protected void Button1_Click(object sender, EventArgs e)        {
SPFile file = SPContext.Current.Web.GetFile(this.TextBox1.Text);
if (destino != null)            {

for (int var = 0; var < celda.Length; var++)                {

if (destino[destino.Length – 1] == Path.AltDirectorySeparatorChar)                    {

file.MoveTo(celda[var] + file.Name, true);

}              else                    {

file.MoveTo(celda[var] + Path.AltDirectorySeparatorChar.ToString() + file.Name, true);                                           }
} Response.Redirect(file.ParentFolder.ServerRelativeUrl);
}            else            {

this.TextBox1.Text = listItem.Url;

this.DataGrid1.Visible = false;

this.TextBox2.Visible = true;

this.TextBox2.Text = “Este documento no tiene asociado ninguna dirección de Destino”;

this.Button2.Visible = true;

this.Button1.Visible = false;

}

}

Esperando que les haya gustado este primer post, me despido…!!!!

Saludos y gracias por leer y comentar! y hasta la próxima.