jeudi 10 mai 2012

Sondage SharePoint PARTIE 2

Sondage SharePoint PARTIE 2,
                message sur la page de retour.


Et en SharePoint 2010, comment j'aurais écrit la même chose mais cette fois en bénéficent de EcmaScript de SharePoint 2010. Pour référence voici la partie 1

Chargement
Dans un premier temps je veux utiliser la librairie "sp.js".


CODE:
              ExecuteOrDelayUntilScriptLoaded(initialize, "sp.js");


Cette ligne de code permet de m'assurer que ma librairie est charger dans ma page avant d'initialisé mon traitement. Effectivement les librairies Javascript sont chargés dans la page de façon asynchrone. Cette ligne me protège.


CODE COMPLET
<script language="javascript" type="text/javascript">

   ExecuteOrDelayUntilScriptLoaded(initialize, "sp.js");
    function initialize()
    {
            var LIST_NAME = getParameterByName("ListName"); // nom de la liste de sondage
            var listSurvey = null;
            if(LIST_NAME == undefined || LIST_NAME== '')
            {
                     return;
             }

            var clientContext = new SP.ClientContext.get_current();

                if (clientContext != undefined && clientContext != null)
                {
                     var web = clientContext.get_web();
                     listSurvey = web.get_lists().getByTitle(LIST_NAME);
                     var query = SP.CamlQuery.createAllItemsQuery();
                     surveys = listSurvey.getItems(query);
                     clientContext.load(surveys , 'Include(Completed)');
                     var success = Function.createDelegate(this, this.onSuccess);
                     var failure = Function.createDelegate(this, this.onFailure);
                     clientContext.executeQueryAsync(success , failure );
                 }
          }

           function onSuccess(sender, args)
          {
                 var COMPLETED = '1'; //if 1 then is completed
                 var MESSAGE_SONDAGE_COMPLETED = "Merci d'avoir participer au sondage.";
                 var MESSAGE_SONDAGE_NOT_COMPLETED = "Revenez participer au sondage une prochaine fois.";

                 if(this.surveys!= undefined && this.surveys!=null )
                  {

                        var ListEnumerator = this.surveys.getEnumerator();
                        ListEnumerator.moveNext();
                        var currentItem = ListEnumerator.get_current();

                         if(currentItem == undefined)
                         {
                             $("#message").html(MESSAGE_SONDAGE_NOT_COMPLETED);
                             return;
                          }

                        var completedValue = currentItem.get_item('Completed');

                        if(completedValue == COMPLETED )
                          { 
                            $("#message").html(MESSAGE_SONDAGE_COMPLETED);
                          }
                         else
                          {
                             $("#message").html(MESSAGE_SONDAGE_NOT_COMPLETED);
                          }
                   }
           }

          function onFailure(sender, args)
          {
             $("#message").html(MESSAGE_SONDAGE_NOT_COMPLETED);

         }


          /// Find query string
         function getParameterByName(name)
         {
             name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
             var regexS = "[\\?&]" + name + "=([^&#]*)"; var regex = new RegExp(regexS);
             var results = regex.exec(window.location.search); if(results == null) return "";
             else return decodeURIComponent(results[1].replace(/\+/g, " "));
          }

       </script>

       <div id="message">Revenez participer au sondage une prochaine fois.</div>

mercredi 9 mai 2012

Sondage SharePoint, message sur la page de retour.

Dernièrement un client m'a demandé comment afficher une page de retour générique lorsque qu'un employé remplit un sondage standard SharePoint. La page générique devait afficher un message différent si l'usager avait rempli le sondage ou s’il avait abandonné la page de sondage. Tout le futur sondage de cette entreprise devait être redirigé sur cette page. Pour information, mon client utillise WSS et à accès seulement à SharePoint Designer 2007


Page de retour

Donc pour faire afficher une page de retour sur un sondage vous devez spécifier sa source dans l'url.

Dans SharePoint le paramètre Source sert à SharePoint de paramètre de retour de page, j'ai donc ajouté ce paramètre à mon URL.

Exemple:

http://[SERVER]/commun/Lists/Sondage/NewForm.aspx?Source=/commun/PageRetourSondage.aspx?ListName=Sondage

Vérifier si l'usager à remplit son sondage

Il y a moyen d'interroger les services web via Ajax (javascript). Pour ce faire nous devons utilisé le service web que nous trouvons à cet adresse _vti_bin/lists.asmx.

Le service à besoin de recevoir une enveloppe soap.

1) GetListItems c'est le nom de la méthode qui m'intéresse;

2) <listName> LIST_NAME </listName> permet d'indiquer quelle liste je veux interroger;

3) <FieldRef Name='Completed' /> je veux lire le champ Completed;

<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>

<soapenv:Body>

<GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'>

<listName> LIST_NAME </listName>

<viewFields>

<ViewFields>

<FieldRef Name='Completed' />

</ViewFields>

</viewFields>

</GetListItems>

</soapenv:Body>

</soapenv:Envelope>

Retrouver la liste

La liste est dans le paramètre de l'url, c'est la valeur qui suit le champ ListName dans l'url. J'ai donc ajouté cette fonction qui fait bien le travail.

var LIST_NAME = getParameterByName("ListName");

Écrire dans le tag sondage le message

SharePoint retourne une réponse xml, dans notre cas comme c'est un sondage il va toujours avoir une seul row. Car par défaut les autres personnes ne peuvent voir les résultats des autres sonder.

Dans le xml SharePoint préfixe c'est colonne par ows_, donc nous devons lire le champ ows_Completed.

var isComplete = $(xData.responseXML).find("z\\:row").attr("ows_Completed")

Par la suite un peu de JQuery et on affiche le message dans son div.

function processResult(xData, status) {

//get fist item of the list

var isComplete = $(xData.responseXML).find("z\\:row").attr("ows_Completed")

 

if(isComplete == COMPLETE ){

$("#message").html(MESSAGE_SONDAGE_COMPLETED);

return;

}

else

{

$("#message").html(MESSAGE_SONDAGE_NOT_COMPLETED);

return;

}

}

Voici le code complet

<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script>
<script type="text/javascript">


var ajax_request; //object query AJAX
var url = "_vti_bin/lists.asmx";
var LIST_NAME = getParameterByName("ListName"); // nom de la liste de sondage
var MESSAGE_SONDAGE_COMPLETED = "Merci d'avoir participer au sondage.";
var MESSAGE_SONDAGE_NOT_COMPLETED = "Revenez participer au sondage une prochaine fois.";
var COMPLETE = 1; //if 1 then is completed

///////////////////////////////////////////
//Start when page has loaded
$(document).ready(function() {

    // if user dont specify de list name redirect to main page
    if(LIST_NAME == "")
    {
        ///read parent url
        var ParentUrl = WPSC.WebPartPage.WebURL.replace(WPSC.WebPartPage.WebServerRelativeURL,'');
        //redirect
        $(location).attr('href',ParentUrl );
        return; //end script
    }

    //Else start query
    var soapEnv ="<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
                        <soapenv:Body> \
                            <GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
                                <listName>" + LIST_NAME + "</listName> \
                                <viewFields> \
                                    <ViewFields> \
                                        <FieldRef Name='Completed' /> \
                                    </ViewFields> \
                                    </viewFields> \
                            </GetListItems> \
                        </soapenv:Body> \
                    </soapenv:Envelope>";

    /* Send XML/SOAP Request To Web Service Using Browser's Javascript DOM */
    try {
        ajax_request = new XMLHttpRequest();
    }
    catch (trymicrosoft)
     {
        try {
            ajax_request = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (othermicrosoft) {
            try {
                ajax_request = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (failed) {
                ajax_request = false;
            }
        }
    }



    ajax_request.open("POST", url, true);
    ajax_request.setRequestHeader("Content-Type", "text/xml;charset=utf-8");
    ajax_request.onreadystatechange = receiveXML_SOAPData;
    ajax_request.send(soapEnv);

});

    ///////////////////////////////////////////
    //Process data from SharePoint
    function receiveXML_SOAPData()
    {
        //if query is response has completed
        if (ajax_request.readyState == 4) {
        // if statut is success
            if (ajax_request.status == 200) {
                processResult(ajax_request, ajax_request.status );
            }
        }
    }


    ///////////////////////////////////////////
    /// render message if the form is completed
    function processResult(xData, status) {
        //get fist item of the list
        var isComplete = $(xData.responseXML).find("z\\:row").attr("ows_Completed")
            if(isComplete == COMPLETE ){
                $("#message").html(MESSAGE_SONDAGE_COMPLETED);
                return;
            }
            else
            {
                $("#message").html(MESSAGE_SONDAGE_NOT_COMPLETED);
                return;
            }
       }

     /// Find query string
    function getParameterByName(name) {
        name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
        var regexS = "[\\?&]" + name + "=([^&#]*)"; var regex = new RegExp(regexS);
        var results = regex.exec(window.location.search); if(results == null) return "";
        else return decodeURIComponent(results[1].replace(/\+/g, " "));
     }
</script>

<div id="message"> </div>