Extensões de gerenciamento de registros amostram Suplemento do SharePoint
O ECM. O exemplo RecordsManagement mostra como usar um suplemento hospedado pelo provedor para controlar as configurações de gerenciamento de registros in-loco para um site ou lista.
Use essa solução se quiser configurar as configurações de gerenciamento de registros in-loco durante o processo de provisionamento de site personalizado.
Antes de começar
Para começar, baixe o ECM. Suplemento de exemplo RecordsManagement do projeto Office 365 Padrões e Práticas do Desenvolvedor no GitHub.
Observação
The code in this article is provided as-is, without warranty of any kind, either express or implied, including any implied warranties of fitness for a particular purpose, merchantability, or non-infringement.
Antes de executar este suplemento:
Ative o recurso Gerenciamento de Registros In-Place na coleção de sites.
Em Configurações do Site, verifique se você vê configurações de declaração de registro em Administração de Coleção de Sites.
Usando o ECM. Suplemento de exemplo RecordsManagement
Quando você inicia o ECM. Suplemento RecordsManagement, a página inicial exibe os dois cenários disponíveis:
- Habilitar o gerenciamento de registros in-loco para sites (Cenário 1)
- Habilitando o gerenciamento de registros in-loco para listas (Cenário 2)
Você pode usar o Cenário 1 para criar uma interface do usuário para controlar as configurações de gerenciamento de registros em sua coleção de sites. A interface do usuário neste suplemento é semelhante à interface do usuário encontrada nas configurações de declaração de registros em Configurações do Site. Você também pode ativar ou desativar o recurso Gerenciamento de Registros In-Place na coleção do site.
Você pode usar o Cenário 2 para criar uma interface do usuário para controlar as configurações de gerenciamento de registros em listas. A interface do usuário neste suplemento é semelhante à interface do usuário encontrada nas configurações de declaração de registros nas configurações da biblioteca em sua lista.
Cenário 1
O cenário 1 aborda os recursos e as configurações de gerenciamento de registros locais para sites. A interface do usuário de suplemento inclui um botão Desativar (ou Ativar), conforme mostrado na figura a seguir. A escolha desse botão desativa (ou ativa) o recurso Gerenciamento de Registros In-Place na coleção de sites.
O código a seguir ativa ou desativa o recurso Gerenciamento de Registros In-Place na coleção de sites. Os métodos DisableInPlaceRecordsManagementFeature e EnableSiteForInPlaceRecordsManagement fazem parte do arquivo AppModelExtensions\RecordsManagementExtensions.cs no OfficeDevPnP.Core.
protected void btnToggleIPRStatus_Click(object sender, EventArgs e)
{
if (cc.Site.IsInPlaceRecordsManagementActive())
{
cc.Site.DisableInPlaceRecordsManagementFeature();
IPRStatusUpdate(false);
}
else
{
cc.Site.EnableSiteForInPlaceRecordsManagement();
IPRStatusUpdate(true);
}
}
O OfficeDevPnP.Core inclui métodos de extensão para obter e definir todas as configurações de gerenciamento de registros in-place no escopo do site. O código a seguir do método EnableSiteForInPlaceRecordsManagement mostra como usar esses métodos de extensão para definir restrições e especificar quem pode declarar ou não declarar registros em seu site.
public static void EnableSiteForInPlaceRecordsManagement(this Site site)
{
// Activate the In-Place Records Management feature if not yet enabled.
if (!site.IsFeatureActive(new Guid(INPLACE_RECORDS_MANAGEMENT_FEATURE_ID)))
{
// Note: this also sets the ECM_SITE_RECORD_RESTRICTIONS value to "BlockDelete, BlockEdit".
site.ActivateInPlaceRecordsManagementFeature();
}
// Enable in-place records management in all locations.
site.SetManualRecordDeclarationInAllLocations(true);
// Set restrictions to default values after enablement (this is also done at feature activation).
EcmSiteRecordRestrictions restrictions = EcmSiteRecordRestrictions.BlockDelete | EcmSiteRecordRestrictions.BlockEdit;
site.SetRecordRestrictions(restrictions);
// Set record declaration to default value.
site.SetRecordDeclarationBy(EcmRecordDeclarationBy.AllListContributors);
// Set record undeclaration to default value.
site.SetRecordUnDeclarationBy(EcmRecordDeclarationBy.OnlyAdmins);
}
Quando o usuário altera as configurações de gerenciamento de registros in-loco e escolhe o botão Salvar alterações , o código a seguir no método btnSaveSiteScopedIPRSettings_Click é executado.
protected void btnSaveSiteScopedIPRSettings_Click(object sender, EventArgs e)
{
EcmSiteRecordRestrictions restrictions = (EcmSiteRecordRestrictions)Convert.ToInt32(rdRestrictions.SelectedValue);
cc.Site.SetRecordRestrictions(restrictions);
cc.Site.SetManualRecordDeclarationInAllLocations(Convert.ToBoolean(rdAvailability.SelectedValue));
EcmRecordDeclarationBy declareBy = (EcmRecordDeclarationBy)Convert.ToInt32(rdDeclarationBy.SelectedValue);
cc.Site.SetRecordDeclarationBy(declareBy);
EcmRecordDeclarationBy unDeclareBy = (EcmRecordDeclarationBy)Convert.ToInt32(rdUndeclarationBy.SelectedValue);
cc.Site.SetRecordUnDeclarationBy(unDeclareBy);
}
No código anterior, uma chamada é feita para o método SetRecordRestrictions em RecordsManagementExtensions.cs. O método SetRecordRestrictions no próximo exemplo mostra como definir restrições nos registros.
public static void SetRecordRestrictions(this Site site, EcmSiteRecordRestrictions restrictions)
{
string restrictionsProperty = "";
if (restrictions.Has(EcmSiteRecordRestrictions.None))
{
restrictionsProperty = EcmSiteRecordRestrictions.None.ToString();
}
else if (restrictions.Has(EcmSiteRecordRestrictions.BlockEdit))
{
// BlockEdit is always used in conjunction with BlockDelete.
restrictionsProperty = EcmSiteRecordRestrictions.BlockDelete.ToString() + ", " + EcmSiteRecordRestrictions.BlockEdit.ToString();
}
else if (restrictions.Has(EcmSiteRecordRestrictions.BlockDelete))
{
restrictionsProperty = EcmSiteRecordRestrictions.BlockDelete.ToString();
}
// Set property bag entry.
site.RootWeb.SetPropertyBagValue(ECM_SITE_RECORD_RESTRICTIONS, restrictionsProperty);
}
Cenário 2
O cenário 2 mostra como interagir com as configurações de gerenciamento de registros in-loco para listas. Quando o suplemento é instalado, ele cria uma biblioteca de documentos chamada IPRTest. Quando você usa esse suplemento para alterar e salvar as configurações de gerenciamento de registros in-loco, as alterações são aplicadas ao IPRTest.
Observação
Para usar as configurações de gerenciamento de registros in-loco em uma lista, você deve ativar o recurso gerenciamento de registros in-place em sua coleção de sites.
O código a seguir em Default.aspx.cs é executado quando um usuário escolhe o botão Salvar Alterações .
protected void btnSaveListScopedIPRSettings_Click(object sender, EventArgs e)
{
List ipr = cc.Web.GetListByTitle(IPR_LIBRARY);
EcmListManualRecordDeclaration listManual = (EcmListManualRecordDeclaration)Convert.ToInt32(rdListAvailability.SelectedValue);
ipr.SetListManualRecordDeclaration(listManual);
ipr.SetListAutoRecordDeclaration(chbAutoDeclare.Checked);
// Refresh the settings as AutoDeclare changes the manual settings.
if (ipr.IsListRecordSettingDefined())
{
rdListAvailability.SelectedValue = Convert.ToString((int)ipr.GetListManualRecordDeclaration());
chbAutoDeclare.Checked = ipr.GetListAutoRecordDeclaration();
rdListAvailability.Enabled = !chbAutoDeclare.Checked;
}
}
O código chama os dois métodos a seguir no arquivo RecordsManagementExtensions.cs do OfficeDevPnP.Core:
- SetListManualRecordDeclaration – Define a configuração de declaração de registros manuais para esta lista.
- SetListAutoRecordDeclaration – declara automaticamente itens adicionados a essa lista como um registro. Se a declaração de registros for definida como automática nesta lista, as configurações de declaração de registros manuais na lista não serão mais aplicadas. Os receptores de eventos são adicionados à lista para iniciar ações específicas de gerenciamento de registros quando ocorrem eventos.
public static void SetListManualRecordDeclaration(this List list, EcmListManualRecordDeclaration settings)
{
if (settings == EcmListManualRecordDeclaration.UseSiteCollectionDefaults)
{
// If you set list record declaration back to the default values, you also need to
// turn off auto record declaration. Other property bag values are left as is; when
// settings are changed again these properties are also again usable.
if (list.PropertyBagContainsKey(ECM_AUTO_DECLARE_RECORDS))
{
list.SetListAutoRecordDeclaration(false);
}
// Set the property that dictates custom list record settings to false.
list.SetPropertyBagValue(ECM_IPR_LIST_USE_LIST_SPECIFIC, false.ToString());
}
else if (settings == EcmListManualRecordDeclaration.AlwaysAllowManualDeclaration)
{
list.SetPropertyBagValue(ECM_ALLOW_MANUAL_DECLARATION, true.ToString());
// Set the property that dictates custom list record settings to true.
list.SetPropertyBagValue(ECM_IPR_LIST_USE_LIST_SPECIFIC, true.ToString());
}
else if (settings == EcmListManualRecordDeclaration.NeverAllowManualDeclaration)
{
list.SetPropertyBagValue(ECM_ALLOW_MANUAL_DECLARATION, false.ToString());
// Set the property that dictates custom list record settings to true.
list.SetPropertyBagValue(ECM_IPR_LIST_USE_LIST_SPECIFIC, true.ToString());
}
else
{
throw new ArgumentOutOfRangeException("settings");
}
}
public static void SetListAutoRecordDeclaration(this List list, bool autoDeclareRecords)
{
// Determine the SharePoint version based on the loaded CSOM library.
Assembly asm = Assembly.GetAssembly(typeof(Microsoft.SharePoint.Client.Site));
int sharePointVersion = asm.GetName().Version.Major;
if (autoDeclareRecords)
{
// Set the property that dictates custom list record settings to true.
list.SetPropertyBagValue(ECM_IPR_LIST_USE_LIST_SPECIFIC, true.ToString());
// Prevent manual declaration.
list.SetPropertyBagValue(ECM_ALLOW_MANUAL_DECLARATION, false.ToString());
// Hook up the needed event handlers.
list.Context.Load(list.EventReceivers);
list.Context.ExecuteQuery();
List<EventReceiverDefinition> currentEventReceivers = new List<EventReceiverDefinition>(list.EventReceivers.Count);
currentEventReceivers.AddRange(list.EventReceivers);
// Track changes to see if a list.Update is needed.
bool eventReceiverAdded = false;
// ItemUpdating receiver.
EventReceiverDefinitionCreationInformation newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemUpdating, 1000, sharePointVersion);
if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
{
list.EventReceivers.Add(newEventReceiver);
eventReceiverAdded = true;
}
// ItemDeleting receiver.
newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemDeleting, 1000, sharePointVersion);
if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
{
list.EventReceivers.Add(newEventReceiver);
eventReceiverAdded = true;
}
// ItemFileMoving receiver.
newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemFileMoving, 1000, sharePointVersion);
if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
{
list.EventReceivers.Add(newEventReceiver);
eventReceiverAdded = true;
}
// ItemAdded receiver.
newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemAdded, 1005, sharePointVersion);
if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
{
list.EventReceivers.Add(newEventReceiver);
eventReceiverAdded = true;
}
// ItemUpdated receiver.
newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemUpdated, 1007, sharePointVersion);
if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
{
list.EventReceivers.Add(newEventReceiver);
eventReceiverAdded = true;
}
// ItemCheckedIn receiver.
newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemCheckedIn, 1006, sharePointVersion);
if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
{
list.EventReceivers.Add(newEventReceiver);
eventReceiverAdded = true;
}
if (eventReceiverAdded)
{
list.Update();
list.Context.ExecuteQuery();
}
// Set the property that dictates the autodeclaration.
list.SetPropertyBagValue(ECM_AUTO_DECLARE_RECORDS, autoDeclareRecords.ToString());
}
else
{
// Set the property that dictates the autodeclaration.
list.SetPropertyBagValue(ECM_AUTO_DECLARE_RECORDS, autoDeclareRecords.ToString());
//Note: Existing list event handlers will just stay as they are, no need to remove them.
}
}