jueves, 26 de septiembre de 2013

SP2010: Error en WF

Hoy estaba comprobando como un workflow de SP 2010 que creé en SharePoint Designer 2013 para una granja de SharePoint 2013 estaba dando continuamente error.

En la lista de historial del flujo de trabajo tan solo veía un mensaje así:

"Flujo de trabajo cancelado   Cuenta del sistema   Cuenta del sistema ha cancelado el flujo de trabajo (nombre del flujo)"
"Error   Cuenta del sistema   No se ha podido iniciar (nombre del flujo)"

Me extrañó muchísimo porque el flujo siempre había estado funcionando perfectamente hasta entonces, así que miré en el log de SharePoint, donde encontré un mensaje que empezaba tal que así:

"RunWorkflow: System.ArgumentNullException: Array cannot be null.  Parameter name: bytes     at System.Text.Encoding.GetString(Byte[] bytes)..."

Estuve volviéndome loco un rato hasta que, como suele pasar, google me dio la solución.

Efectivamente, había estado haciendo un retoque en el flujo con el Designer y modifiqué manualmente el archivo ".xoml" del mismo... y lo dejé "check out". Vale, fue un descuido, pero el error que da el flujo tampoco es muy explícito...

Se soluciona haciendo un check in del .xoml y todo vuelve a funcionar sin problemas.

Si esta entrada sirve para que alguien más no se vuelva loco, me quedaré muy contento.

¡Salud!

miércoles, 11 de septiembre de 2013

SP2013: Ocultar elementos según rol (permisos) de usuario

Otra cosa que suelen demandar los clientes es que determinadas zonas de la pantalla no se vean para determinados usuarios, según el rol de permisos que estos tengan.

Por ejemplo, que la rueda dentada de configuración (antes "Acciones del Sitio"), solo la puedan visualizar los Administradores del Site, pero no los usuarios colaboradores del mismo.

¿Cómo se consigue esto? Con la instrucción SPSecurityTrimmedControl podremos hacerlo fácilmente. Tan solo hay que editar la página que contenga la zona a ocultar (con SharePoint Designer, por ejemplo), e incluir dicha zona dentro de la siguientes líneas de código:

 <Sharepoint:SPSecurityTrimmedControl runat="server" PermissionsString="ManageWeb">
 (...Código HTML...)
 </SharePoint:SPSecurityTrimmedControl>

Con esto conseguiremos que tan solo los usuarios con el nivel de permisos de "Manage Web", vean lo que hay en medio del código.

El parámetro PermissionsString es el que marca el nivel de permisos que ha de tener el usuario para visualizar el código que estamos acotando. Si queréis saber cuales son los posibles valores para este parámetro, consultad este listado. (recomiendo que lo consultéis, porque no es tan evidente, si por ejemplo ponéis "FullControl" no funciona, ha de ser "FullMask")

Si, por ejemplo lo introducimos en la masterpage del site, justo entre el control de "siteactiontd":

<Sharepoint:SPSecurityTrimmedControl runat="server" PermissionsString="FullMask">
<span class="ms-siteactions-root" id="siteactiontd" >
...
</SharePoint:SiteActions></span>
</SharePoint:SPSecurityTrimmedControl>

Conseguiremos que los Administradores (Full Control) vean esto:



Pero el resto de roles, solo vean esto:

¡¡Muy útil!! ¿No? :-D

SP 2013: Ocultar botones de la cinta de acciones (Ribbon) mediante CSS.

Quien ha tenido un cliente en un proyecto de SharePoint, sin duda habrá tenido algún requerimiento del tipo: "Ese botón no lo debería ver el usuario. ¿Se puede ocultar?". La respuesta, siempre es la misma: "Todo se puede, pero todo tiene un coste...". Afortunadamente para todos, en SharePoint 2013 el coste de este tipo de personalizaciones es mínimo, ya que puede ocultarse cualquier botón o sección de la cinta de acciones (Ribbon) de forma muy rápida y sencilla.

De hecho, existen diversos métodos para ocultar dichos botones: programáticamente, mediante jquery en CEWP... pero el que expondré hoy aquí es el más sencillo de todos y rápido de ejecutar:

Vamos a ocultar, por ejemplo, el botón de "Ver todas las páginas" que hay en la sección "Biblioteca de páginas" de la pestaña "Página".

Primero vamos a necesitar obtener el ID del botón o sección de la Ribbon que queremos ocultar. Esto lo conseguiremos con las developer tools de IE o Firefox. Para el ejemplo me baso en IE 10. En IE hay que pulsar F12 para que estas aparezcan. Una vez las tengamos activadas, tenemos que seleccionar el botón en questión (hay que pulsar previamente el botón del icono del puntero de ratón en la pestaña HTML). Al seleccionarlo veremos que en el editor se nos abre el código HTML del botón. Tendremos que subir hasta el atributo <a y apuntar bien el ID que nos ofrece. En este caso, como se aprecia en la siguiente imagen, el ID del botón es "Ribbon.WikiPageTab.LibrarySettings.ViewAllPages-Large"


Ahora solo tendremos que abrir el fichero CSS que deberíamos tener personalizado para nuestro site (con SharePoint Designer, por ejemplo). Habitualmente el fichero estará en "\Style Library\CSS"

En caso de no tener un CSS personalizado (vamos hombre, todos los clientes quieren personalizar algo del Look&Feel!!) tendríamos que crearlo y vincularlo desde nuestra masterpage con una línea dentro del "head" del tipo:
<SharePoint:CssRegistration name="/Style Library/CSS/OurCustomCSS.css" runat="server" after="SharepointCssFile" />
Una vez estemos editando nuestro CSS personalizado, tan solo tendremos que añadir una entrada para el ID del botón que hemos apuntado, teniendo en cuenta que hay que insertar una contrabarra antes de cada punto del ID. El código completo sería así:

#Ribbon\.WikiPageTab\.LibrarySettings\.ViewAllPages-Large {
 display:none;
}
Al guardar correctamente el CSS (recordar hacer "check in" y guardarlo como "versión principal"). El botón ya no debería aparecer más allá donde tengamos aplicado nuestro CSS.


¡¡Adiós botones "molestos" que nadie quiere!! :-D