Partilhar via


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:

  1. Ative o recurso Gerenciamento de Registros In-Place na coleção de sites.

    Captura de tela da página de Recursos de Conjuntos de Sites com o recurso de Gerenciamento de Registros no Local ativado realçado.

  2. Em Configurações do Site, verifique se você vê configurações de declaração de registro em Administração de Coleção de Sites.

    Screenshot of the Site Settings page with Record declaration settings highlighted.

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)

Captura de tela da página inicial do suplemento, mostrando os dois cenários.

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.

Screenshot of the Library Record Declaration Settings page.

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.

Screenshot that shows the deactivate or activate button for in-place records management.

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.
  }
}

Confira também