SharePoint 2013. Representaciones de imágenes

SharePoint 2013 viene con una nueva funcionalidad que nos ayuda a optimizar la entrega de imágenes, manteniendo en caché una versión optimizada de la misma en diferentes tamaños. Esto es, si subimos una imagen de 2000×1500 y en nuestro sitio mostramos una imagen de 800×600, tan solo con definir esta representación y especificar que la usa cuando insertamos la imagen en la página, SharePoint se encarga de generar un imagen en cache, de ese tamaño y usarla en los casos que sea requerido.

Activación de las representaciones

La primera vez que accedemos a la página de configuración de Representaciones de imágenes, en la Configuración del sitio, no encontramos con el mensaje siguiente:

 

Para que la representación de imágenes (o Image Rendition) se active, tenemos que habilitar primero la caché de objetos binarios en la aplicación web. Esto no es más que poner a true y revisar la siguiente entrada del fichero de configuración, web.config.

 

Edición de una representación

Una vez que hemos habilitado la cache y tenemos activa las representaciones de imágenes, podemos editar, para cada una de las imágenes del sitio cuál va a ser su representación. Esto es, para la representación Plantilla de visualización de Imagen de 3 líneas podemos elegir redimensionar la imagen a las dimensiones esperadas o que se represente una porción de la imagen que tenga ese tamaño.

 

Esta opción la tenemos en cada una de las imágenes de una biblioteca

 

y podemos hacer uso de ella cuando insertamos una imagen en el contenido de una página

 

Sin hacer muchos esfuerzos, vamos a poder mejorar sustancialmente el rendimiento de nuestros sitios web, entregando en cada página, los tamaños de imágenes precisos. Una pequeña funcionalidad, que también funciona para archivos de Video, que se suma a todas las funcionalidades que tenemos para publicar nuestros sitios web en SharePoint.

 

Saludos a todos…

Webcast. SharePoint sin rodeos, hablemos de sitios públicos en SharePoint 2013

 

Es mi turno en la serie de Webcasts de AvePoint y SUGES sobre SharePoint, y hablaremos sobre Sitios públicos en SharePoint 2013. SharePoint 2013 nos ofrece cada vez más y mejores funcionalidades para construir nuestros sitios web. Junto a Roberto Vázquez hablaremos de la navegación administrada, el nuevo Web Part de búsqueda de contenido y otras funcionalidades importantes para la gestión de contenido y como objetivo fundamental tendremos el consolidar la presencia tanto interna como externa para la organización sobre una plataforma – incluyendo las seguridades, procesos y governance – a través de SharePoint.

Será este 6 de Junio a las 14:00 (GTM), regístrate en https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032550333&Culture=es-ES&community=0

 

SharePoint 2013. ¿Cómo descargo SkyDrive Pro?

Hace unos días en adejetec, un evento de tecnología en Tenerife, hablábamos sobre las nuevas y viejas características de Office 365. Entre todas, destacó SkyDrive Pro, una vieja necesidad para SharePoint que en la última versión se ha hecho realidad.

La duda surgió cuando nos fuimos a SkyDrive en un SharePoint y no teníamos la opción de sincronizar, ¿no debería de haber salido un asistente de instalación de SkyDrive Pro? Pues al parecer no, SkyDrive Pro, de momento, hay que instalarlo antes de poder sincronizar desde SharePoint.

Nos ponemos a la búsqueda y no encontrábamos el cliente de SkyDrive Pro por ningún sitio en Microsoft.com, y lo dimos por perdido, conociendo que la instalación se realiza con el despliegue de Office 2013, pero ¿qué pasa si mi suscripción de Office 365 no tiene la licencia de Office?

Seguimos buscando en el portal de Office 365, en el software a descargar y tampoco, no aparece por ningún lado. Tuvimos que desistir, aunque parece que nos han escuchado. Ayer se publicó la instalación stand-alone del cliente de SkyDrive Pro, para aquellos que no tienen licencia de Office 2013 y quieren sincronizar SharePoint.

Resumiendo, dos métodos para instalar SkyDrive Pro:

 

Saludos a todos…

SharePoint App. Aplicaciones multi-idioma

Ahora que estamos pensando en publicar nuestras Apps en la tienda de SharePoint, es muy importante tener en cuenta la globalización de la tienda y que nuestra App debería de soportar múltiples idiomas. La idea es que podamos llegar a un mayor número de usuarios-empresas y por eso esta recomendación.

Básicamente, tenemos que localizar con recursos los tres elementos básicos que podemos implementar, Elementos de SharePoint (listas, tipos de contenido, App Parts, etc), el HTML y JavaScript, y nuestro code-behind, si lo tuviésemos.

Elementos de SharePoint

Primero nos toca definir, en el AppManifest, los idiomas soportados. Aquí hay que tener en cuenta los idiomas soportados en la tienda, por ejemplo, Spanish (es) no está soportado, hay que usar Spanish-Spain (es-ES).

 

Automáticamente, se nos creará en nuestro proyecto, los ficheros de recursos necesarios para la localización de los literales que necesitemos, y al igual que en un proyecto de SharePoint tradicional, si queremos localizar el título de la definición de una lista, haremos lo siguiente:

<?xml version="1.0" encoding="utf-8"?>


<Elements xmlns="http://schemas.microsoft.com/sharepoint/">


<ListInstance


Title="$Resources:ClientesList_Title"


OnQuickLaunch="TRUE"


TemplateType="10000"


Url="Lists/Clientes"


Description="$Resources:ClientesList_Description">


</ListInstance>


</Elements>


 

HTML y JavaScript

Aquí podemos trabajar con diversas técnicas que nos permita la localización, como de una aplicación normal se tratara, de los contenidos. Principalmente, hay que tener en cuenta, que en el querystring de nuestra App, tenemos una variable, SPLanguage, que nos define el idioma del usuario en SharePoint. Lo ideal sería leer esa variable y añadir el fichero de recursos que le corresponda a ese idioma. Os recomiendo este artículo de Olivier Carpentier que os muestra cómo hacerlo, más o menos como sigue:


var defaultLanguage = ‘en-us’;
var languagesArray = [‘en-us’, ‘fr-fr’];

// Función para leer las querystring de la url.
function getUrlVars() {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf(‘?’) + 1).split(‘&’);
    for (var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split(‘=’);
        vars.push(hash[0]);
        vars[hash[0]] = decodeURIComponent(hash[1]);
    }
    return vars;
}

// Obtenemos la variable SPLanguage
var queryString = getUrlVars();
var language = queryString[«SPLanguage»];
if (language == null)
{
    language = defaultLanguage;
}
else
{
    language = language.toLowerCase();
    var langExists = false;

    //Comprobamos si existe en los disponibles
    for (var i = 0; i < languagesArray.length; i++) {
        var testedLang = languagesArray[i];
        if (testedLang == language) {
            langExists = true;
            break;
        }
    }

    //Obtenemos el idioma de la región
    if (langExists == false) {
        var regionalLng = language.substring(0, 2);
        for (var i = 0; i < languagesArray.length; i++) {
            var testedLang = languagesArray[i].substring(0, 2);
            if (testedLang == regionalLng) {
                langExists = true;
                language = languagesArray[i];
                break;
            }
        }
    }

    //Si no existe, usamos el idioma definido por defecto
    if (langExists == false) {
        language = defaultLanguage;
    }
}
// Insertamos el script correspondiente al idioma
var resourcesFile = ‘../Scripts/Resources.’ + language + ‘.js’;
document.writeln(«<script src=«« + resourcesFile + «« type=«text/javascript« language=«javascript«></script>»)

Con esto, sólo tenemos que usar jQuery para poner la localización adecuada en cada caso.

Code-Behind

En este caso, vamos a poder usar cualquier tipo de localización que nos permite el lenguaje de desarrollo que usemos, ya que podemos usar este método para la Provider-hosted como para las Autohosted. Por ejemplo, si tenemos una Autohosted, lo normal es usar ficheros de recursos en ASP.NET y que cambiemos la cultura actual de la ejecución por la que nos viene en la querystring.

protected override void InitializeCulture()

{

if (Request.QueryString[«SPLanguage»] != null)

{

string selectedLanguage = Request.QueryString[«SPLanguage»];

UICulture = selectedLanguage;

Culture = selectedLanguage;

 

Thread.CurrentThread.CurrentCulture =

CultureInfo.CreateSpecificCulture(selectedLanguage);

Thread.CurrentThread.CurrentUICulture = new

CultureInfo(selectedLanguage);

}

base.InitializeCulture();

}

Para probar en múltiples idiomas, os recomiendo crearos un sitio de desarrollo en el idioma a probar y listo, depuramos o desplegamos nuestra App en este.

Tenéis más información sobre localización de SharePoint Apps en la MSDN

Si cuando desarrollamos una App para Windows Phone o Windows Store, os recomendamos localizarla a todos los idiomas posibles, o como mínimo, a español e inglés, con las SharePoint Apps es aún más importante. Pensemos en la cantidad de usuarios-empresas repartidos por el mundo que pueden ver nuestra App en la tienda y que son susceptibles de adquirirla si la entienden y está en un idioma conocido.

 

Saludos a todos…

Office Store, ¿Una tienda de futuro?

Este fin de semana pasado, los grupos de usuarios de SharePoint de España, realizamos, casi en simultáneo en Madrid, Barcelona y Valencia, tres hackathon relacionados con el primer Office and SharePoint Challenge, que organiza Microsoft a nivel mundial. La idea era tener unas jornadas de formación sobre el nuevo modelo de desarrollo de Apps para SharePoint y Office, y empezar a desarrollar Apps para un concurso que elegirá a las 5 mejores para salir en Channel 9.

Lo primero de todo, agradecer a LevaPoint, y en especial a Adrián Díaz, por encargarse de la organización en Valencia y encargarse de mi ?, con un anfitrión así, me apunto a cualquier evento o sarao que se organice por Valencia, inclusive, si queremos llenar Mestalla de desarrolladores.

Después de la formación y las horas de desarrollo, empezamos con la ronda de presentación de proyectos, y es aquí donde os quiero hacer reflexionar. Cuando hablamos de la Office Store ¿en qué pensamos? Yo después de ver los proyectos de Valencia, tengo muchos conceptos y se me ha abierto la mente a proyectos que no me planteaba en la tienda. Llevo un par de días de vacaciones por Valencia, y no hago sino darle vueltas a los siguientes tipos de Apps:

  • Aplicaciones empresariales que buscan mejorar SharePoint, o proveer a la plataforma de funcionalidades que no tiene
  • Aplicaciones empresariales que utilizan la seguridad de SharePoint y a este como concentrador de aplicaciones
  • Pequeñas funcionalidades o AddIn para Office o SharePoint, que pueden ser empresariales o no, pensemos que la tienda también llega a usuarios no empresariales
  • Aplicaciones de marketing empresarial, estas son las típicas que desarrollamos para Smartphone y que, sin quererlo, el sábado apareció una. ¿Por qué no utilizar una tienda empresarial para promocionar productos empresariales o funcionalidades de este tipo?

Personalmente, apuesto por la tienda de Office, creo que como desarrolladores, o empresa de desarrollo, nos puede dar muchas ventas y visibilidad en grandes empresas, que no se planteen comprar en la tienda, nos puedan contactar porque mes gusta nuestro producto.

 

¿Qué os parece la tienda? ¿Os proponéis publicar alguna App?

SharePoint App. Llamada a un servicio externo con WebProxy

Preparando el Office & SharePoint App Challenge que tenemos la próxima semana y aprovechando que queremos que CompartiMOSS tenga una SharePoint App en la Store, empezamos con el desarrollo de esta App, aprovechando los servicios REST de SharePoint 2013.

CompartiMOSS App tiene que usar la API de búsqueda para mostrar los números y los artículos, además de permitir buscar el contenido de estos, más o menos, como se hacemos en la web, pero dentro de una App.

¿Fácil no? Básicamente, tenemos que usar jQuery para hacer la llamada al servicio REST, en la siguiente URL http://host/site/_api/search y parsear la información, para mostrarla con los estilos de CompartiMOSS. Algo como:

    $.ajax(

        {

            url: http://host/_api/search/query?querytext='sharepoint',


            method: «GET»,

            headers:

            {

                «accept»«application/json;odata=verbose»,

            },

            success: onSuccess,

            error: onError

        }

 

        function onSuccess() {           


            var results = data.d.query.PrimaryQueryResult.RelevantResults.Table.Rows.results;


   

            var html = "<div class='results'>";


            for (var i = 0; i < results.length; i++)


            {


                html += "<div>";


                var clickableLink = "<a href='" + results[i].Cells.results[6].Value + "'>" 


    + results[i].Cells.results[3].Value + "</a><br/><span>Type: " + results[i].Cells.results[17].Value  + "</span><br/>";


                html += clickableLink;


                html += "</div>";


            }


   

            html += "</div>";


            $("#searchResults").html(html);


        }


 

Error. Gracias a nuestro queridísimo Javascript, nos encontramos con un problema conocido y muy habitual de llamadas en cross-domain. Nuestra App, que se ejecutará en el dominio de nuestro SharePoint, no permite las llamadas Javascript a un dominio externo, como el de CompartiMOSS.

MDSN y JC al rescate. Hablando con Juan Carlos y Fabian, descubrimos en la MSDN que en la API de SharePoint 2013, hay un objeto WebProxy que permite, a las SharePoint Apps, realizar llamadas cross-domain de una forma bastante sencilla. Con estos cambios:

        var context = SP.ClientContext.get_current();


        var request = new SP.WebRequestInfo();


        request.set_url("http://host/_api/search/query?querytext='sharepoint'");


        request.set_method("GET");


        request.set_headers({ "Accept""application/json;odata=verbose" });


        var response = SP.WebProxy.invoke(context, request);


        context.executeQueryAsync(successHandler, errorHandler);


 

No realizamos la llamada Ajax, sino que le pasamos la petición al WebProxy de SharePoint, que es el encargado de realizar la llamada asíncrona y devolvernos el resultado.

    function successHandler() {


        if (SPSearchResults.response.get_statusCode() == 200) {


            var body = JSON.parse(SPSearchResults.response.get_body());


            var results = body.d.query.PrimaryQueryResult.RelevantResults.Table.Rows.results;


 

            var html = "<div class='results'>";


 

            for (var i = 0; i < results.length; i++) {


                var linkUrl = results[i].Cells.results[4].Value;


                var title = results[i].Cells.results[5].Value;


                var desc = results[i].Cells.results[6].Value;


                var picture = results[i].Cells.results[2].Value;


 

                html += "<div class='divCompartiMOSSMagazineNumber' id='Number" + i + "'>";


                html += "<div class='divPicture'>";


                html += "<a href='" + linkUrl + "'>" + picture + "</a>";


                html += "</div>";


                html += "<div class='divOverlay'>";


                html += "<a class='linkOverlay' href='" + linkUrl + "'>";


                html += "<h2 class='ms-noWrap'>" + title + "</h2>";


                html += "<div>" + desc + "</div>";


                html += "</a>";


                html += "</div>";


                html += "</div>";


            }


 

            html += "</div>";


            $("#searchResults").html(html);


            $(".divCompartiMOSSMagazineNumber").hover(


                function () {


                    $(".divOverlay"this).css('top''0');


                },


                function () {


                    $(".divOverlay"this).css('top''300px');


                });


        }


        else {


            var errordesc;


 

            errordesc = "<P>Status code: " +


                SPSearchResults.response.get_statusCode() + "<br/>";


            errordesc += SPSearchResults.response.get_body();


            $("#searchResults").html(errordesc);


        }


    }


 

y junto con un poco de maquillaje css, obtener el resultado deseado:

 

Una vez más se demuestra que SharePoint es una gran plataforma y que incluye diversas funcionalidades que nos facilitan la vida a los desarrolladores.

 

Saludos a todos…

CEUS VIII. 8ª Conferencia de Usuarios de SharePoint

Ya tenemos SharePoint 2013 y como todos los años, también tenemos Conferencia de Usuarios de SharePoint, con mucho más contenido que otros años, centrándose en la nueva versión y en todas las novedades que esta nos trae.

 

Cuatro tracks que nos os podéis perder, donde clientes, expertos en SharePoint y MVP os enseñarán todas las bondades de nuestro servidor favorito (le robo la frase a JC).

  • Colaboración y comunicación
  • Social Enterprise
  • Digital Market Internet
  • Big Data, Business Analytics

Será el martes 9 de abril en el Teatro Goya y os podéis registrar en el siguiente enlace.

Este año, me ha tocado dar una sesión sobre las SharePoint Apps y la Office Store, donde os contaré las novedades y la gran oportunidad que se nos abre con la tienda de aplicaciones.

 

Saludos a todos…

Webcast. Materiales de SharePoint Apps, nuevo modelo de desarrollo, nueva tienda de aplicaciones

El martes 26 de marzo, estuvimos hablando del nuevo modelo de desarrollo de Apps en SharePoint, una hora y media en la que vimos los distintos tipos de Apps que podemos desarrollar y cómo podemos monetizarlas utilizando la SharePoint Store.

 

En el repositorio de SUGES, podéis encontrar la presentación y la grabación del Webcast.

Apps, Apps, Apps. El mes de los Hackathon

El mundo de las Apps está en auge y los sistemas operativos de móviles, Tablets o PCs necesitan de estas para ganar y fidelizar a sus usuarios. Cuando un usuario se plantea comprar un móvil o una Tablet, no pregunta por la memoria ni el procesador, se preocupa por aquellas aplicaciones que para él son fundamentales y que deben de estar en la plataforma.

Microsoft no se puede quedar atrás, y está haciendo un gran esfuerzo para que sus tiendas de aplicaciones consigan ese número de aplicaciones necesarias, sin perder de vista la calidad de las mismas, y por esto, tenemos el Megathon.

El Megathon es un evento, organizado por Microsoft junto a los grupos de usuarios de varias ciudades, que se transforma un hackathon multi-ciudad, junto con mucha formación online previa al mismo.

 

Los mejores organizadores de eventos, juntos a los mejores mentores en Windows Phone, Windows 8, Azure y TFS, en las siguientes ciudades el 12, 13 y 14 de abril:

Pero aquí no se queda la cosa J Ha nacido una estrella una nueva tienda de aplicaciones, la Office Store. Los usuarios de la Office Store esperan aplicaciones de negocio que mejoran las funcionalidades de Word, Excel y sobre todo, SharePoint. Sí, tenemos tienda de aplicaciones para SharePoint, con un potencial de más de 1 billón de usuarios empresariales con alcance global. Y cómo no podíamos ser menos, también tenemos Hackathon de SharePoint Apps apoyadas o no en Windows Azure.

¿Windows Azure? Sí, el modelo de desarrollo de las Apps de SharePoint (tenemos varios webcast, uno esta tarde, sobre este tema) nos permite desplegar nuestras Apps de SharePoint en Windows Azure, con lo que se nos abre un gran mundo de posibilidades para los desarrolladores de SharePoint o los que no lo son y quieren poner sus Apps en la plataforma.

 

Las ciudades elegidas para este Hackathon son:

 

¿Os podemos ofrecer más? Un mundo de posibilidades y tres tiendas en las que vender vuestras ideas.

 

Saludos a todos…

SharePoint 2013. Depurando un Remote Event Receiver

Si leemos al amigo Juan Carlos, o a otros compañeros que escribimos sobre SharePoint, en la nueva versión tenemos un concepto nuevo llamado Remote Event Receiver o Manejador de Eventos Remotos. Con la versión Preview de las herramientas de desarrollo, no teníamos forma de depurarlos, salvo que nos creáramos ciertos workaround que han salido para ello. Ahora que tenemos la versión RTM de las herramientas de desarrollo, han añadido la posibilidad de depurar estos eventos, casi sin ningún problema. Os explico cómo.

Lo primero es crearnos un proyecto de SharePoint App, en modo Auto-hosted, que desplegaremos en un SharePoint Online de desarrollo.

 

Añadimos una lista a nuestra App y un manejador de eventos remotos (RER) que se encargará de gestionar los eventos de esta lista.

 

Ahora viene lo nuevo, en las propiedades del proyecto de la SharePoint App, tenemos una sección para SharePoint en la que se ha habilitado la posibilidad de proveer de un Widnows Azure Service Bus connection string que utilizará sólo para depuración.

 

Con lo que tenemos que irnos al portal de Windows Azure y crear un Service Bus para la depuración, copiar la Cadena de Conexión del administrador de acceso y ponerlo en las propiedades del proyecto, activando la depuración remota.

 

Con esto, sólo tenemos que poner un breakpoint y depurar nuestro proyecto para ver que se produce la magia de Azure.

 

Un pequeño paso para las Apps y un gran avance para los desarrolladores, que ya no sabemos vivir sin un depurador en condiciones.

 

Saludos a todos…