SharePoint 2010 y ECMAScript

Actualización 21/03/2011: aplicados comentarios en el código de hollyshit del 16/03/2011.

Una de las novedades que incoporó la versión 2010 de SharePoint a nivel de desarrollo es el modelo de objetos de cliente. Hasta ahora, si queríamos interactuar con elementos de nuestro servidor de manera remota la única opción que teníamos era acceder a los servicios web que éste proporcionaba. Ahora, además de esta opción tenemos otras cuatro alternativas:

  • Modelo de objetos de cliente .NET
  • Modelo de objetos de cliente Silverlight
  • Modelo de objetos de cliente ECMAScript
  • Servicios REST

Cada una de estas alternativas nos proporciona unas ventajas concretas en función de lo que necesitemos desarrollar. En este artículo os quiero hablar, con un ejemplo concreto, de una de estas cuatro alternativas: ECMAScript. Antes de entrar en materia, algunas consideraciones. Lo que vais a ver a continuación es, mayormente, código javascript y, en algunas ocasiones, puede provocar reacciones contrarias a la hora de utilizarlo. Como todo, tiene sus ventajas y sus inconvenientes, pero el hecho que Microsoft haya incluído esta posibilidad en esta versión de SharePoint hace que, cuando menos, tenga que ser considerada como una de las opciones que tenemos a la hora de desarrollar. Si os planteáis utilizar este método para un desarrollo, pensad primero en las características de vuestro escenario y valorad si os conviene utilizarlo. Para mí, el uso de ECMAScript ofrece una serie de ventajas respecto al desarrollo convencional. La principal de esas ventajas es el despliegue de las funcionalidades. Lo único que necesitamos es escribir código HTML que podría incluso incluirse en un elemento web editor de contenidos. Si pensamos, sobretodo, en escenarios donde el despligue de elementos en el servidor es complejo esta posibilidad se hace especialmente interesante.

Vayamos con el ejemplo: imaginad que queremos mostrar los elementos de una lista en una página de SharePoint y, a su vez, permitir que los usuarios añadan nuevos elementos a dicha lista y que no se produzcan refrescos innecesarios de la página. Para realizar este ejemplo necesitaremos crear un sitio con una lista que llamaremos Actividades. Además, en alguna página del sitio como, por ejemplo, la página de inicio, incluiremos un elemento web consulta de contenido, editaremos su contenido y escribiremos, por ejemplo, el siguiente código HTML.

<input id="txtActividad" type="text" class="new-activity-textbox" />

<input id="btEnviar" type="button" class="new-activity-button" value="enviar" />

 

<ul class="activities">

 

</ul>

Ahora tenemos que incluir la interactividad necesaria para que, cuando el usuario pulse el botón del ejemplo, se cree un nuevo elemento en la lista Actividades con el texto introducido por el usuario. Para hacer esto se os pueden ocurrir muchas maneras y, en este caso, yo he optado por utilizar JQuery (tened en cuenta que deberéis incluir la referencia al js de JQuery en vuestra página maestra o en vuestra página de aplicación). Editamos el código anterior e incluimos esto al inicio.

<script language="ecmascript" type="text/ecmascript">   1: 

    $(document).ready(function() {

        $(function() {

            $('#btEnviar').click(function() {

                var text = $('input#txtActividad').val();

                CreateElement(text);

            });

        });

    });

 

    function CreateElement(text) {

    }

Hasta aquí sólo hemos visto HTML y JQuery, nada de SharePoint. Evidentemente nos falta una parte del código que es aquella que tiene que permitir crear un elemento en una lista. Editamos el código anterior y, cambiamos la función CreateElement por lo siguiente:

function CreateElement(text) {

    context = new SP.ClientContext.get_current();

    web = context.get_web();

    var list = web.get_lists().getByTitle("Actividades");

    var itemCreateInfo = new SP.ListItemCreationInformation(); 

    listItem = list.addItem(itemCreateInfo); 

    listItem.set_item('Title', text); 

    listItem.update(); 

 

    context.load(listItem); 

    context.load(list); 

 

    context.executeQueryAsync(CreateElementSuccess, FailureCallback); 

}

Si estáis familiarizados con el desarrollo sobre SharePoint, veréis que hay bastantes similitudes entre el modelo de objetos de cliente y el modelo de objetos de servidor. Básicamente se obtiene el contexto, de ahí se extrae la referencia al sitio, se consulta una lista y, finalmente, se añade un nuevo elemento a dicha lista. Las diferencias vienen al final, ya que usando el modelo de objetos de cliente la llamada se hace de manera asíncrona. Para nuestra fortuna, podemos indicar qué método delegado será invocado en el momento en que la llamada devuelva algún resultado. En nuestro caso, llegado el momento tendríamos que volver a consultar los elementos de la lista y modificar el código HTML de la página sin hacer ningún refresco. Eso lo conseguimos con el siguiente código:

function CreateElementSuccess(sender, args) {

    var list = web.get_lists().getByTitle('Activity');

 

    var query = '<View>'+

                    '<Query>'+

                        '<OrderBy>'+

                            '<FieldRef Name="Created" Ascending="False"/>'+

                        '</OrderBy>'+

                    '</Query>'+

                 '</View>';

             

    var camlQuery = new SP.CamlQuery();

    camlQuery.set_viewXml(query);

 

    activitiesCollection = list.getItems(camlQuery);

    context.load(activitiesCollection , 'Include(Title)');

    context.executeQueryAsync(GetActivitiesSuccess, QueryFailure);

}

 

function GetActivitiesSuccess(sender, args) {

    var listItemEnumerator = activitiesCollection.getEnumerator();

 

    $('ul.activities').children().remove();

 

    while (listItemEnumerator.moveNext()) {

        var oListItem = listItemEnumerator.get_current();

        $('ul.activities').append("<li>" + oListItem.get_item('Title') + "</li>");

    }

}

 

function FailureCallback(sender, args) {

    alert('request failed ' + args.get_message() + 'n' + args.get_stackTrace());  

}

En resumen, esto ha sido sólo un ejemplo de qué tipo de cosas podemos hacer con ECMAScript. Si tenéis interés en que amplie algún punto concreto no dudéis en añadir un comentario a este artículo.

2 comentarios en “SharePoint 2010 y ECMAScript”

  1. Hola,

    He esto revisando este ejemplo y lo he implementado, y comentarte que así tal cual está puesto no funciona.

    De inicio el jquery da error:

    $(document).ready(function { lo he cambiado por $(document).ready(function() {

    He cambiado alguna cosa como la primera función de jquery dejándola:

    $(function() {
    $(‘#btEnviar’).click(function()
    {
    var text = $(‘input#txtActividad’).val();
    CreateElement(text);
    });
    });

    Con esto he conseguido pasar a la siguiente función, donde el nombre de la lista está en inglés; así que en vez de llamarse “Actividades” se llama “Activity”.

    La creación del item en la lista ha funcionado, yo lo creo en un campo que se llama Actividad.

    Pero esta línea está mal: context.executeQueryAsync(CreateElementSuccess, QueryFailure); porque la función QueryFailure no existe, lo he cambiado por la que sí existe: FailureCallback

    Además esta linea $(‘ul.group-activity-container’), también esta mal, lo correcto es: $(‘ul.activities’)

    Creo que eso es todo, no se si me dejo algo, con los cambios que he metido funciona… Muy util!

    Gracias

  2. Hola,

    gracias por todos tus comentarios. Esto me pasa por coger un código funcionando y cambiar algunas cosillas directamente en el post para hacerlo más “simple” :D. Prometo modificar el post para dejarlo funcionando según tus indicaciones.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *