25/4/08

SharePoint Templates

Existe un pack de 40 plantillas que vienen perfectas para poder hacer presentaciones de producto y puedenayudar mucho a la hora de vender una aplicación MOSS a los clientes. Estas plantillas se encuentran en un paquete gratuito que está en esta URL:

http://www.microsoft.com/downloads/details.aspx?familyid=5807B5EF-57A1-47CB-8666-78C1363F127D&displaylang=en

Para instalarlas puede darnos algo de problemas porque hay que ejecutar el STSADM y puede ser algo largo ya que hay que ir plantilla por plantilla instalandolas. Para hacer este proceso más ameno aqui os dejo todos los comandos. Simplemente teneis que editar un fichero .BAT, ponerlo en la ruta del STSADM.EXE y cambiar el path C:\Temp por el correspondiente donde tengais las plantillas.

Aqui os dejo los comandos:

ECHO ON
REM - This solution is the core and is needed for all of the Server Admin Templates:
stsadm -o addsolution -filename "C:\Temp\ApplicationTemplateCore.wsp"
stsadm -o deploysolution -name "ApplicationTemplateCore.wsp" -allowgacdeployment -immediate

REM - Installing the rest...
stsadm -o addsolution -filename "C:\Temp\AbsenceVacationSchedule.wsp"
stsadm -o deploysolution -name "AbsenceVacationSchedule.wsp" -allowgacdeployment -immediate


stsadm -o addsolution -filename "C:\Temp\BudgetingTrackingMultipleProjects.wsp"
stsadm -o deploysolution -name "BudgetingTrackingMultipleProjects.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\BugDatabase.wsp"
stsadm -o deploysolution -name "BugDatabase.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\CallCenter.wsp"
stsadm -o deploysolution -name "CallCenter.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\ChangeRequest.wsp"
stsadm -o deploysolution -name "ChangeRequest.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\ComplianceProcessSupport.wsp"
stsadm -o deploysolution -name "ComplianceProcessSupport.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\ContactsManagement.wsp"
stsadm -o deploysolution -name "ContactsManagement.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\DocumentLibraryReview.wsp"
stsadm -o deploysolution -name "DocumentLibraryReview.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\EventPlanning.wsp"
stsadm -o deploysolution -name "EventPlanning.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\ExpenseReimbursementApproval.wsp"
stsadm -o deploysolution -name "ExpenseReimbursementApproval.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\HelpDesk.wsp"
stsadm -o deploysolution -name "HelpDesk.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\InventoryTracking.wsp"
stsadm -o deploysolution -name "InventoryTracking.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\ITTeamWorkspace.wsp"
stsadm -o deploysolution -name "ITTeamWorkspace.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\JobRequisition.wsp"
stsadm -o deploysolution -name "JobRequisition.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\KnowledgeBase.wsp"
stsadm -o deploysolution -name "KnowledgeBase.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\LendingLibrary.wsp"
stsadm -o deploysolution -name "LendingLibrary.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\PhysicalAssetTracking.wsp"
stsadm -o deploysolution -name "PhysicalAssetTracking.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\ProjectTrackingWorkspace.wsp"
stsadm -o deploysolution -name "ProjectTrackingWorkspace.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\RoomEquipmentReservations.wsp"
stsadm -o deploysolution -name "RoomEquipmentReservations.wsp" -allowgacdeployment -immediate

stsadm -o addsolution -filename "C:\Temp\SalesLeadPipeline.wsp"
stsadm -o deploysolution -name "SalesLeadPipeline.wsp" -allowgacdeployment -immediate

PAUSE



saludos,
Juan Alcalá

23/4/08

Nueva versión de la web

Nueva versión mejorada del blog. Espero que os guste.
No olvideis pinchar en los banners de publicidad :-)

saludos,
Juan Alcalá

9/4/08

Subir un documento con metadatos en MOSS

Podemos subir documentos mediante código. Pero lo que puede ser un poco más dificil de ver es cómo subir el documento y algunos metadatos adjuntos. No pasa nada, aquí teneis la solución. El truco es pasarle una tabla hash con los datos que nos interesan.

private bool _uploadDocument(string pdfFile, string txtFile)
{
try
{
//This is mandatory for avoiding an error_web.AllowUnsafeUpdates = true;
//Use the list as a folderSPFolder folder = _web.GetFolder(_DestFolder);
SPFileCollection files = folder.Files;
//Get the fileFileStream fStream = File.OpenRead(pdfFile);
HashTable MetaDataTable = new HashTable();
MetaDataTable.Add(”nom de colonne“, “valeur“);
//Set the destination url for SharePointstring url = _DestUrlPath + _DestFolder + “/” + Path.GetFileName(pdfFile);
//Add document to the list with metadata, and overwrite an existing documentwith the same name
SPFile currentFile = files.Add(url, fStream, MetaDataTable, true);
fStream.Close();
return true;
}
catch (Exception x)
{throw new Exception(x.Message);}
}

saludos,
Juan Alcalá

Obtener el Servidor SMTP configurado en MOSS

Para envío de correo podemos poner el SMTP que nosotros queremos, pero si disponemos de un Sharepoint configurado con su servidor podemos utilizarlo sin problemas. Lo único que tenemos que hacer es localizarlo. Para ello insertamos el siguiente código:

using Microsoft.Sharepoint.Administration;

private string GetSmtpServer()
{
SPWebApplicationCollection spWebApplicationCollection = SPWebService.ContentService.WebApplications;
SPOutboundMailServiceInstance smtpServer = new SPOutboundMailServiceInstance();
if (spWebApplicationCollection != null)
{
foreach (SPWebApplication spWebApplication in spWebApplicationCollection)
{
smtpServer = spWebApplication.OutboundMailServiceInstance;return smtpServer.Server.Address;
}
}
return string.Empty;
}

saludos,
Juan Alcalá

Crear sitios a partir de plantillas

Podemos crear un sitio mediante código. En realidad, prácticamente todo lo que hacemos mediente Clicks en MOSS podemos implementarlo con el API de SharePoint. El código sería algo parecido a esto:

public static void CrearSitio(string urlWebPadre, string NombrePlantilla, string urlRelativaNuevoSitio, string Titulo, string Descripcion, bool EliminarSiExiste)
{
SPSite siteTop = new SPSite(urlWebPadre);
SPWeb siteRoot = siteTop.OpenWeb();
SPWebCollection myWebs = siteRoot.Webs;
//Obtenemos colección de plantillas
SPWebTemplateCollection webTemplateCollection = siteTop.GetCustomWebTemplates(3082);
//Obtenemos plantilla deseada
SPWebTemplate webTemplate = webTemplateCollection[NombrePlantilla];
//Eliminamos si existe
if (EliminarSiExiste && myWebs[urlRelativaNuevoSitio].Exists)
{
myWebs.Delete(urlRelativaNuevoSitio);
}
//Creamos sitio:
myWebs.Add(urlRelativaNuevoSitio, Titulo, Descripcion, 3082, webTemplate, true, false);
}

saludos,
Juan Alcalá

8/4/08

Windows Server 2008

Ya podemos descargarnos nuestra Trial para probar el nuevo Windows Server 2008, en vesion Standard o Enterprise.

Windows Server 2008 Enterprise (Trial 60 dias)
https://www.microsoft.com/downloads/details.aspx?familyid=13C7300E-935C-415A-A79C-538E933D5424&displaylang=es

Windows Server 2008 Standard (Trial 60 dias)
https://www.microsoft.com/downloads/details.aspx?familyid=B6E99D4C-A40E-4FD2-A0F7-32212B520F50&displaylang=es


saludos,
Juan Alcalá

Eventos en WSS 3.0

Una de las alternativas que tenemos a la creación de un workflow es utilizar eventos. Los eventos nos van a permitir controlar determinados aspectos de nuestros ítems, nuestras listas, e incluso webs.

Los eventos tienen dos formas, la que está en pasado que se llevará a cabo cuando el evento ya se ha producido, y la continua que se llevará a cabo antes de que el evento ocurra. Con todo esto, disponemos de los siguientes eventos:

En esta tabla se recogen las diferentes posibilidades:

SPItemEventReceiver
ItemAdded ItemAdding ItemAttachmentAdded ItemAttachmentAdding
ItemAttachmentDeleted ItemAttachmentDeleting ItemCheckedIn ItemCheckedOut ItemCheckingIn ItemCheckingOut ItemDeleted ItemDeleting ItemFileConverted ItemFileMoving ItemUncheckedOut ItemUncheckingOut ItemUpdated ItemUpdating

SPListEventReceiver
FieldAdded FieldAdding FieldDeleted FieldDeleting FieldUpdated FieldUpdating

SPWebEventReceiver
SiteDeleted SiteDeleting WebDeleted WebDeleting WebMoved WebMoving

Lo primero que tenemos que hacer es crearnos una clase que herede del Receiver que nos interesa:

public class MiEventHandler : SPItemEventReceiver
{ .... }


En este ejemplo queremos que:
1.- cuando se inserte un ítem, en el metadato “Datos” ponga "Nuevo .."
2.- y cuando se modifique ponga "Modificado ..".
3.- y que sólo se pueda eliminar un ítem modificado.

Para ellos sobreescribimos los eventos ItemAdded, ItemUpdated e ItemDeleting

public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem listItem = properties.ListItem;
listItem["Datos"] = "Nuevo " + properties.EventType.ToString();

DisableEventFiring();
listItem.Update();
EnableEventFiring();
}


public override void ItemUpdated(SPItemEventProperties properties)
{
SPListItem listItem = properties.ListItem;
if (listItem["Datos"].ToString().Contains("Nuevo"))
{
listItem["Datos"] = "Modificado " + properties.EventType.ToString(); ;
listItem.Update();
}
}


public override void ItemDeleting(SPItemEventProperties properties)
{
SPListItem listItem = properties.ListItem;
if (listItem["Datos"].ToString().Contains("Nuevo"))
{
properties.Cancel = true;
properties.ErrorMessage = "No se puede eliminar un elemento Nuevo";
}
}


NOTA: Utilizamos ItemDeleting y no Itemdeleted porque no queremos que el ítem se borre, queremos hacer una comprobación previa.

NOTA2: Hay que Habilitar y Deshabilitar los eventos si vemos que pueden entrar en conflicto. Por ejemplo, si en el ITemAdded modificamos un item y hacemos item.Update(); lo que estamos haciendo es lanzar automaticamente ItemUpdating y a lo mejor no nos interesa.


Para agregar la DLL a las listas que queramos nos haremos una aplicación Windows que tendrá este código:

using System;
using Microsoft.SharePoint;

namespace ConsoleTools
{
class Program
{
static void Main(string[] args)
{
SPSite site = new SPSite("SITE");
SPWeb web = site.OpenWeb();
SPList list = web.Lists[LISTA];

string ensamblado = "MiWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxx";
string clase = "MiWebPart.MiEventHandler";

list.EventReceivers.Add(SPEventReceiverType.ItemAdded, ensamblado, clase);
list.EventReceivers.Add(SPEventReceiverType.ItemUpdated, ensamblado, clase);
list.EventReceivers.Add(SPEventReceiverType.ItemDeleting, ensamblado, clase);

}
}
}

Ejecutando este código y después haciendo IISRESET veremos que el comportamiento de nuestra lista ha cambiado.
Código sacado del
Blog de Carlos Segura

saludos,
Juan Alcalá







3/4/08

Nueva Versión del AKS (Kit de Accesibilidad para SharePoint)

Acaban de lanzar la versión 1.1 de este Kit, la cual “proporciona niveles crecientes de accesibilidad a través de un ambiente de colaboración e incluye 21 nuevos adaptadores de control para los blogs y Wikis que se han desarrollado para mejorar la accesibilidad de las piezas Web y de los controles individuales dentro del servidor 2007 de Microsoft Office SharePoint”.

Saludos,
Juan Alcalá