sharepoint
Utilisation du modèle d'objet client JavaScript (JSOM)
Recherche…
Remarques
Contexte
Le modèle d'objet JavaScript a été introduit dans SharePoint 2010. Il expose côté client de nombreux objets auparavant uniquement accessibles via du code côté serveur ou des services Web dédiés.
Intégration de JavaScript dans les pages SharePoint
Dans SharePoint 2013, vous pouvez placer votre code JavaScript dans un composant WebPart Éditeur de scripts.
Dans SharePoint 2010, vous pouvez utiliser la propriété "lien de contenu" d'un composant WebPart Éditeur de contenu pour créer un lien vers un fichier HTML contenant votre script incorporé.
Référence d'objet
Les constructeurs, méthodes et propriétés de tous les objets trouvés dans l'espace de noms SP
sont documentés dans la référence du modèle d'objet client SharePoint 2013 ici .
La référence du modèle d'objet client SharePoint 2010 JavaScript est disponible ici .
Modèle de programmation asynchrone de JSOM
Lorsque vous utilisez le modèle d'objet client JavaScript, le code utilise généralement le modèle suivant:
- Obtenir un objet
ClientContext
. - Utilisez l'objet
ClientContext
pour récupérer des objets représentant des entités dans le modèle d'objet SharePoint, telles que des listes, des dossiers, des vues. - Mettre en file d'attente les instructions à effectuer sur les objets. Ces instructions ne sont pas encore transmises au serveur.
- Utilisez la fonction de
load
pour indiquer àClientContext
les informations que vous souhaitez recevoir du serveur. - Appelez la fonction
executeQueryAsync
l'objetClientContext
pour envoyer les instructions en file d'attente au serveur, en transmettant deux fonctions de rappel pourClientContext
s'exécutent en cas de succès ou d'échec. - Dans la fonction de rappel, travaillez avec les résultats renvoyés par le serveur.
Des alternatives
Les alternatives côté client au JSOM incluent les services Web SharePoint, les noeuds finaux REST et le modèle d'objet client .NET .
Obtenir des types de contenu de bibliothèque à l'aide du nom de la bibliothèque
function getContentTypes(site_url,name_of_the_library){
var ctx = new SP.ClientContext(site_url);
var web = ctx.get_web();
list = web.get_lists().getByTitle(name_of_the_library);
// You can include any property of the SP.ContentType object (sp.js), for this example we are just getting the name
ctx.load(list,'ContentTypes.Include(Name)');
ctx.executeQueryAsync(onQuerySucceeded, onQueryFailed);
}
function onQuerySucceeded(sender, args) {
// var list is the one that we used in function "getContentTypes"
var contentTypesEnumerator = (list.get_contentTypes()).getEnumerator();
while (contentTypesEnumerator.moveNext()) {
var contentType = contentTypesEnumerator.get_current();
alert(contentType.get_name());
}
}
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
Supprimer un élément dans une liste
SP.SOD.executeOrDelayUntilScriptLoaded( function(){ deleteItem(1); }, "sp.js");
function deleteItem(id){
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var item = list.getItemById(id);
item.deleteObject();
clientContext.executeQueryAsync(function(){
alert("Item #"+id+" deleted successfully!");
},function(sender,args){alert(args.get_message());});
}
Création d'éléments ou de dossiers
Création d'éléments de liste
SP.SOD.executeOrDelayUntilScriptLoaded(createItem,"sp.js");
function createItem(){
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var newItem = list.addItem();
newItem.set_item("Title","Example Title");
newItem.update();
clientContext.load(newItem); // only needed to retrieve info from newly created item
clientContext.executeQueryAsync(function(){
var itemId = newItem.get_item("ID");
alert("Item #"+itemId+" Created Successfully!");
},function(sender,args){
alert(args.get_message());
});
}
L'exemple ci-dessus montre qu'un élément de liste est créé en procédant comme suit:
- Appelez la méthode
addItem
d'un objet liste pour obtenir un objet élément - Appelez la méthode
set_item
sur l'objet d'élément de liste résultant pour définir chaque valeur de champ comme vous le souhaitez - Appelez la méthode
update
sur l'objet d'élément de liste pour indiquer que les modifications doivent être validées - Appelez la méthode
executeQueryAsync
de l'objet de contexte client pour exécuter les instructions en file d'attente
Notez que vous n'avez pas besoin de transmettre le nouvel objet d'élément à la méthode de load
du contexte client pour créer l'élément. Cette étape n'est nécessaire que si vous souhaitez récupérer l'une des valeurs de champ de l'élément à partir du serveur.
Création de dossiers
La création d'un dossier est similaire à l'ajout d'un élément à une liste. La différence est qu'il faut d' abord créer un ListItemCreationInformation
objet et définir sa underlyingObjectType
propriété à SP.FileSystemObjectType.folder
, et sa leafName
propriété au nom de votre choix du nouveau dossier.
L'objet est ensuite transmis en tant que paramètre dans la méthode addItem
de la bibliothèque pour créer le dossier.
// ...
var itemCreateInfo = new SP.ListItemCreationInformation();
itemCreateInfo.set_underlyingObjectType(SP.FileSystemObjectType.folder);
itemCreateInfo.set_leafName(folderName);
var newItem = list.addItem(itemCreateInfo);
// ...
Pour valider la modification, ClientContext
la méthode executeQueryAsync
de l'objet ClientContext
via lequel la bibliothèque a été accédée.
L'exemple complet ci-dessous crée un dossier avec un nom basé sur l'horodatage actuel, puis ouvre ce dossier dans une boîte de dialogue modale.
SP.SOD.executeOrDelayUntilScriptLoaded(createFolder,"sp.js");
function createFolder(){
var now = new Date();
var timeStamp = now.getYear() + "-" + (now.getMonth()+1) + "-" + now.getDate()
+ "T" + now.getHours()+"_"+now.getMinutes()+" "+now.getSeconds()+"_"+now.getMilliseconds();
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("Library Title");
var itemCreateInfo = new SP.ListItemCreationInformation();
itemCreateInfo.set_underlyingObjectType(SP.FileSystemObjectType.folder);
itemCreateInfo.set_leafName(timeStamp);
var newItem = list.addItem(itemCreateInfo);
newItem.update();
clientContext.load(newItem);
var rootFolder = list.get_rootFolder(); // Note: use a list's root folder to determine its server relative URL
clientContext.load(rootFolder);
clientContext.executeQueryAsync(function(){
var itemId = newItem.get_item("ID");
var name = newItem.get_item("FileLeafRef");
SP.UI.ModalDialog.showModalDialog(
{
title: "Folder \""+name+"\" (#"+itemId+") Created Successfully!",
url: rootFolder.get_serverRelativeUrl() + "/" + name
}
);
},function(sender,args){alert(args.get_message());});
}
Obtenir les informations d'utilisateur actuelles
SP.SOD.executeOrDelayUntilScriptLoaded(showUserInfo,"sp.js");
function showUserInfo(){
var clientContext = new SP.ClientContext();
var user = clientContext.get_web().get_currentUser();
clientContext.load(user);
clientContext.executeQueryAsync(function(){
var details = "ID: "+user.get_id()+"\n"+
"Title: "+user.get_title()+"\n"+
"Login: "+user.get_loginName()+"\n"+
"Email: "+user.get_email();
alert(details);
},function(sender,args){alert(args.get_message());})
}
Obtenir un élément de liste par ID
SP.SOD.executeOrDelayUntilScriptLoaded(myFunction,"sp.js");
function myFunction(){
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var item = list.getItemById(1); // get item with ID == 1
clientContext.load(item);
clientContext.executeQueryAsync(
function(){ // onSuccess
var title = item.get_item("Title");
alert(title);
},
function(sender,args){ // onError
alert(args.get_message());
}
);
}
Obtenir des éléments de liste par la requête CAML
Exemple de base
Utilisez la méthode set_viewXml
de l'objet SP.CamlQuery pour spécifier une requête CAML permettant de récupérer des éléments.
SP.SOD.executeOrDelayUntilScriptLoaded(showListItems,"core.js");
function showListItems(){
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml(
"<View><Query>" +
"<Where>" +
"<Eq><FieldRef Name=\"Title\"/><Value Type=\"Text\">Value</Value></Eq>" +
"</Where>" +
"<OrderBy><FieldRef Name=\"Modified\" Ascending=\"FALSE\"/></OrderBy>" +
"</Query>"+
//"<RowLimit>5000</RowLimit>" +
"</View>");
var items = list.getItems(camlQuery);
clientContext.load(items);
clientContext.executeQueryAsync(function(){
var itemArray = [];
var itemEnumerator = items.getEnumerator();
while(itemEnumerator.moveNext()){
var item = itemEnumerator.get_current();
var id = item.get_item("ID");
var title = item.get_item("Title");
itemArray.push(id + ": " + title);
}
alert("ID: Title\n"+itemArray.join("\n"));
},function(sender,args){alert(args.get_message());});
}
Recherche des résultats d'une requête CAML
Vous pouvez tirer parti de l'élément RowLimit
dans une requête CAML pour extraire uniquement un sous-ensemble de résultats avec chaque requête.
Utilisez la méthode get_listItemCollectionPosition
d'une collection d'éléments de liste pour extraire la position actuelle, puis utilisez cette valeur comme paramètre dans la méthode set_listItemCollectionPosition
un objet set_listItemCollectionPosition
pour extraire le lot de résultats suivant.
SP.SOD.executeOrDelayUntilScriptLoaded(showListItems,"sp.js");
function showListItems(){
var itemArray = [];
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var viewXml =
"<View><Query>" +
"<OrderBy><FieldRef Name=\"Modified\" Ascending=\"FALSE\"/></OrderBy>" +
"</Query>"+
"<RowLimit>1</RowLimit>" +
"</View>";
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml(viewXml);
var items = list.getItems(camlQuery);
clientContext.load(items);
clientContext.executeQueryAsync(loadResults,showError);
function loadResults(){
var resultsFound = false;
var itemEnumerator = items.getEnumerator();
while(itemEnumerator.moveNext()){
var item = itemEnumerator.get_current();
var id = item.get_item("ID");
var title = item.get_item("Title");
itemArray.push(id + ": " + title);
}
var pos = items.get_listItemCollectionPosition();// <- get position
if(pos !== null){ // <-- position is null when no more results are returned
if(confirm("Results so far: \nID: Title\n"+itemArray.join("\n"))){
camlQuery = new SP.CamlQuery();
camlQuery.set_listItemCollectionPosition(pos);// <- set position for next batch
camlQuery.set_viewXml(viewXml);
items = list.getItems(camlQuery);
clientContext.load(items);
clientContext.executeQueryAsync(loadResults,showError);
}
}else{
alert("Total Results: \nID: Title\n"+itemArray.join("\n")); // <- display when no more results
}
}
function showError(sender,args){
alert(args.get_message());
}
}