Как скрыть папку в Sharepoint - PullRequest
1 голос
/ 23 апреля 2010

Что еще нужно добавить в следующий код, чтобы убедиться, что папка скрыта или доступна только для чтения?

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

folder.Update ();

Ответы [ 2 ]

5 голосов
/ 23 апреля 2010

В отличие от реальных списков, Папка не может быть сделана «скрытой» в обычном смысле. То есть вы не можете сделать его невидимым для пользовательского интерфейса, но при этом все равно будете иметь все обычные уровни доступа, связанные с ним (например, традиционный список истории рабочих процессов скрыт таким образом). В некотором смысле, ваши цели скрыть и сделать его доступным только для чтения совпадают, когда дело доходит до папок, так как оба они выполняются с помощью прав доступа. Технически вы можете уменьшить видимость определенного элемента с помощью сложного фильтра представления, но это только изменит вещи на уровне представления.

Видимость элемента списка, которым является папка, зависит от того, есть ли у вас права доступа к этому элементу. Единственный способ действительно «спрятать» элемент списка - это удалить все разрешения человека из этого элемента списка. Чтобы сделать папку доступной только для чтения, необходимо удалить все разрешения на добавление, редактирование и удаление из папки. Если у вас все еще есть уровни разрешений SharePoint по умолчанию («Полный доступ», «Дизайн», «Contribute» и «Чтение»), то просто переназначение всего «Чтение» выполнит эту задачу.

Вот пример кода, который я использую, чтобы сделать обсуждение (которое является папкой) скрытым от всех пользователей, кроме пользователей из группы «Инженеры», которым он доступен только для чтения.

// 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

При назначении нескольких экземпляров это зависит от того, выполняете ли вы все группы или только подмножество. Я перечислю код для всех групп, так как это то, что вы прямо спрашиваете.

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);

Если вы хотите сделать это только для подмножества групп, вы должны определить список имен всех этих групп, сделать foreach (string groupName in groupList), и в качестве первой строки цикла указать SPPrincipal smith = web.SiteGroups[groupName];.

2 голосов
/ 26 апреля 2010

Спасибо, Корнет.Вот метод, который делает папку только для чтения.СПАСИБО ЗА ПОМОЩЬ ...

    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);           
        }

    }
...