Compartir vía


Complemento de SharePoint de muestra de plantillas de biblioteca de documentos

La muestra de ECM.DocumentLibraries muestra cómo usar un complemento alojado por el proveedor para crear una lista o biblioteca de documentos, asignarle un tipo de contenido y quitar el tipo de contenido predeterminado.

Use esta solución si quiere:

  • Crear una lista o biblioteca de documentos y aplicar un tipo de contenido predeterminado.
  • Imponer un mayor control sobre la adición, el mantenimiento o la implementación de versiones localizadas de los campos personalizados.
  • Quitar el tipo de contenido predeterminado en una lista o biblioteca.
  • Aplicar la configuración de biblioteca cuando se crea una lista o una biblioteca.

Antes de empezar

Para empezar, descargue el complemento de muestra ECM.DocumentLibraries desde el proyecto Modelos y prácticas para desarrolladores de Office 365 en GitHub.

Nota:

El código de este artículo se proporciona tal cual, sin garantía de ningún tipo, expresa o implícita, incluidas las garantías implícitas de aptitud para un propósito particular, comerciabilidad o ausencia de infracción.

Los usuarios que tienen acceso al complemento de muestra de ECM.DocumentLibraries deben tener permisos para administrar listas. El método DoesUserHavePermission en Default.aspx.cs comprueba los permisos de usuario para asegurarse de que puedan administrar listas. Si el usuario no tiene permisos para administrar listas, el complemento presenta un mensaje de error al usuario.

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 el complemento de muestra ECM.DocumentLibraries

Al iniciar este complemento, se muestra la página de inicio como se ve en la ilustración siguiente. La página de inicio de ECM.DocumentLibraries tiene el aspecto de una página para agregar una biblioteca de documentos nueva al seleccionar Contenidos del sitio>Agregar una aplicación>Biblioteca de documentos>Opciones avanzadas, con una diferencia. Al iniciar el complemento, la lista de plantillas de documento muestra una plantilla de la biblioteca de documentos personalizada, un documento de TI y un documento de Contoso. Cuando el usuario elige Crear, el tipo de contenido personalizado seleccionado se asigna a la biblioteca de documentos nueva.

Página de inicio del documento de muestra de ECM.DocumentLibraries

Captura de pantalla que muestra la página de inicio del complemento de muestra ECM.DocumentLibraries, con un cuadro desplegable de la plantilla de documento que contiene el documento de TI como una opción.


Cuando los usuarios eligen Crear, el método CreateLibrary_Click en Default.aspx.cs comprueba la plantilla predeterminada seleccionada y realiza llamadas al método CreateITDocumentLibrary o al CreateContosoDocumentLibrary de ContentTypeManager.cs, como se muestra en el siguiente código.

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


El método CreateContosoDocumentLibrary realizará las siguientes tareas, como se muestra en el ejemplo siguiente:

  • Crea campos personalizados en el servicio de metadatos administrados.
  • Crea un tipo de contenido.
  • Asocia los campos personalizados con los tipos de contenido.
  • Crea la biblioteca de documentos con el tipo de contenido.
        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 llama al método CreateTaxonomyField, que forma parte de la OfficeDevPnP.Core. CreateTaxonomyField crea un campo en el servicio de metadatos administrados desde el complemento proporcionado.

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 llama al método CreateContentType, que forma parte de OfficeDevPnP.Core. CreateContentType crea un nuevo tipo de contenido.

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 llama al método AddFieldToContentTypeById, que forma parte de OfficeDevPnP.Core. AddFieldToContentTypeById asocia un campo con un tipo de contenido.

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 llama al método CreateLibrary en ContentTypeManager.cs para crear la biblioteca de documentos. El método CreateLibrary asigna la configuración de biblioteca como los tipos de contenido asociados, el control de versiones del documento y la descripción de la biblioteca de documentos.

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 llama a RemoveContentTypeByName en ListExtensions.cs, que forma parte de OfficeDevPnP.Core. RemoveContentTypeByName quita el tipo de contenido predeterminado en la 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();
            }
        }

Después de crear la biblioteca de documentos, vaya a la Configuración de biblioteca en la biblioteca de documentos para revisar el nombre, la descripción, la configuración de control de versiones del documento, el tipo de contenido y los campos personalizados que el complemento asignó a la biblioteca de documentos.

Configuración de biblioteca aplicada por el complemento

Captura de pantalla de la página de configuración de la biblioteca de documentos, con los campos del nombre, de la dirección web y de la descripción resaltados.

Vea también