giovedì 2 settembre 2010

SharePoint 2010 - Esempio di ECMA Client Object Model

Ero curioso di provare il nuovo Client Object Model di SharePoint 2010, così ho scritto qualche riga di codice per provare a listare tutti i siti di una site collection. Avendo trovato un po' di difficoltà a fare questa semplice operazione, in quanto ho trovato poco chiare le informazioni presenti nello SDK, ho anche cercato una funzione Javascript che mi consentisse di ispezionare gli oggetti dell'ECMA COM (la funzione l'ho trovato su questo sito).

<script type="text/javascript">
ExecuteOrDelayUntilScriptLoaded(initialize, "sp.js");
var context = null;  
var web = null;
var collWeb = null;

/*function initialize()
{
 context = new SP.ClientContext.get_current();  
 web = context.get_web();
 context.load(web);
 context.executeQueryAsync(Function.createDelegate(this, this.onSuccessMethod), Function.createDelegate(this, this.onFailureMethod));
}

function onSuccessMethod(sender, args) {  
 var d = document.getElementById("list");
 var l = document.createElement("LI");
 l.innerHTML = "<span>" + web.get_title() + "</span>";
 d.appendChild(l);
}*/ 

function initialize()
{
 context = new SP.ClientContext.get_current();  
 this.collWeb = context.get_web().get_webs();
 context.load(this.collWeb);
 context.executeQueryAsync(Function.createDelegate(this, this.onSuccessMethod), Function.createDelegate(this, this.onFailureMethod));
}

function onSuccessMethod(sender, args) {  
 
 var d = document.getElementById("list");
 var web = null;
 for(var x=0; x < this.collWeb.get_count(); x++)
 {
  var l = document.createElement("LI");
  web = this.collWeb.itemAt(x);
  l.innerHTML = "<span>" + web.get_title() + "</span>";
  d.appendChild(l);
 }
 
 var d2 = document.getElementById("test");
 var d1 = document.createElement("DIV");
 //d1.innerHTML = inspect(this.collWeb.itemAt(0),1,0);
 d1.innerHTML = inspect(this.collWeb,1,0);
 d2.appendChild(d1);
} 

 
function onFaiureMethodl(sender, args) {  
     alert('request failed ' + args.get_message() + '\n' + args.get_stackTrace());  
} 

function inspect(obj, maxLevels, level)
{
  var str = '', type, msg;

    // Start Input Validations
    // Don't touch, we start iterating at level zero
    if(level == null)  level = 0;

    // At least you want to show the first level
    if(maxLevels == null) maxLevels = 1;
    if(maxLevels < 1)     
        return '<font color="red">Error: Levels number must be > 0</font>';

    // We start with a non null object
    if(obj == null)
    return '<font color="red">Error: Object <b>NULL</b></font>';
    // End Input Validations

    // Each Iteration must be indented
    str += '<ul>';

    // Start iterations for all objects in obj
    for(property in obj)
    {
      try
      {
          // Show "property" and "type property"
          type =  typeof(obj[property]);
          str += '<li>(' + type + ') ' + property + 
                 ( (obj[property]==null)?(': <b>null</b>'):( '' )) + '</li>';

          // We keep iterating if this property is an Object, non null
          // and we are inside the required number of levels
          if((type == 'object') && (obj[property] != null) && (level+1 < maxLevels))
          str += inspect(obj[property], maxLevels, level+1);
      }
      catch(err)
      {
        // Is there some properties in obj we can't access? Print it red.
        if(typeof(err) == 'string') msg = err;
        else if(err.message)        msg = err.message;
        else if(err.description)    msg = err.description;
        else                        msg = 'Unknown';

        str += '<li><font color="red">(Error) ' + property + ': ' + msg +'</font></li>';
      }
    }

      // Close indent
      str += '</ul>';

    return str;
}
</script>

<div id="test">
Elenco dei siti della site collection listati tramite ECMAScript Client Object 
Model<br /> 
<ul id="list"></ul>
</div>