SharePoint 2010: Definiciones de sitios (II)!

Siguiendo con la serie de posts sobre definiciones de sitios, en esta ocasión vamos a ver en la práctica como crear una definición de sitios. A la hora de crear una primera definición de sitio, sin entrar a Visual Studio 2010, podemos utilizar una primera aproximación manual que implicaría:

  • Partir de una definición existente y realizar una copia de la misma. En concreto, nos iríamos a la ruta ..\14\TEMPLATE\SiteTemplates, seleccionamos la carpeta correspondiente a la definición que queremos usar de base, la copiamos y le damos un nombre a la nueva carpeta. Por ejemplo, podemos realizar este proceso con la carpeta STS y crear una carpeta réplica MiCustomSTS.
  • Modificamos el archivo ONET.XML contenido en la carpeta XML para añadir o quitar características por ejemplo.
  • Nos vamos a la carpeta ..14\TEMPLATE\<Cultura>\ y en ella creamos un archivo que se denomine en este caso WEBTEMPMiCustomSTS.xml con el siguiente contenido (Podemos partir de uno ya existente):
   1: <?xml version="1.0" encoding="utf-8"?>

   2: <!-- _lcid="3082" _version="14.0.4762" _dal="1" -->

   3: <!-- _LocalBinding -->

   4: <Templates xmlns:ows="Microsoft SharePoint">

   5:  <Template Name="MiCustomSTS" ID="10001">

   6:     <Configuration ID="0" Title="Sitio de grupo personalizado" Hidden="FALSE" ImageUrl="/_layouts/images/stts.png" Description="Sitio para que los grupos organicen, creen y compartan información con rapidez. Proporciona una biblioteca de documentos y listas para la administración de anuncios, elementos de calendario, tareas y discusiones." DisplayCategory="Colaboración" >    </Configuration>

   7:  </Template>

   8: </Templates>

  • Como vemos, lo más peculiar es el ID usado par la definición que es 10001 (tiene que ser mayor que 10000) con el objeto de no sobreescribir las plantillas nativas.
  • Hacemos un reciclaje del pool de aplicaciones y comprobamos que tenemos disponible la nueva plantilla

image

SharePoint 2010: Autenticación basada en formularios para el MO en cliente!

Un post muy rápido en esta ocasión, para ver como usar autenticación basada en formularios mediante el modelo de objetos en cliente. Básicamente, para el sabor .NET del MO en cliente contamos con la propiedad AuthenticationMode en el objeto ClientContext qué se puede configurar mediante la enumeración ClientAuthenticationMode uno de cuyos valores es FormsAuthentication…de esta forma especificaremos que vamos a utilizar autenticación basada en formularios. A continuación, tendremos que crear un objeto de tipo FormsAuthenticationLoginInfo en el que definiremos usuario y contraseña…este objeto se usará para configurar la propiedad FormsAuthenticationLoginInfo de ClientContext.

   1: ClientContext ctx = new ClientContext("http://MiSitioSharePoint/");

   2: ctx.AuthenticationMode = ClientAuthenticationMode.FormsAuthentication;

   3: FormsAuthenticationLoginInfo loginInfo = new FormsAuthenticationLoginInfo {

   4: LoginName = "LoginName",

   5: Password = "Password",

   6: };

   7: ctx.FormsAuthenticationLoginInfo = loginInfo;

SharePoint 2010: Ocultar / des-ocultar campos de formulario de lista (II)!

Hace un tiempo os comentaba varias alternativas que tenemos disponibles a la hora de ocultar/des-ocultar  campos de un formulario de lista de SharePoint. Una de las posibilidades que tenemos es mediante el uso de PowerShell utilizando un script similar al siguiente:

   1:  $site = new-object Microsoft.SharePoint.SPSite($siteurl)
   2:  $web = $site.OpenWeb()
   3:  $list = $web.Lists["MiLista"]
   4:  $field = $list.Fields["MiCampo"]
   5:  $field.ShowInNewForm = 0
   6:  $field.ShowInEditForm = 0
   7:  $field.ShowInDisplayForm = 0
   8:  $field.Update()
   9:  $list.Update()
  10:  $web.Dispose()

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Cómo veis, la aproximación es similar a lo que podemos hacer con el modelo de objetos en cliente:

  • Creamos una instancia de SPSite para a continuación acceder al sitio raíz mediante el correspondiente objeto SPWeb.
  • A continuación, de la colección de listas del sitio accedemos a la lista en particular (SPList).
  • Para esa lista y su colección de columnas, localizamos la columna que queremos quitar/añadir de los formularios (SPField).
  • Configuramos el comportamiento del campo en el formulario (su visibilidad) mediante las propiedades ShowInNewForm, ShowInEditForm y ShowInDisplayForm.
  • Actualizamos la configuración del campo mediante el método Update().
  • Actualizamos la lista mediante el método Update().
  • Finalmente, liberamos el objeto SPWeb mediante el correspondiente disposado.

SharePoint 2013: Como crear un manejador de eventos remoto (I)!

Hace unos meses os hablaba sobre las novedades en manejadores de eventos que tenemos en SharePoint 2013, poniendo foco en el soporte de manejadores de eventos remotos que se definen como servicios WCF que facilitan que las aplicaciones del nuevo modelo de aplicaciones puedan responder a eventos que tienen lugar en elementos típicos de SharePoint como sitios, listas o elementos de lista de forma similar a lo que podemos hacer con los manejadores de eventos convencionales. Los manejadores de eventos remotos se soportan en los tres tipos de aplicaciones del modelo de aplicaciones de SharePoint 2013:

  • Provider-Hosted, es decir, las aplicaciones están provisionadas en un servidor dedicado.
  • Autohosted, es decir, las aplicaciones están provisionadas en Windows Azure.
  • SharePoint Hosted, es decir, las aplicaciones están provisionadas en una colección de sitios independiente definida por aplicación web y denominada catálogo de aplicaciones.

Como comenté en el post inicial, en Visual Studio 2012 y en las herramientas de desarrollo para SharePoint/Office tenemos una plantilla específica para crear un manejador de eventos remoto. El proceso a seguir sería:

  • Crear un proyecto de tipo Aplicación para SharePoint 2013. En mi caso, elegir como tipo de aplicación “Hospedado por SharePoint” (SharePoint Hosted).
  • Añadir al proyecto un elemento de tipo Receptor de eventos remotos (Remote Event Receiver), lo que crea a nivel de Visual Studio 2012 un proyecto web con el servicio WCF que implementa el manejador de eventos remoto.
  • Codificar los dos métodos ya explicados en el post anterior, con la sutil diferencia de qué a nivel de modelo de objetos ha habido algunos cambios a tener en cuenta.
Capitulo14_Figura2 Capitulo14_Figura3

A nivel de cambios del modelo de objetos, nos encontraremos conque:

  • La clase manejadora hereda de la interfaz IRemoteEventService que está definida dentro de un nuevo espacio de nombres using Microsoft.SharePoint.Client.EventReceivers;
  • En lugar de trabajar con RemoteEventProperties, tendremos SPRemoteEventProperties y para detectar el tipo de evento tendreos SPRemoteEventType en lugar de RemoteEventType.
  • Dicho esto, la codificación es idéntica para los métodos ProcessEvent() (para eventos de tipo síncrono) y ProcessOneWayEvent() que implementa la clase manejadora:
    • Para una lista de tipo personalizado, una implementación de ejemplo de ProcessEvent() es:
   1:          public SPRemoteEventResult ProcessEvent(SPRemoteEventProperties properties)
   2:          {
   3:              SPRemoteEventResult result = new SPRemoteEventResult();
   4:   
   5:              switch (properties.EventType)
   6:              {
   7:                  case SPRemoteEventType.ItemAdding:
   8:                      result.ChangedItemProperties.Add(
   9:                          "Title",
  10:                          properties.ItemEventProperties.AfterProperties["Title"] +=
  11:                          " - Añadiendo Elemento");
  12:                      break;
  13:                  case SPRemoteEventType.ItemDeleting:
  14:                      result.ErrorMessage =
  15:                          "No se pueden elminar elementos de esta lista";
  16:                      result.Status =
  17:                          SPRemoteEventServiceStatus.CancelWithError;
  18:                      break;
  19:                  default:
  20:                      break;
  21:              }
  22:              
  23:              return result;
  24:          }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

    • Y para ProcessOneWayEvent() tendríamos:
   1:          public void ProcessOneWayEvent(SPRemoteEventProperties properties)
   2:          {
   3:              if (properties.EventType == SPRemoteEventType.ItemAdded)
   4:              {
   5:                  using (ClientContext ctx = new ClientContext(
   6:                      properties.ItemEventProperties.WebUrl))
   7:                  {
   8:                      List lList =
   9:                          ctx.Web.Lists.GetByTitle(
  10:                              properties.ItemEventProperties.ListTitle);
  11:                      ctx.Load(lList);
  12:                      ListItem liItem =
  13:                          lList.GetItemById(
  14:                              properties.ItemEventProperties.ListItemId);
  15:                      ctx.Load(liItem);
  16:                      ctx.ExecuteQuery();
  17:                      liItem["Title"] +=
  18:                          " - Elemento Añadido";
  19:   
  20:                      liItem.Update();
  21:                      ctx.ExecuteQuery();
  22:                  }
  23:              }
  24:          }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Fijaros con como en ProcessOneWayEvent() hacemos uso del modelo de objetos en cliente para actualizar el elemento de lista una vez que se ha añadido. Y  hasta aquí llega este primer post sobre creación de manejadores de eventos remotos.

SharePoint Online: Soporte de PowerShell (II)!

Siguiendo con la serie de posts sobre soporte de PowerShell en SharePoint Online en Office 365 (en la nueva versión de la plataforma, cuya base para el caso de SharePoint Online es SharePoint 2013) en esta ocasión vamos a ver en la práctica como se ejecutan esos comandos PowerShell siguiendo para ello las pautas marcadas en este enlace de TechNet: http://technet.microsoft.com/en-us/library/fp161372.aspx. Los pasos a seguir para ejecutar comandos PowerShell contra SharePoint Online son los siguientes:

  • En primer lugar, necesitamos bajarnos la última versión actualizada de los cmdlets de PowerShell para SharePoint Online. Afortunadamente, y gracias a este post en el blog del equipo de SharePoint, podemos descargarnos esta última versión desde este enlace.
  • Instalamos el SharePoint Online Management Shell y una vez instalado, para comenzar a utilizar los cmdlets de PowerShell específicos para SharePoint Online necesitaremos ejecutar en dicho shell la siguiente secuencia:
   1:  Connect-SPOService -Url https://<DominioOffice365>-admin.sharepoint.com –credential <UsuarioOffice365>@<DominioOffice365>.onmicrosoft.com

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  • El valor del parámetro Url no es otro qué el de la página del centro de administración de SharePoint Online en Office 365. El parámetro credential es la cuenta de usuario de Office 364 que utilicemos y que tiene permisos de administración en SharePoint Online.
  • Si ejecutamos este comando, se nos pedirán las credenciales de acceso a Office 365.
  • Una vez conectados, para obtener el listado de los cmdlets disponibles para SharePoint Online simplemente ejecutamos por ejemplo: Get-Command *-SPO* y obtendremos todos los cmdlets específicos para SharePoint Online.
image image image
  • Cómo veis, no hay muchos cmdlets específicos para SharePoint Online…en concreto, si ejecutáis:
   1:  $SPOCommands=Get-Command *-SPO*
   2:  $SPOCommands.count

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  • Veréis que hay un total de 30 cmdlets que llevan SPO en su nombre.
  • Si ejecutamos por ejemplo Get-SPOSite, obtendremos el listado de colecciones del sitios disponibles en nuestro.

image

SharePoint Online: Soporte de PowerShell (I)!

Una de las novedades de de la nueva generación de Office 365 es qué se introduce el soporte de comandos PowerShell en SharePoint Online, lo que hasta ahora no era posible. Evidentemente, no podemos esperar hacer el mismo tipo de operaciones que tenemos disponibles para SharePoint On-Premise. Y los comandos PowerShell disponibles para SharePoint Online son un subconjunto reducido de los disponibles para SharePoint On-Premise. En concreto, tendremos comandos PowerShell de acuerdo a categorías como:

  • Administración de usuarios.
  • Administración de grupos de usuarios.
  • Administración de colecciones de sitios.
  • Administración de niveles de organización.
  • Actualización.
  • Conexión/Desconexión de servicios.

Fijaros en como de nuevo la información disponible está un tanto obsoleta y de cara a la disponibilidad de de la nueva generación de Office 365, pueden variar el número de comandos disponibles. En cuanto a lo que necesitamos para poder empezar a usar estos comandos PowerShell, lo podéis encontrar en la siguiente referencia: http://technet.microsoft.com/en-us/library/fp161372.aspx. Básicamente:

  • Instalar Windows PowerShell 3.0.
  • Descargar e instalar el SharePoint Online Management Shell: http://www.microsoft.com/en-us/download/details.aspx?id=35588. Es este componente el que nos va a proporcionar acceso a los cmdlets específicos para SharePoint Online como veremos en el siguiente post de la serie.