vendredi 23 mars 2012

Sharepoint get ListItems with childs using clientcontext and CamlQuery

When trying to update some folder metadata i was unable to get subfolders as ListItem. I finnally came with this solution:


CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = "<View Scope=\"RecursiveAll\"> <Query></Query></View>";
var items = MyList.GetItems(camlQuery);
clientContext.Load(items, item => item.Where(i => i.DisplayName == FolderName));
clientContext.ExecuteQuery();

This code allow you to find a folder by name in a sharepoint list recursively (lookin your List Items and their childs.

Sharepoint: Creating a DocSet programmatically (client context,Silverlight side))

If you surf arround the web looking for a code to create a "Document Set" Item ina sharepoint platform using ClientContext you will get bored by unusfull solution. So I decided to help  you:


if (DocumentSet_IsEnabled(container.Title))
{
 ListItem docSet = null;
 List list = clientContext.Web.Lists.GetByTitle(container.Title);
 clientContext.Load(list);
 clientContext.ExecuteQuery();
 docSet = DocumentSet_Create(list, folder, itemName);
}

public bool DocumentSet_IsEnabled(string listName)
{
 List list = this.Context.Web.Lists.GetByTitle(listName);
 ContentTypeCollection listContentTypes = list.ContentTypes;
 Context.Load(listContentTypes, types => types.Include(type => type.Name)); 
 var result=Context.LoadQuery(
 listContentTypes.Where(
 c => c.Name == "Document Set" || c.Name == "Ensemble de documents"));
 Context.ExecuteQuery();
 return result.Count() == 1;
}

public ListItem DocumentSet_Create(List list, Folder folder, String itemNamestring description = "")
{
 ListItem docSet = null;
 ListItemCreationInformation newItemInfo = new ListItemCreationInformation();
 ContentType contentType = null;    
 newItemInfo.UnderlyingObjectType = FileSystemObjectType.Folder;
 newItemInfo.LeafName = itemName;
 if (folder != null)
  newItemInfo.FolderUrl = folder.ServerRelativeUrl;
 
 docSet = list.AddItem(newItemInfo);
 contentType = this.DocumentSet_GetContentType(list);
 docSet["ContentTypeId"] = contentType.Id.ToString();
try
{
 docSet.Update();
 Context.ExecuteQuery();
}
catch
{docSet = null;}
 return docSet;
}

jeudi 22 mars 2012

Update ["Created by"] (Author) & ["Modified By"](Editor) in a sharepoint Item)

Si vous voulez changer les metadonnées d'un dossier et vous avez utilisé :
myfolder.Folders.Add(subFolder);
vous pouvez changer les "Metadata"  de cette façon:

CamlQuery camlQuery = new CamlQuery();
user=clientContext.Web.EnsureUser(UserName);              
clientContext.Load(user);           
clientContext.ExecuteQuery();
var items = YourSharepointList.GetItems(camlQuery);
clientContext.Load(items,item =>item.Where(i=>i.DisplayName==subFolder));
clientContext.ExecuteQuery();
Utils utils = new Utils(_clientContext);
if ((user != null)&& (items.Count>0))
{
 items[0]["Author"] = user;
 items[0]["Editor"] = user;
 items[0].Update();
 clientContext.ExecuteQuery();
}


Si vous voulez changer les metadonnées d'un DocSet  utilisez cette méthode après avoir créé le DocSet:

private void ManageFields(ListItem listItem)
        {
            Utils utils = new Utils(_clientContext);
            var user = FieldUserValue.FromUser(AuthorName);
            var xuser = utils.User_GetByLoginName(AuthorName);
            if ((xuser.ServerObjectIsNull != null))
                listItem["Author"] = user;
            user = FieldUserValue.FromUser(EditorName);
            xuser = utils.User_GetByLoginName(EditorName);
            if ((xuser.ServerObjectIsNull != null))                 listItem["Editor"] = user;             DateTime dt;             if (DateTime.TryParse(item.CreationDate, out dt))                 listItem["Created"] = dt;             if (DateTime.TryParse(item.LastModificationDate, out dt))                 listItem["Modified"] = dt;             listItem.Update();             clientContext.ExecuteQuery();         }