A la hora de extender SharePoint, una de las primeras necesidades que nos aparece es cómo obtener todos los usuarios que pueden acceder a la aplicación. En algunos escenarios, este hecho se puede solucionar haciendo uso del componente People Picker (que viene de serie en SharePoint), aunque hay otras situaciones en las que esta personalización se queda corta. ¿El motivo? Queremos añadir un componente social y menciones de los usuarios que tenemos en SharePoint. Este componente no es más que una caja de texto multilínea en el que cada vez que introducimos una «@» (estándar dentro de las redes sociales para mencionar a alguien) se visualizan los usuarios que comienzan por el patrón de letras introducidas.
¿De qué opciones disponemos?
Hacer uso del modelo de objetos de Servidor (SSOM) dentro de un objeto SPWeb, tenemos un método AllUsers que puede ser útil para establecer esta función. Sin embargo, este método tiene un «pero» relativamente grande. Este método solamente devuelve los usuarios que se han autentificado contra SharePoint por lo menos una vez. Esto puede ser un lastre fundamentalmente si el sistema se está implantando y todavía no todo el mundo ha accedido al sistema.
¿Cómo podemos obtener todos los usuarios?
Podemos optar por implementar una conexión para consultar estos usuarios directamente de Active Directory. Esta opción puede ser válida, aunque no es de lejos la mejor opción. Los motivos son:
- Se deduce que utilizamos AD, lo cual no tiene porque ser la forma en la que se autentifiquen nuestros usuarios.
- Hay que realizar un desarrollo extra para consultar AD y, sobre todo, es necesario dar permisos a algún usuario para obtener los usuarios.
Solución
Dentro del modelo de objetos de cliente de JavaScript, existen unos métodos que se pueden utilizar para realizar las consultas de usuario. Para ello, hay utilizar el método SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.clientPeoplePickerSearchUser que está dentro de la librería SP.js. Este método es el que utiliza internamente el control People Picker. A este método le tienes que añadir el contexto de SharePoint y establecer los parámetros de la búsqueda. Un ejemplo sería el siguiente:
queryPeople: function(query) { var deferred = new jQuery.Deferred(); EnsureScript('SP.js', typeof SP.ClientContext, function() { EnsureScript('autofill.js', typeof SPClientAutoFill, function() { var searchQuery = new SP.UI.ApplicationPages.ClientPeoplePickerQueryParameters(); searchQuery.set_allowMultipleEntities(true); searchQuery.set_maximumEntitySuggestions(10); searchQuery.set_allowEmailAddresses(true); searchQuery.set_principalType(1); searchQuery.set_principalSource(15); searchQuery.set_queryString(query); var clientContext = SP.ClientContext.get_current(); var searchResult = SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.clientPeoplePickerSearchUser(clientContext, searchQuery); clientContext.executeQueryAsync(function() { var users = []; var results = clientContext.parseObjectFromJsonString(searchResult.get_value()); for (var i = 0; i < results.length; i++) { var filtered = $(users).filter(function() { return this.value == results[i].DisplayText; }); if (filtered.length == 0) { var title = results[i].EntityData.Title; if (title == undefined) { title = ""; } var sip = results[i].EntityData.SIPAddress; if (sip == undefined) { sip = results[i].EntityData.Email; } users.push({ value: results[i].DisplayText, id: results[i].Key, email: results[i].EntityData.Email, networkaddress: results[i].Description, title: title, sip: sip }); } } deferred.resolve(users); }); }); }); return deferred.promise(); },
Ahora bien, para establecer la funcionalidad social, faltaría desarrollar cuándo queremos realizar la búsqueda. Los pasos a desarrollar serían: implementar un método que cada vez que se introduzca una «@» se invoque a este procedimiento y mostremos los resultados obtenidos. Este desarrollo lo dejo a curiosidad del lector.
Conclusión
A la hora de utilizar los usuarios que hay en SharePoint, tenemos muchas opciones que se pueden adecuar a la gran mayoría de nuestros escenarios. Podemos hacer uso de elementos de serie de SharePoint (como vimos en anteriores entradas) o extender su funcionalidad y adaptarlo a los requisitos de los usuarios (modificar la funcionalidad y/o la interfaz gráfica). La elección de una opción u otra depende de los requisitos que tengamos y de nuestra habilidad con los desarrollos.