SharePoint/ВСИВО:Изменить поле “создано”?
-
06-07-2019 - |
Вопрос
Все -
Я использую WSS 3.0.В настоящее время отдел кадров загружает внутреннее резюме сотрудника компании в библиотеку документов на нашем сайте, но по соображениям конфиденциальности мы должны ограничить доступ к этой библиотеке документов, что вынуждает пользователей обращаться к отделу кадров каждый раз, когда они хотят обновить свое резюме.
Моя идея состоит в том, чтобы создать список с включенными вложениями, который позволит пользователям просматривать / редактировать только свои собственные элементы, а затем предоставить HR разрешение на управление всеми записями.Это работает, за исключением того, что отделу кадров потребуется создать начальный элемент списка и прикрепить резюме, что означает, что элемент списка будет "создан {hr}" и не будет виден / редактироваться конечным пользователем, чье резюме прикреплено.
Есть идеи о том, как я могу либо разрешить отделу кадров изменять поле "создано" при загрузке, чтобы конечные пользователи видели и могли редактировать свое резюме, либо поступить по-другому?
Спасибо!
Решение
Создайте библиотеку документов для хранения резюме.Затем предоставьте отделу кадров (группе пользователей SharePoint) разрешения "читать / записывать все" для библиотеки, предоставьте всем остальным права "читать / записывать свои собственные".Создайте тип контента под названием "Резюме" на основе готового типа контента документа.Затем добавьте поле, содержащее сотрудника (поле SPUser), которого касается резюме, к типу контента (и любые другие обязательные поля, т.е.имя, адрес и т.д.).Попросите отдел кадров правильно заполнить это при создании списка (сделайте поля обязательными).
Затем напишите itemeventreceiver, привязанный к типу контента, который вы только что создали, и переопределите событие ItemUpdated.
Код будет выглядеть примерно следующим образом:
public override void ItemUpdated(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate
{
using (SPWeb web = properties.OpenWeb())
{
web.AllowUnsafeUpdates = true;
var item = web.Lists[properties.ListId].GetItemById(properties.ListItemId);
if (item != null)
{
if (item.Fields.ContainsField("Employee"))
{
item["Author"] = item["Employee"];
// Author is the internal name of the Created by field,
// always use Internal Names!
DisableEventFiring();
item.SystemUpdate();
EnableEventFiring();
}
}
}
});
}
вы можете привязать ItemEventReceiver с помощью FeatureReceiver к типу контента следующим образом:
SPContentType docCt = web.ContentTypes[new SPContentTypeId("CONTENTYPE ID GOES HERE")];
docCt.EventReceivers.Add(SPEventReceiverType.ItemUpdated, "ASSEMBLYNAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=TOKEN", "FULLY QUALIFIED CLASSNAME");
docCt.Update();
Другие советы
Почему бы просто не использовать библиотеку документов для резюме?(вместо списка с вложениями.) Вы можете предоставить персоналу возможность полного чтения / записи всех документов внутри, и владелец резюме будет иметь права на доступ только к своему собственному резюме.
Я нашел способ изменить поле Created By с помощью SharePoint Designer для создания рабочего процесса.
- Создайте фиктивное поле в своем списке с легко определяемым именем, напримерКСИЗЗИ.Сделайте это полем "человек или группа".
- В SharePoint Designer создайте рабочий процесс для вашего списка.Разрешить ручной запуск и запускаться автоматически при создании нового элемента.
- Действия -> Установить поле в текущем элементе -> Установить XYZZY в поле в вашем списке, которое содержит учетную запись пользователя, которую вы хотите поместить в Created By.
- Нажмите кнопку Готово
- Теперь откройте свой файл workflow .xoml с помощью Блокнота.Замените "XYZZY" на "Author".Сохраните файл .xoml.
- Откройте рабочий процесс в конструкторе.Нажмите кнопку Готово, чтобы выполнить повторную обработку с новым кодом.
- Удалите фиктивное поле из списка.
- Запустите рабочий процесс для каждого существующего элемента в вашем списке.Новые элементы будут автоматически самокорректироваться.
С помощью пользовательского экрана загрузки вы могли бы изменить контекст текущего пользователя перед выполнением загрузки.Для этого требуется выполнить поиск пользовательского токена, используя что-то вроде следующего (это фрагменты рабочего кода с удаленной обработкой ошибок и другими материалами).Обратите внимание, что EnsureUser потребует, чтобы текущий пользователь в основном был администратором / владельцем.
using (SPSite site = GetImpersonatedSite(runAsUser))
{
using (SPWeb web = site.OpenWeb())
{
// Do stuff here
}
}
private SPSite GetImpersonatedSite(string username)
{
user = SPContext.Current.Web.EnsureUser(username);
SPSite site = new SPSite(SPContext.Current.Web.Url, user.UserToken);
return site;
}
У меня была похожая ситуация (миграция в sharepoint), когда мне пришлось добавить файл с именем администратора в библиотеку doc, а затем "сменить" пользователей.Я сделал это вот так, возможно, это вам чем-то поможет:
using (var root = site.RootWeb)
{
var users = root.SiteUsers;
var user = users["domain\username"];
file.Item[SPBuiltInFieldId.Created_x0020_By] = user.ID;
file.Item[SPBuiltInFieldId.Modified_x0020_By] = user.ID;
file.Item.UpdateOverwriteVersion();