Exemplos de modelos de bibliotecas de documentos do Suplemento do SharePoint
O exemplo ECM.DocumentLibraries mostra como usar um suplemento hospedado pelo provedor para criar uma lista ou biblioteca de documentos, atribuir um tipo de conteúdo a ele e remover o tipo de conteúdo padrão.
Use esta solução se desejar:
- Crie uma lista ou biblioteca de documentos e aplique um tipo de conteúdo padrão.
- Declarar maior controle sobre a adição, manutenção ou implementação de versões localizadas de seus campos personalizados.
- Remova o tipo de conteúdo padrão em uma lista ou biblioteca.
- Aplique definições de configuração de biblioteca ao criar uma lista ou biblioteca.
Antes de você começar
Para iniciar, faça o download do suplemento de exemplo ECM.DocumentLibraries no projeto Padrões e Práticas do Desenvolvedor do Office 365 no GitHub.
Observação
O código neste artigo é fornecido no estado em que se localiza, sem garantia de qualquer tipo, expressa ou implícita, incluindo quaisquer garantias implícitas de adequação a uma finalidade específica, comercialização ou não violação.
Usuários que acessam o suplemento de exemplo do ECM.DocumentLibraries deve ter permissões para gerenciar listas. O métodoDoesUserHavePermission em Default.aspx.cs verifica as permissões do usuário para garantir que ele possa gerenciar listas. Se o usuário não tiver permissões para gerenciar listas, o suplemento apresentará uma mensagem de erro ao usuário.
private bool DoesUserHavePermission()
{
var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
using (var ctx = spContext.CreateUserClientContextForSPHost())
{
BasePermissions perms = new BasePermissions();
perms.Set(PermissionKind.ManageLists);
ClientResult<bool> _permResult = ctx.Web.DoesUserHavePermissions(perms);
ctx.ExecuteQuery();
return _permResult.Value;
}
}
Usar o exemplo de suplemento ECM.DocumentLibraries
Quando você inicia o suplemento, a página inicial é exibida, conforme mostrado na figura a seguir. A página inicial do ECM.DocumentLibraries se parece com a página para adicionar uma nova biblioteca de documentos quando você seleciona Conteúdos do Site>Adicionar um aplicativo>Biblioteca de Documentos>Opções Avançadas, com uma diferença. Quando você inicia o suplemento, a lista Modelo de Documento exibe um modelo de biblioteca de documentos personalizado, Documento de TI e Documento Contoso. Quando o usuário escolhe Criar, o tipo de conteúdo personalizado selecionado é atribuído à nova biblioteca de documentos.
Página inicial do suplemento de exemplo ECM.DocumentLibraries
Quando os usuários escolhem Criar, o método CreateLibrary_Click em Default.aspx.cs verifica o modelo padrão selecionado e faz chamadas para o método CreateITDocumentLibrary ou CreateContosoDocumentLibrary em ContentTypeManager.cs, conforme mostrado no código a seguir.
protected void CreateLibrary_Click(object sender, EventArgs e)
{
try
{
var _spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
var _templateSelectedItem = this.DocumentTemplateType.Value;
var _libraryToCreate = this.GetLibraryToCreate();
using (var _ctx = _spContext.CreateUserClientContextForSPHost())
{
_ctx.ApplicationName = "AMS ECM.DocumentLibraries";
ContentTypeManager _manager = new ContentTypeManager();
switch(_templateSelectedItem)
{
case "IT Document":
_manager.CreateITDocumentLibrary(_ctx, _libraryToCreate);
break;
case "Contoso Document":
_manager.CreateContosoDocumentLibrary(_ctx, _libraryToCreate);
break;
}
}
Response.Redirect(this.Url.Value);
}
catch (Exception _ex)
{
throw;
}
}
O método CreateContosoDocumentLibrary executa as seguintes tarefas, conforme mostrado no próximo exemplo de código:
- Cria campos personalizados no Serviço de Metadados Gerenciados.
- Cria um tipo de conteúdo.
- Associa os campos personalizados aos tipos de conteúdo.
- Cria a biblioteca de documentos com o tipo de conteúdo.
public void CreateContosoDocumentLibrary(ClientContext ctx, Library library)
{
// Check the fields.
if (!ctx.Web.FieldExistsById(FLD_CLASSIFICATION_ID)){
ctx.Web.CreateTaxonomyField(FLD_CLASSIFICATION_ID,
FLD_CLASSIFICATION_INTERNAL_NAME,
FLD_CLASSIFICATION_DISPLAY_NAME,
FIELDS_GROUP_NAME,
TAXONOMY_GROUP,
TAXONOMY_TERMSET_CLASSIFICATION_NAME);
}
// Check the content type.
if (!ctx.Web.ContentTypeExistsById(CONTOSODOCUMENT_CT_ID)){
ctx.Web.CreateContentType(CONTOSODOCUMENT_CT_NAME,
CT_DESC, CONTOSODOCUMENT_CT_ID,
CT_GROUP);
}
// Associate fields to content types.
if (!ctx.Web.FieldExistsByNameInContentType(CONTOSODOCUMENT_CT_NAME, FLD_CLASSIFICATION_INTERNAL_NAME)){
ctx.Web.AddFieldToContentTypeById(CONTOSODOCUMENT_CT_ID,
FLD_CLASSIFICATION_ID.ToString(),
false);
}
CreateLibrary(ctx, library, CONTOSODOCUMENT_CT_ID);
}
CreateContosoDocumentLibrary chama o método CreateTaxonomyField, que faz parte do OfficeDevPnP.Core. CreateTaxonomyField cria um campo no serviço de metadados gerenciados do suplemento hospedado pelo provedor.
public static Field CreateTaxonomyField(this Web web, Guid id, string internalName, string displayName, string group, TermSet termSet, bool multiValue = false)
{
internalName.ValidateNotNullOrEmpty("internalName");
displayName.ValidateNotNullOrEmpty("displayName");
termSet.ValidateNotNullOrEmpty("termSet");
try
{
var _field = web.CreateField(id, internalName, multiValue ? "TaxonomyFieldTypeMulti" : "TaxonomyFieldType", true, displayName, group, "ShowField=\"Term1033\"");
WireUpTaxonomyField(web, _field, termSet, multiValue);
_field.Update();
web.Context.ExecuteQuery();
return _field;
}
catch (Exception)
{
/// If there is an exception, the hidden field might be present.
FieldCollection _fields = web.Fields;
web.Context.Load(_fields, fc => fc.Include(f => f.Id, f => f.InternalName));
web.Context.ExecuteQuery();
var _hiddenField = id.ToString().Replace("-", "");
var _field = _fields.FirstOrDefault(f => f.InternalName == _hiddenField);
if (_field != null)
{
_field.DeleteObject();
web.Context.ExecuteQuery();
}
throw;
}
}
CreateContosoDocumentLibrary chama o método CreateContentType, que faz parte do OfficeDevPnP.Core. CreateContentType cria um novo tipo de conteúdo.
public static ContentType CreateContentType(this Web web, string name, string description, string id, string group, ContentType parentContentType = null)
{
LoggingUtility.Internal.TraceInformation((int)EventId.CreateContentType, CoreResources.FieldAndContentTypeExtensions_CreateContentType01, name, id);
// Load the current collection of content types.
ContentTypeCollection contentTypes = web.ContentTypes;
web.Context.Load(contentTypes);
web.Context.ExecuteQuery();
ContentTypeCreationInformation newCt = new ContentTypeCreationInformation();
// Set the properties for the content type.
newCt.Name = name;
newCt.Id = id;
newCt.Description = description;
newCt.Group = group;
newCt.ParentContentType = parentContentType;
ContentType myContentType = contentTypes.Add(newCt);
web.Context.ExecuteQuery();
// Return the content type object.
return myContentType;
}
CreateContosoDocumentLibrary chama o método AddFieldToContentTypeById, que faz parte do OfficeDevPnP.Core. AddFieldToContentTypeById associa um campo a um tipo de conteúdo.
public static void AddFieldToContentTypeById(this Web web, string contentTypeID, string fieldID, bool required = false, bool hidden = false)
{
// Get content type.
ContentType ct = web.GetContentTypeById(contentTypeID);
web.Context.Load(ct);
web.Context.Load(ct.FieldLinks);
web.Context.ExecuteQuery();
// Get field.
Field fld = web.Fields.GetById(new Guid(fieldID));
// Add field association to content type.
AddFieldToContentType(web, ct, fld, required, hidden);
}
CreateContosoDocumentLibrary chama o método CreateLibrary em ContentTypeManager.cs para criar a biblioteca de documentos. O método CreateLibrary atribui configurações de biblioteca, como a descrição da biblioteca de documentos, o controle de versão do documento e os tipos de conteúdo associados.
private void CreateLibrary(ClientContext ctx, Library library, string associateContentTypeID)
{
if (!ctx.Web.ListExists(library.Title))
{
ctx.Web.AddList(ListTemplateType.DocumentLibrary, library.Title, false);
List _list = ctx.Web.GetListByTitle(library.Title);
if(!string.IsNullOrEmpty(library.Description)) {
_list.Description = library.Description;
}
if(library.VerisioningEnabled) {
_list.EnableVersioning = true;
}
_list.ContentTypesEnabled = true;
_list.Update();
ctx.Web.AddContentTypeToListById(library.Title, associateContentTypeID, true);
// Remove the default Document Content Type.
_list.RemoveContentTypeByName(ContentTypeManager.DEFAULT_DOCUMENT_CT_NAME);
ctx.Web.Context.ExecuteQuery();
}
else
{
throw new Exception("A list, survey, discussion board, or document library with the specified title already exists in this website. Please choose another title.");
}
}
CreateLibrary chama RemoveContentTypeByNameem ListExtensions.cs, que faz parte do OfficeDevPnP.Core. RemoveContentTypeByName remove o tipo de conteúdo padrão na biblioteca de documentos.
public static void RemoveContentTypeByName(this List list, string contentTypeName)
{
if (string.IsNullOrEmpty(contentTypeName))
{
throw (contentTypeName == null)
? new ArgumentNullException("contentTypeName")
: new ArgumentException(CoreResources.Exception_Message_EmptyString_Arg, "contentTypeName");
}
ContentTypeCollection _cts = list.ContentTypes;
list.Context.Load(_cts);
IEnumerable<ContentType> _results = list.Context.LoadQuery<ContentType>(_cts.Where(item => item.Name == contentTypeName));
list.Context.ExecuteQuery();
ContentType _ct = _results.FirstOrDefault();
if (_ct != null)
{
_ct.DeleteObject();
list.Update();
list.Context.ExecuteQuery();
}
}
Depois de criar a biblioteca de documentos, acesse Configurações de biblioteca na biblioteca de documentos para examinar o nome, a descrição, a configuração de controle de versão do documento, o tipo de conteúdo e os campos personalizados atribuídos ao suplemento à biblioteca de documentos.
Configurações de biblioteca aplicadas pelo suplemento