SharePoint 2010: + iFilters (pero de pago)!

Hace un tiempo os comentaba desde dónde os podíais descargar una serie de iFilter disponibles para Office 2010. Como sabéis, estos iFilters nos permiten buscar dentro de los documentos con la extensión para la que aplican. Aparte de los iFilter de Office que vienen por defecto en la plataforma, tenemos otros iFilters gratuitos como puede ser el de Adobe para documentos PDF, y otros de pago que nos permiten ir todavía más allá. En este sentido, os quería dejar una página de una empresa especializada en iFilters de pago que seguramente cubran escenarios no tan habituales en cuanto a búsqueda de información como puede ser el caso de documentos CAD: http://www.ifiltershop.com/products.html

image

SharePoint 2010: Nueva release del proyecto CKS para SharePoint!

Ya tenemos para descarga una nueva release del proyecto CKS (Community Kit for SharePoint) disponible para descarga en Codeplex y a través del Extension Manager de Visual Studio. Este proyecto es sin duda un gran ejemplo de como podemos extender Visual Studio 2010 con nuevas funcionalidades aplicadas al desarrollo para SharePoint 2010 en este caso. Las novedades de esta nueva versión, que podéis encontrar en este enlace son las siguientes:

  • WSPBuilder conversion tool (WCT) beta – This ‘beta’ release of the WSPBuilder project importer project template allows a developer to migrate a SharePoint root based project structure to the new SharePoint Tool SPIs based file layout. The WCT is packaged with both Foundation and Server editions of CKSDev.
  • Improved Quick Deploy – Stability improvements to the Quick Deploy features.
  • Keyboard shortcuts – Introduction of Keyboard shortcuts for the menu items provided by the extension.
  • Updated Full Trust Proxy SPI – Improvements to the Full Trust Proxy SPI to include the deployment feature receiver.
  • Restart processes menus – Restart the Timer service, User code process and the VS host process.
  • Attach to processes menus – Attach to the Timer service, User code process and the VS host process.
  • Solution level Package all – Package all SharePoint projects within your solution from the Solution context menu.
  • Improved import Content Types – Improved to now support importing from subsite content types.
  • Branding SPI – New SPI providing branding with masterpage, css and deployment feature receiver.
  • Improved Fluent visual web part SPI – Improved code output to provide a more robust example code base.
  • Basic service application SPI – New SPI for a basic service application.
  • WCF service SPI – New SPI to produce a WCF service hosted within SharePoint.
  • SharePoint PowerShell cmdlet SPI – New basic PowerShell cmdlet SPI.
  • SharePoint PowerShell pipe binding SPI – New basic PowerShell pipe binding SPI.
  • Improved copy assembly name menu – Includes build project call during copy.

image

Fuente: SharePoint CKS Project new Release 1.2

SharePoint 2010: Como añadir validaciones en formularios de lista en el lado del cliente (I)!

A menudo cuando estamos creando soluciones para SharePoint 2010 nos podemos encontrar con la limitación de que tengamos que hacer cierta extensibilidad en el lado del cliente (con JavaScript) ya que por la circunstancias que sean no tengamos posibilidad de subir desarrollos ni el servidor ni en la galería de soluciones Sandbox o simplemente porque queremos que la experiencia de usuario sea lo más flexible posible. Esta situación se puede dar por ejemplo cuando necesitamos introducir validaciones en formularios de lista adicionales a las que nos da por defecto la plataforma. En este artículo y siguientes trataré de cubrir este tema sobre como añadir cierta lógica en cliente mediante JavaScript:

  • Lo primero que vamos a hacer es disponer de una lista en la que hay ciertos campos a validar. Por ejemplo, en este caso no queremos que el campo Title esté vacío y además queremos que el valor del campo Numero3 no sea inferior a la suma de los campos Numero1 y Numero2.
  • A continuación, tenemos que analizar lo que nos devuelve el servidor cuando abrimos el formulario de creación de elemento o de edición para saber como identificar los controles a validar. Como podéis ver, más o menos tenemos un cierto patrón que nos permite identificar estos controles a través de:
    • El tipo de campo, que es “INPUT”.
    • El atributo id, que es un churro de caracteres que termina en un patrón conocido que en este caso es el tipo de campo TextField.
    • El atributo title, que contiene el nombre del campo.

 

image image
  • El detalle del código HTML devuelto  para el campo “Title” es el siguiente:
   1: <tr>

   2: <td nowrap="true" valign="top" width="190px" class="ms-formlabel"><h3 class="ms-standardheader">

   3: <nobr>Numero1</nobr>

   4: ></td>

   5: <td valign="top" class="ms-formbody">

   6: <!-- FieldName="Numero1"

   7:      FieldInternalName="Numero1"

   8:      FieldType="SPFieldNumber"

   9:   -->

  10:     <span dir="none">

  11: <input name="ctl00$m$g_c529ad40_bd17_4408_807b_3871c31df6c1$ctl00$ctl05$ctl01$ctl00$ctl00$ctl04$ctl00$ctl00$TextField" type="text" id="ctl00_m_g_c529ad40_bd17_4408_807b_3871c31df6c1_ctl00_ctl05_ctl01_ctl00_ctl00_ctl04_ctl00_ctl00_TextField" title="Numero1" class="ms-input" size="11" style="ime-mode:inactive;" /><br />

  12: an>

  13:     

  14:     

  15: </td>

  16: >

  • Una vez que tenemos claro como poder acceder a los campos de interés, ya podemos pasar a la fase de desarrollo de nuestro código JavaScript. En este caso, lo que haremos es usar Visual Studio 2010 y crearnos un archivo de tipo JavaScript para aprovechar sobre todo el IntelliSense.

image

  • Y el código a añadir es el que aparece debajo. Como véis, la clave de todo está en la función getTagFromIdentifierAndTitle que nos permite localizar el control buscado a partir del tipo de campo, el patrón para el id y el valor de la propiedad title.
  • Con la salida de esta función, obtenemos el control en cuestión mediante la llamada a document.getElementById.
  • Y a partir de aquí, a implementar la lógica que corresponde.
   1: function PreSaveAction() 

   2: {

   3:     //Empty field

   4:     var lsTitle = document.getElementById(getTagFromIdentifierAndTitle("input","TextField","Title"));         

   5:     if(lsTitle.value == "") 

   6:     { 

   7:         alert("El título no puede estar vacío"); 

   8:         return false; // Cancel the item save process 

   9:     } 

  10:  

  11:     //Checking fields

  12:     var lsNumero3= document.getElementById(getTagFromIdentifierAndTitle("input","TextField","Numero3"));

  13:     var lsNumero1= document.getElementById(getTagFromIdentifierAndTitle("input","TextField","Numero1"));

  14:     var lsNumero2= document.getElementById(getTagFromIdentifierAndTitle("input","TextField","Numero2"));

  15:     if (parseInt(lsNumero3.value) < parseInt(lsNumero1.value) + parseInt(lsNumero2.value) ) {

  16:         alert("Numero3 no puede ser menor que la suma de Numero1 y Numero2");

  17:         return false;

  18:     }

  19:     return true;  // OK to proceed with the save item 

  20: }

  21:  

  22:  

  23: function getTagFromIdentifierAndTitle(tagName, identifier, title) 

  24: {

  25:     var len = identifier.length;

  26:     var tags = document.getElementsByTagName(tagName); 

  27:     for (var i=0;i<tags.length;i++) {    

  28:             var tempString = tags[i].id; 

  29:         if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len))

  30:         {

  31:             return tempString;

  32:         }

  33:     }

  34: }

  • Para añadirlo a nuestro formulario de lista, una de las opciones disponibles pasa por:
    • Cargar en primer lugar el archivo JavaScript en una biblioteca del sitio.
    • Editar el formulario con la interfaz de usuario.
    • Añadir una WebPart de tipo ContentEditor. Editar el campo de contenido de la WebPart en modo HTML y añadir la referencia a nuestro archivo JavaScript.
  • Guardamos la personalización del formulario y ya estamos listos para probar las validaciones añadidas.
image image image

Referencias sobre este tema:

SharePoint 2010: Como crear un Timer Job con las Tools de VS 2010 para SharePoint!

Cómo sabéis, Visual Studio 2010 incorpora una serie de herramientas que facilitan el desarrollo para SharePoint 2010 a través de una serie de plantillas de proyecto que permiten crear elementos como WebParts, manejadores de eventos, flujos de trabajo, etc…vamos, que podemos crear casi de todo para SharePoint 2010. Y digo “casi” porque aunque si bien es cierto que podemos extender VS 2010 para crear nuestras propias plantillas, una que Microsoft no ha incluido dentro de las que vienen por defecto es la de creación de un Timer Job, o lo que es lo mismo, trabajos programados de la plataforma…el caso es que aunque no tengamos esa plantilla, podemos aprovechar las plantillas y herramientas de VS 2010 para crear fácilmente un Timer Job. Un ejemplo de esta idea lo podéis encontrar en este enlace.

SharePoint2010_thumb

SharePoint 2010: Otra herramienta interesante– SharePoint Log Reader!

Hace tiempo os comentaba que la utilidad ULS Viewer es una herramienta interesante e imprescindible para visualizar la información de los logs de SharePoint de una forma más amigable y facilitar además la búsqueda de ciertos errores. En este mismo sentido, otra herramienta similar que he descubierto recientemente es el SharePoint Log Reader disponible en Codeplex y que facilita también la lectura de los logs de SharePoint. Como siempre, una imagen vale más que 1.000 palabras Guiño:

SharePointLogReader3.png

 

SharePoint 2010: ¿Cuántas formas tengo de integrar datos externos?

Sin duda, a la hora de integrar datos externos en SharePoint 2010 la opción más adecuada es la proporcionada por los Business Connectivity Services que facilitan dicha integración. Ahora bien, la plataforma dispone de otras opciones como:

  • El uso de los servicios web de la plataforma, incluyendo la API REST que nos permite acceder a las listas y bibliotecas de un sitio de SharePoint tanto para leer información, como para escribirla.
  • Nuestra vieja conocida: la DataFormWebPart, que permite mostrar datos de orígenes de datos en base a la definición de una conexión que puede ser a una BD, a un servicio web o a un servicio REST.
  • El modelo de objetos en cliente de SharePoint, con sus tres sabores: .NET, ECMAScript y Silverlight.
  • A través del conector CMIS para SharePoint 2010 que garantiza la interoperabilidad de SharePoint con otros gestores de contenidos de otros fabricantes.

Para ampliar estas opciones, os recomiendo la lectura de este articulo en CMS Wire.

SharePoint2010_thumb

SharePoint 2010: Como iniciar automáticamente un flujo de trabajo!

Una pregunta que me han realizado últimamente es la de si se puede iniciar de forma programática un flujo de trabajo desplegado en un sitio de SharePoint sin esperar a que tenga lugar un cierto evento. Por ejemplo, estoy pensando en iniciar un flujo utilizando una simple aplicación de consola, un servicio de Windows o un Timer Job de SharePoint. La respuesta a la pregunta es que sí, ya que el modelo de objetos nos proporciona lo necesario para instanciar un cierto workflow desplegado en nuestro sitio e iniciarlo. Por ejemplo, el código siguiente muestra como asociar automáticamente un flujo de trabajo de sitio a un sitio en el momento de creación y nos da las pistas para ver como podemos hacer lo mismo en los escenarios mencionados. Como veis, todo pasa por:

  • Crear una instancia de SPWeb, que en este caso obtenemos a partir de las propiedades del manejador.
  • Crear las listas de tareas e historial para el flujo de trabajo si este las necesita.
  • Crear una instancia del flujo de trabajo, para lo que necesitaremos su ID y definir un objeto de tipo SPWorkflowTemplate.
  • Definir la asociación del workflow mediante un objeto de tipo SPWorkflowAssociation.
  • Añadir el workflow en este caso al sitio.
  • Y finalmente arrancar el flujo.
   1: static readonly Guid TemplateID =

   2:     new Guid("abd1d6cc-72a8-4c2f-a567-3118d28f5862");

   3:  

   4: public override void WebProvisioned(SPWebEventProperties properties)

   5: {

   6:  

   7:     SPWeb newSite = properties.Web;

   8:     Guid taskListID = newSite.Lists.Add(

   9:         "Tasks for auto-start workflow", "",

  10:         SPListTemplateType.Tasks);

  11:     Guid historyListID = newSite.Lists.Add(

  12:         "History for auto-start workflow", "",

  13:         SPListTemplateType.WorkflowHistory);

  14:  

  15:     SPWorkflowTemplate template = newSite.WorkflowTemplates[TemplateID];

  16:     SPWorkflowAssociation association =

  17:          SPWorkflowAssociation.CreateWebAssociation(template,

  18:             "Auto-start workflow",

  19:             newSite.Lists[taskListID],

  20:             newSite.Lists[historyListID]);

  21:     newSite.WorkflowAssociations.Add(association);

  22:     newSite.Site.WorkflowManager.StartWorkflow(

  23:          newSite,

  24:          association, "", SPWorkflowRunOptions.Synchronous);

  25:  

  26: }

Finalmente, os dejo una serie de enlaces relacionados con este tema: