SharePoint 2010. Validación en encuestas

Una de las mejoras que SharePoint 2010 nos ofrece a nivel de listas, es la posibilidad de incluir validaciones de la información que los usuarios introducen. Esta lógica de validación se podría realizar a nivel de elemento de lista, por ejemplo, validar que una fecha siempre es superior a otra, o a nivel de columna, por ejemplo, que el valor de una fecha sea superior al día actual.

Las listas de encuestas, son un tipo especial de lista que permite crear preguntas y añadir lógica de bifurcación en función de las respuestas de los usuarios.

sharepoint2010_surveys_1

Aunque me parece un gran olvido, estas listas no permiten la validación de la listas, sólo nos muestra los campos Creado y Modificado para crear la fórmula de validación, y no el resto de campos de la encuesta. En las columnas pasaría más de lo mismo, no tenemos la opción de configurar la fórmula de validación.

sharepoint2010_suvery_2

¿Y qué opciones de validación tenemos para este tipo de lista?

Las opciones que tenemos son las mismas que teníamos con SharePoint 2010, desarrollar un Event Receiver que, desde el lado del servidor, valide la información de los campos del elemento de la lista, o modificar los formularios de la encuesta e incluir validación del lado del cliente utilizando JavaScript.

Event Receiver

Para crearnos un Event Receiver tenemos un proyecto de Visual Studio 2010 que nos permite implementar la clase que sobrescribe los métodos necesarios para la lista. Cuidado con esto porque si no configuramos bien el receiver, podemos incluir esta funcionalidad a todas las listas de una plantilla determinada. Por ejemplo, vamos a sobrescribir el método ItemAdding (cuando se está agregando un elemento a la encuesta) para comprobar que la suma de todos los campos de la encuesta es 35.

/// <summary>

/// List Item Events

/// </summary>

public class LimitEventReceiver : SPItemEventReceiver

{

   /// <summary>

   /// An item is being added.

   /// </summary>

   public override void ItemAdding(SPItemEventProperties properties)

   {

       int score = 0;

       SPList MySurvey = properties.Web.Lists[properties.ListId];

 

       foreach (SPField item in MySurvey.Fields)

       {

           if (item.TypeAsString == "GridChoice")

           {

               score += ResponceScore(properties.AfterProperties[item.InternalName].ToString());

           }

       }

 

       if (score != 35)

       {

           StringBuilder body = new StringBuilder();

           body.Append("La valoración de la encuesta no llega a 35. El valor actual es ");

           body.Append(score.ToString());

           body.Append("nn");

           body.Append("Por favor, revise las respuestas de su encuesta para que llegue al valor solicitado.");

 

           properties.ErrorMessage = body.ToString();

           properties.Cancel = true;

       }

   }

 

   private int ResponceScore(string expr)

   {

       String[] numbers = System.Text.RegularExpressions.Regex.Split(expr, @"[#+#]");

       int total = 0;

       foreach (String number in numbers)

       {

           if (number != "")

           {

               int num = 0;

               int.TryParse(number, out num);

 

               total += num;

           }

       }

       return total;

   }

 

}

El problema de este tipo de validación es que se realizan en el lado del servidor, y la experiencia del usuario que recibe un error no es muy buena, ya que parece que se ha producido una excepción grave en el sistema y tampoco le permite volver atrás y corregir los errores en el formulario de alta.

JavaScript

La mejor opción, aunque no sea muy partidario de incluir código JavaScript en los formularios de SharePoint, es modificar el formulario de alta (NewForm.aspx) con el SharePoint Designer (acordaros de editarlo en modo avanzado) y incluir esa misma validación pero en el lado del navegador, sin necesidad de realizar un postback al servidor. Con esta validación mejoramos sustancialmente la experiencia del usuario, que, en el mismo formulario, le avisamos que no ha rellanado correctamente la encuesta y que tiene la posibilidad de corregirla.

<asp:Content ContentPlaceHolderId="PlaceHolderAdditionalPageHead" runat="server">

    <SharePoint:UIVersionedContent UIVersion="4" runat="server"><ContentTemplate>

        <SharePoint:CssRegistration Name="forms.css" runat="server"/>

    </ContentTemplate></SharePoint:UIVersionedContent>

    <script type="text/javascript" src="/Style Library/jQuery/jquery-1.4.2.min.js"></script>
   1:  

   2:     <script type="text/javascript">

   3:         var cuenta = 0;

   4:         function PreSaveAction() {

   5:             SP.UI.Status.removeAllStatus(true);

   6:             $("#mensajeError").html("");

   7:             $("#mensajeError").hide();

   8:             

   9:             cuenta = 0;

  10:             $("form input[type='radio']:checked").each(function() {

  11:                 if ($(this).val() == "ctl00")

  12:                     cuenta = cuenta + 1;    

  13:                 if ($(this).val() == "ctl01")

  14:                     cuenta = cuenta + 2;    

  15:                 if ($(this).val() == "ctl02")

  16:                     cuenta = cuenta + 3;    

  17:                 if ($(this).val() == "ctl03")

  18:                     cuenta = cuenta + 4;    

  19:                 if ($(this).val() == "ctl04")

  20:                     cuenta = cuenta + 5;    

  21:             });

  22:             

  23:             if (cuenta == 35) 

  24:                 return true;

  25:             else {

  26:                 var mensaje = "La valoración de la encuesta no llega a 35. El valor actual es: " + cuenta;

  27:                 mensaje = mensaje + ". Por favor, revise las respuestas de su encuesta para que llegue al valor solicitado.";

  28:                 

  29:                 var sid = SP.UI.Status.addStatus('Valoración no válida:', mensaje); 

  30:                 SP.UI.Status.setStatusPriColor(sid, 'red'); 

  31:  

  32:                 return false;

  33:             }

  34:         }    

  35:     

</script>

</asp:Content>

En el contenedor “PlaceHolderAdditionalPageHead”, añadimos un enlace al core de jQuery y sobrescribimos una función llamada PreSaveAction que es llamada por el código de formulario en SharePoint antes de hacer el summit. En esa función implementamos nuestra validación y utilizamos el objeto SP.UI.Status para mostrar el mensaje de validación al usuario usando la barra de estado que utiliza SharePoint 2010.

Y hasta aquí las posibilidades de validación en listas de tipo encuestas, es una pena que no se hayan incluido en la nueva funcionalidad de validación, aún así SharePoint nos sigue demostrando día a día que es una plataforma extensible y que con un poquito de experiencia se pueden hacer muy buenas cosas.

 

Saludos a todos…

Un comentario sobre “SharePoint 2010. Validación en encuestas”

Responder a anonymous Cancelar respuesta

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