lunes, 24 de febrero de 2014

SP2013: Content Search WebPart

Una de las características más notorias de SharePoint 2013 es la gran relevancia que toma el servicio de búsquedas para diversos servicios como el de elaborar estadísticas de uso de los sites (substituyendo al anterior Web Analytics) y también con el Content Search WebPart (y los derivados Search-Driven WebParts).

Hoy vamos a centrarnos en el Content Search WebPart, que es una herramienta flexible y poderosa para construir aquellas páginas de nuestros portales donde queramos mostrar diversos elementos retornados por un motor de búsqueda.

Por poner un ejemplo visual claro y conciso, me centraré en la elaboración de un blog, donde vamos a empezar mostrando 3 posibles utilidades del Content Search WebPart. Las imágenes nos ahorrarán muchas palabras:


En la imagen anterior ya se pueden ver claramente 2 funcionalidades distintas en las que puede operar el "Content Search WebPart".

1.- Como "slider" o visualizador dinámicos de contenidos. Situado en la zona superior izquierda, nos muestra un rotativo de imágenes y títulos relacionados de posts en Silverlight.

2.- Como "listado" de contenidos. En este caso "posts" de un blog. El formato es totalmente personalizable, como veremos más adelante. Nótese que el post de la zona superior derecha no es navegable, y es siempre fijo (corresponde al "último post creado") y sin embargo el resto tienen paginación y se puede ir de una página a otra mediante las flechitas de derecha-izquierda que vemos debajo y a la izquierda del slider.

Veamos ahora una tercera posible funcionalidad del mismo web-part.


3.- Listado de "posts" relacionados con el "post" que se está visualizando actualmente. La vinculación se realiza mediante el metadato "categorías" del post, que lo realicé mediante el servicio de metadatos administrados. Este webpart muestra los últimos posts creados que coinciden con la misma "categoría" que el post que se está visitando.

Ahora que ya hemos visto diversos ejemplos de lo que podemos hacer, vamos a ver cómo lo podemos hacer. El primer paso es añadir el WebPart de "Content Search" que se encuentra en la sección de "Content Rollup" en una página donde queramos mostrar este tipo de funcionalidad.



Hay que aclarar aquí que también disponemos la categoría de "Search-Driven Content" WebParts, con diversos de ellos preparados, formateados y pre-filtrados para situaciones específicas (mostrar vídeos, mostrar páginas de publishing, etc.). Sin embargo os recomiendo que siempre que podáis, utilicéis el "Content Search WebPart" por defecto, ya que os dará todas las posibilidades del webpart sin limitación y lo podréis adaptar fácilmente a vuestro caso en particular.

Una vez tengamos el WebPart en nuestra página, veremos que si accedemos a su panel de configuración tiene 4 secciones características, a parte de las típicamente incluidas en cualquier otro WebPart.
  1. Search Criteria
  2. Display Templates
  3. Property Mappings
  4. Settings

 
Vamos a ver cada una de ellas en este post.

1. Search Criteria

 En esta sección de configuración encontramos 2 parámetros básicos:

  • Query (botón "Change query"): Nos permite crear la consulta sobre la cual vamos a obtener el conjunto de resultados que trabajará el WebPart. Realmente es muy potente y flexible, y permite ajustar el query a niveles impensables en 2010. Se basa en lenguaje Keyword Query Language (KQL). Podéis encontrar una referencia del mismo en este enlace. Debido a que es un campo con muchas opciones de configuración, para no eternizar este post simplemente os referenciaré a este otro post, donde se centra en todas las opciones que tendremos al pulsar en "Change Query" para moldear la consulta a nuestro gusto.
  •  Number of ítems to show: Indica cuantos elementos queremos que se visualicen en el WebPart. En los ejemplos que puse al principio del post serían 3 para el slider, 1 para el listado a la derecha del slider (último post), 6 para la paginación de posts debajo del slider (posts recientes excepto el último) y 5 para los "posts relacionados".
 

2.Display Templates

 En esta sección encontraremos 3 parámetros que nos permitirán especificar de qué forma queremos visualizar los resultados de la consulta.
 
  • Control: Especifica el tipo de control que queremos obtener. Hay 3 posibles valores a seleccionar.
    • List: Indica un listado simple de elementos. En los ejemplos expuestos se correspondería al webpart de "último post" a la derecha del slider y también a los "posts relacionados".
    • List with Paging: Indica un listado simple de elementos con paginación (flechas de navegación "adelante" y "atrás"). En los ejemplos expuestos se correspondería al webpart de "últimos posts" por debajo del slider.
    • SlideShow: Indica que queremos un slide de diversos elementos contenidos en un control Silverlight, que irá alternando de uno a otro cada pocos segundos. En los ejemplos expuestos se correspondería al slider principal de la zona superior izquierda.
  • Ítem: Especifica la plantilla de "display templates" que se va a utilizar para dar formato visual al elemento. Existen una serie de plantillas predeterminadas, pero podemos crear la nuestra propia para darle el formato gráfico/textual exacto a nuestros requerimientos. Lo normal es que nos basemos en un estilo ya existente y a partir de ahí le asignemos un .CSS que retocaremos a nuestro gusto para darle el look&feel deseado. En los ejemplos que expuse al principio del post, utilicé el "SlideShow" que venía por defecto para el slider, un display template propio para los webparts de "último post" y listado de "post recientes", y otro display template personalizado para los "posts relacionados".
  • Don't show anything when there are no results: Indica si queremos que no se muestre absolutamente nada en caso de que el query no retorne ningún consultado. Si no está marcado, mostrará un mensaje del tipo "no se ha encontrado ningún resultado coincidente con la búsqueda".


3.Property Mappings

En esta sección tendremos la opción de personalizar qué información queremos mostrar en cada campo respecto a la plantilla (display template) utilizada.

  • Change the mapping...: Por defecto está desmarcada, y utiliza los mapeos predeterminados para cada plantilla (display template) predeterminado en el propio fichero del template. Si se desmarca, nos permite especificar manualmente qué propiedad (managed property) va a utilizarse para dar contenido a cada campo.
  • Mapped fields: En caso de que marquemos el campo "Change the mapping..." podremos seleccionar aquí, para cada uno de los campos definidos en el display template que estemos aplicando, el valor que incluirá, seleccionando la managed property con la que queramos popular el campo. 
 

4.Settings

 En esta sección podremos configurar algunos parámetros adicionales para acabar de refinar el Search WebPart a nuestro gusto.
  • Query results provided by: Indica cual es el WebPart que provisiona los resultados de la consulta. Por defecto es el propio WebPart que estamos configurando (mediante el campo "Query" de la sección "Search Criteria", pero se podría configurar para que fuera un webpart de "caja de búsqueda" (por ejemplo) el que proveyera los resultados a mostrar.
  • Result Table: Indica la tabla de resultados a utilizar. Por defecto está en "RelevantResults" (normalmente siempre utilizaremos esta). Aunque podría modificarse a "PersonalFavoriteResults", "RefinementResults" o "SpecialTermResults".
  • Start displaying results from result number: Indica por qué número de resultado ha de empezar a mostrar ítems en pantalla. Si, por ejemplo, le indicamos un "2" el primer ítem retornado no lo mostraría. En los ejemplos expuestos, es el caso del WebPart de "posts recientes" (bajo el slider), que configuré con un 2, porque el primer resultado ya se estaba mostrando en el WebPart de "último post" (a la derecha del slider).
  • Alternate Error Message: Aquí podemos especificar un mensaje de error personalizado en caso de que falle la ejecución de la consulta.

¡¡Pues esto es todo!! Ahora que hemos visto ejemplos de qué puede hacer el Content Search WebPart en 2013, y qué opciones de configuración tiene, podremos hacernos una idea de todo el potencial que tenemos en nuestras manos para crear webparts de contenido personalizados a nuestro gusto.

¡¡Enjoy it!!

miércoles, 12 de febrero de 2014

SP2013: Cómo forzar las alertas de búsqueda de forma inmediata

Si sois administradores de SharePoint, es posible que alguna vez os hayáis encontrado con la necesidad de forzar una ejecución inmediata de alguna alerta de búsqueda.

Sin embargo SharePoint no facilita ninguna interface (ni siquiera PowerShell) para forzar esta ejecución. Así que la única opción que tenemos es esperar un día natural para ver si nos llega ese deseado e-mail de forma correcta. ¡¡Pero nosotros no podemos esperar tanto!!



Así que... ¿Cómo puedo forzar la ejecución automática de estas alertas? Lamentablemente tan solo podremos activarlas haciendo algo de "cirujía" directamente en la Base de Datos de Contenidos de nuestro Site Collection.

Como pre-requisitos, deberemos tener activadas las alertas de búsqueda, así como bien configurado el correo electrónico saliente (outgoing e-mail settings), tener suscripción a alguna alerta de búsqueda y haber realizado una indexación de todo el contenido recientemente.

Entonces "solo" tendremos que entrar en el servidor de SQL Server, lanzar el Management Studio, y una vez dentro, abrir nuestra BD de contenidos, buscar la tabla "Sched.Subscriptions" y hacer un "editar las 200 primeras filas", o en su defecto (mucho más polite) construir la sentencia SQL para que realice los cambios requeridos. En mi caso tiré por la edición directa, al ser un entorno de test con poco tráfico y pocas alertas creadas.

Una vez estemos consultando la tabla, lo primero será identificar nuestra alerta (la que queremos activar de forma inmediata), lo podemos hacer fácilmente buscando primero por la columna "AlertTitle" combinada con "UserEmail", por ejemplo. Una vez la tengamos localizada, hay que modificar 2 campos:

  • NotifyTime - Es el momento en el que se creó la alerta sumándole un día. Lo modificaremos para que se ejecute en el dia de hoy (fecha actual) y algunos minutos por encima de la hora actual (para que se active al poco de haberla editado). 
  • NotifyTimeUTC - tendrá un valor similar a NotifyTime, pero con la hora transformada a UTC + 0. En España estamos a UTC + 1, así que tendremos que restar una hora al valor introducido en NotifyTime)


Una vez realizados estos cambios, tendremos que esperar a la nueva hora que hemos editado para la alerta, así como dejar unos minutos de margen (pueden ser hasta 15) para que se ejecute el job que las revisa y lanza de forma periódica: Immediate alerts.

Pasado este margen de tiempo, el usuario suscrito a dicha alerta, recibirá el correspondiente mail, sin haber tenido la necesidad de esperar un día entero para ello. Podemos realizar la prueba tantas veces como queramos, siempre teniendo en cuenta que una vez se ejecuta la alerta, necesitaremos añadir nuevo contenido o modificar el existente (según el tipo de alerta) para que esta se vuelva a disparar (si no hay adiciones/cambios no hay ítems de los que informar y no se envía ningún mail).

Eso es todo por hoy, ¡Hasta pronto!

martes, 11 de febrero de 2014

SP2013: Las alertas de búsqueda sólo mandan correos de 10 ítems

Cuando un usuario de SharePoint 2013 se suscribe a una alerta de búsqueda (si de las que en el pié de los resultados de búsqueda uno puede suscribirse pulsando en "Alert Me")

 
lo que está provocando es que diariamente o semanalmente le llegue un correo electrónico con el resumen de los Nuevos contenidos que cumplen con el filtro de dicha búsqueda.
 
Lo curioso del caso es que, aunque hayan habido 45 nuevas entradas que encajen con esa búsqueda, en el correo tan solo veremos las últimes 10 de ellas. ¿Por qué? Es una buena pregunta, pero la que hará que vayais al borde de la locura es cuando intentéis, como administradores de la plataforma, modificar ese parámetro. ¿Cómo aumentar el número de resultados que nos muestran este tipo de correos?
 
 
 
Aunque debemos modificar el parámetro AlertNotificationQuota del Servicio de Búsqueda, no existe ningún fichero XML que podamos retocar, ni ningún parámetro accesible desde la Administración Central o de sitio. 
 
Este parámetro, sin embargo, se puede modificar por 2 vías distintas:
  • Mediante SharePoint Manager 2013, modificando dicha propiedad situada en "SearchApplications -- Search Service Application"
 
  • Mediante powershell, utilizando los siguientes comandos:
         $sapp = Get-SPServiceApplication –Name “Search Service Application
         $sapp.AlertNotificationQuota = 50
         $sapp.Update()

Donde "Search Service Application" es el nombre de nuestro servicio de búsqueda y "50" es el número máximo de ítems que queremos listar en nuestros correos de alertas.

Sencillo si sabes donde buscar, una locura si nadie te lo dice... Así es nuestro amigo SharePoint.

¡¡Salud!!

SP2013: ¿Donde está el "Sign in as different user"?

En uno de esos "recortes a lo minimalista" que tiene SharePoint 2013 nos damos cuenta de que ya no existe la siempre útil y accessible opción que los administradores teníamos en 2010 para autenticar-nos como un usuario distinto. De hecho, en el menú desplegable del usuario, ahora solo vemos las opciones "About Me" y "Sign Out".


Sin embargo, la opción de "Sign in as Different User" sigue existiendo, aunque está oculta (¡Como no!). Para accedir a ella, tan solo tendremos que añadir la siguiente coletilla a la URL del site/site collection en el que estemos operando:

_layouts/closeConnection.aspx?loginasanotheruser=true

De esta forma, construiremos una URL del tipo http://sitename/_layouts/closeConnection.aspx?loginasanotheruser=true

Con esto, accederemos a la añorada pantalla de login, que se agradece en según qué configuraciones del navegador:

Sabiendo esto, y con un poco de SharePoint Designer o Visual Studio nos podríamos llegar a fabricar fàcilment nuestros propios botones de "Sign in as..."

¡Salud!

martes, 4 de febrero de 2014

SP2013: Cómo incluir una vista de una lista en un Layout Template


Si habéis tenido la ocasión de trabajar con SharePoint 2013, ya sabréis que viene con un “Design Manager” que facilita la generación del paquete de diseño de un site (Master Pages, Pages Layouts, Display Templates…).

Hoy voy a centrarme en la casuística que tengamos que diseñar un Template Layout que contenga en sí mismo una “lista” (una vista de la misma) de nuestro site. Esto que a priori uno podría pensar que no se puede hacer (pues los Template Layous son puro “HTML” y no deja introducir componentes ni fragmentos de código ASP.NET), sí que se puede conseguir mediante el uso de SNIPPETS y algo de esfuerzo manual que, para evitar que perdáis demasiado tiempo investigando o tentados a caer en el pozo de la locura, os contaré en este post:


Lo primero de todo es crear una visualización (vista) de la lista, tal cual la queremos introducir en nuestro Template Layout. Para este ejemplo he tomado el escenario de tener que realizar un Blog personalizado, con un menú de navegación histórico en el frame lateral derecho. Una posible solución para este componente (.NET code free) es realizarlo mediante una vista de la lista de páginas de posts agrupadas por el metadato “mes”, tal y como muestra la siguiente imagen:


Para que esta vista de la lista de posts pueda ser utilizada como elemento de navegación de un frame lateral de nuestro “Template Layout” del detalle de un post, lo siguiente que tendremos que hacer es convertir esta “vista” en un “webpart”. Para ello, abrimos SharePoint Designer y abrimos el sitio donde estamos trabajando. Una vez dentro del sitio, vamos a la sección de "List and Libraries" y pulsamos encima de la lista donde hemos creado la visualización que queremos incorporar



Una vez que la página se ha abierto en modo de edición, situamos el puntero del ratón dentro de la zona del webpart de visualización de la lista (por debajo del tag <WebPartPages:XsltListViewWebPart") y en la cinta de acciones, en la pestaña de WEB PART TOOLS, en la sección de "Save Web Part", pulsamos en el icono "To Site Gallery"


En el pop-up, introducimos el nombre del WebPart y pulsamos en el botón de "OK"


Con esto ya tendremos guardada la vista como un WebPart personalizado. El siguiente paso es obtener el código para insertarla en un Snippet.

Para ello tendremos que vovler a SharePoint y en el desplegable de opciones de la rueda dentada de "Settings", seleccionamos "Design Manager"

 
Una vez dentro del Design Manager, tendremos que seleccionar el apartado "6. Edit Page Layouts" y pulsar sobre el nombre del Page Layout que deberíamos haber creado previamente (en caso de tener que crearlo, consultar el procedimiento aquí)

 
Una vez estemos en la Preview Page que nos muestra cómo está quedando nuestro Layout, pulsaremos en el enlace de "Snippets" que veremos en header de la derecha de lpantalla.
 
 
De esta forma hemos accedido a la "Snippet Gallery", donde podemos obtener código de snippets a partir de Web Parts y Page Fields previamente existentes. Como hemos transformado nuestra vista en un WebPart, desde aquí también podremos obtener el código para su snippet.
 
Sin embargo, antes de hacerlo, crearemos una zona de Web Parts donde situar posteriormente el Web Part de la vista de nuestra lista.
 
Para ello, pulsaremos en el botón de "Web Part Zone" que hay en la sección de "Containers", y obtendremos su código en la ventana de "HTLM Snippet", pulsando sobre el botón "Copy to Clipboard".
 
 
Con el código en el portapapeles, volvemos a SharePoint Designer y editamos en él nuestro Page Layout (sección Page Layouts y "Edit File").
 
 
Dentro del código del Page Layout, nos situamos en la zona donde queramos añadir la visualización de la lista, y "pegamos" el código del portapapeles (Snippet de la Web Part Zone).
Debería quedarnos algo como lo siguiente (tras formatearlo correctamente):
 
 
Ahora que ya tenemos nuestra WebPart Zone, vamos a volver a la galería de Snippets, y esta vez sí, seleccionamos en "Other Web Parts" el Web Part que creamos desde nuestra visualización de la lista.
 
 
 Este es el momento para modificar el Web Part resultante a nuestro gusto, retocando los parámetros que queramos en la Zona de configuración del WebPart, como el título del mismo, el "Chrome Type", la URL del título, etc. A mí me pasó que me aceptaba la 1a modificación (pulsando el botón "Update"), pero no una segunda, de manera que al pulsar por segunda vez el "Update" me daba error en la página. Si os pasa esto también, aseguraos de dejar el WebPart perfectamente configurado con un único Update.
 
 
Una vez tengamos el WebPart perfectamente configurado a nuestro gusto, copiamos el código del snippet resultante con el botón "Copy to Clipboard".
 
 
Ahora volvemos a SharePoint Designer, y pegamos el código dentro de la zona de "Web Part Zone" que hemos pegado anteriormente, justo en sustitución de la línea:
"<!--DC: Replace this comment with default web parts for new pages. -->"
Debería quedarnos un código similar al de la siguiente imagen:
 
 
Un paso importante antes de finalizar la edición de la página, es que debemos registrar el Namepace en la cabecera de la misma.
 
Para ello tendremos que seleccionar todo lo contenido en el primer tag "SPM" del código de nuestro WebPart:
 
"<!--SPM:<%@Register Tagprefix="ab9da2256"  Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>-->" 
 
 
Este trozo de código hay que pegarlo de nuevo en la cabecera de la página, justo debajo de los los otros registros (veremos un conjunto de declaraciones "SPM") y antes del
"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"[]>"
 

Nos aseguramos de guardar todos los cambios realizados en el Layout Template.

¡Ahora sí! No ha sido trivial, pero por fín podremos visualizar nuestra "lista" (o vista personalizada de la misma) en todas las páginas creadas a partir del Layout Template que hemos trabajado.

Os dejo una imagen para que veais el resultado que obtuve en el blog que creé ("HISTORY en la zona inferior derecha")

 
¡Misión cumplida! Una lista de SharePoint embebida en una página HTML de Layout Template mediante código snippet. No es una frase con la que vayamos a seducir a nuestra mujer, pero seguro que a muchos les alegra saber que puede hacerse.

¡¡Hasta la próxima!!