2010-04-23 87 views
1

Que dois-je ajouter au code suivant pour m'assurer que le dossier est caché ou en lecture seule?Comment masquer un dossier dans Sharepoint

SPListItem createFolder = monDocLib.Folders.Add (myDocLib.RootFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder, "Folder444");

folder.Update();

Répondre

5

Contrairement aux listes réelles, un dossier ne peut pas être rendu "caché" dans le sens normal. C'est-à-dire que vous ne pouvez pas le rendre invisible à l'interface utilisateur, mais que tous les niveaux d'accès normaux y sont associés (par exemple, la liste d'historique de workflow classique est masquée de cette manière). D'une certaine manière, vos objectifs de masquage et de le faire en lecture seule coïncident quand il s'agit de dossiers, car les deux sont effectués par des autorisations. Vous pouvez techniquement réduire la visibilité d'un élément particulier à travers un filtre de vue compliqué, mais cela ne ferait que changer les choses au niveau de la vue.

La visibilité d'un élément de liste, qui est un dossier, est basée sur si vous avez des autorisations sur cet élément. La seule façon de vraiment "cacher" un élément de la liste est de supprimer toutes les permissions d'une personne de cet élément de la liste. Pour créer un dossier en lecture seule, vous devez supprimer toutes les autorisations Ajouter, Modifier et Supprimer du dossier. Si vous disposez toujours des niveaux d'autorisation SharePoint par défaut (contrôle total, conception, contribution et lecture), la simple réaffectation de tout à Read permettra d'atteindre cet objectif.

Voici un exemple de code que j'utilise pour rendre une discussion (qui est un dossier) cachée à tous les utilisateurs sauf ceux du groupe "Engineers", à qui il est en lecture seule.

// I excluded these two variable declarations because they were specific to 
// my situation. 
// Giving you my variable declarations would be misleading, since this is 
// meant to be a generic code sample. 
// SPListItem folder is the folder I am working on. 
// SPWeb web is the SPWeb for the site I am on. 
if (!folder.HasUniqueRoleAssignments) 
{ 
    folder.BreakRoleInheritance(false); //Setting false erases all permissions, so now the folder is hidden from everyone. 
    folder.SystemUpdate(false); 
} 
SPRoleDefinition role = web.RoleDefinitions["Read"]; 
SPPrincipal smith = web.SiteGroups["Engineers"]; //You would replace "Engineers" with the name of whatever group you want to have read permissions. Or, use web.SiteUsers[] to get a specific user. 
SPRoleAssignment roleAssignment = new SPRoleAssignment(smith); 
roleAssignment.RoleDefinitionBindings.Add(role); 
folder.RoleAssignments.Remove(smith); //If I have already assigned a different permission, this will clear it so that I ensure that the only permission is Read. 
folder.RoleAssignments.Add(roleAssignment); //This sets it to Read-Only for these people. 
folder.SystemUpdate(false); 

EDIT

Lors de l'attribution de plusieurs instances, cela dépend si vous faites tous les groupes ou un sous-ensemble. Je vais lister le code pour tous les groupes puisque c'est ce que vous demandez directement.

if (!folder.HasUniqueRoleAssignments) 
{ 
    folder.BreakRoleInheritance(false); //Setting false erases all permissions, so now the folder is hidden from everyone. 
    folder.SystemUpdate(false); 
} 
SPRoleDefinition role = web.RoleDefinitions["Read"]; 
SPRoleAssignment roleAssignment; 
foreach (SPPrincipal smith = web.SiteGroups) 
{ 
    roleAssignment = new SPRoleAssignment(smith); 
    roleAssignment.RoleDefinitionBindings.Add(role); 
    folder.RoleAssignments.Remove(smith); 
    folder.RoleAssignments.Add(roleAssignment); 
} 
folder.SystemUpdate(false); 

Si vous vouliez le faire que pour un sous-ensemble de groupes, vous définirait une liste des noms de tous ces groupes, faire foreach (string groupName in groupList), et comme la première ligne de la boucle, spécifiez SPPrincipal smith = web.SiteGroups[groupName];.

+0

Merci ccornet pour le code et le détail sur le fonctionnement du dossier dans Sharepoint. Merci beaucoup. –

+0

@Rosh Réponse éditée pour fournir le code demandé. –

+0

Génial. Merci. Ccornet –

2

Merci Cornet. Voici la méthode qui permet de lire un dossier uniquement. MERCI ENCORE POUR VOTRE AIDE ...

private void MakeFolderReadOnly(SPWeb web,SPListItem folder) 
    { 
     if (!folder.HasUniqueRoleAssignments) 
     { 
      //Setting false erases all permissions, so now the folder is hidden from everyone. 
      folder.BreakRoleInheritance(false); 
      folder.SystemUpdate(false); 
     } 

     SPRoleDefinition role = web.RoleDefinitions["Read"]; 
     SPGroupCollection collGroups = web.SiteGroups; 
     foreach(SPGroup group in collGroups) 
     { 
      SPPrincipal principal = group; 
      SPRoleAssignment roleAssign = new SPRoleAssignment(principal); 
      roleAssign.RoleDefinitionBindings.Add(role); 
      folder.RoleAssignments.Remove(principal); 
      folder.RoleAssignments.Add(roleAssign); 
      folder.SystemUpdate(false);   
     } 

    } 
Questions connexes