Поделиться через


Пример надстройки SharePoint с шаблонами библиотек документов

В примере ECM.DocumentLibraries показано, как с помощью надстройки, размещенной у поставщика, создать список или библиотеку документов, назначить ей тип контента и удалить тип контента, применяемый по умолчанию.

Используйте это решение для следующих задач:

  • Создание списка или библиотеки документов и применение типа контента по умолчанию.
  • Обеспечение расширенного управления добавлением, обслуживанием или реализацией локализованных версий настраиваемых полей.
  • Удаление типа контента по умолчанию в списке или библиотеке.
  • Применение параметров конфигурации библиотеки при создании списка или библиотеки.

Перед началом работы

Чтобы приступить к работе, скачайте пример надстройки ECM.DocumentLibraries из проекта Office 365 Developer Patterns and Practices (Шаблоны и методики разработки для Office 365) на портале GitHub.

Примечание.

Код, приведенный в этой статье, предоставляется "как есть" без какой-либо явной или подразумеваемой гарантии, включая подразумеваемые гарантии пригодности для какой-либо цели, для продажи или гарантии отсутствия нарушения прав иных правообладателей.

У пользователей с доступом к примеру надстройки ECM.DocumentLibraries должны быть разрешения на управление списками. Метод DoesUserHavePermission в Default.aspx.cs проверяет разрешения пользователя, чтобы убедиться, что он может управлять списками. Если у пользователя нет разрешений на управление списками, надстройка демонстрирует пользователю сообщение об ошибке.

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

Использование примера надстройки ECM.DocumentLibraries

При запуске этой надстройки отображается начальная страница, как показано на следующем рисунке. Начальная страница ECM.DocumentLibraries похожа на страницу добавления новой библиотеки документов, когда вы выбираете Контент сайта>Добавить приложение>Библиотека документов>Дополнительные параметры, но с одним отличием. Когда вы запускаете надстройку, в списке шаблонов документов отображается настраиваемый шаблон библиотеки документов, ИТ-документ и документ Contoso. Когда пользователь выбирает Создать, выбранный настраиваемый тип контента назначается новой библиотеке документов.

Начальная страница примера надстройки ECM.DocumentLibraries

Снимок экрана: начальная страница примера надстройки ECM.DocumentLibraries с раскрывающимся списком шаблонов документов, в котором представлен ИТ-документ.


Когда пользователи выбирают Создать, метод CreateLibrary_Click в Default.aspx.cs проверяет выбранный шаблон по умолчанию и вызывает метод CreateITDocumentLibrary или CreateContosoDocumentLibrary в ContentTypeManager.cs, как показано в следующем коде.

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


Затем метод CreateContosoDocumentLibrary выполняет указанные ниже задачи, как показано в следующем примере кода.

  • Создает настраиваемые поля в службе управляемых метаданных.
  • Создает тип контента.
  • Связывает настраиваемые поля с типами контента.
  • Создает библиотеку документов с типом контента.
        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 вызывает метод CreateTaxonomyField, который является частью OfficeDevPnP.Core. CreateTaxonomyField создает поле в службе управляемых метаданных из надстройки, размещенной у поставщика.

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 вызывает метод CreateContentType, который является частью OfficeDevPnP.Core. CreateContentType создает новый тип контента.

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 вызывает метод AddFieldToContentTypeById, который является частью OfficeDevPnP.Core. AddFieldToContentTypeById связывает поле с типом контента.

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 вызывает метод CreateLibrary в ContentTypeManager.cs для создания библиотеки документов. Метод CreateLibrary назначает параметры библиотеки, например описание библиотеки документов, версии документов и связанные типы контента.

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 вызывает RemoveContentTypeByName в ListExtensions.cs, который является частью OfficeDevPnP.Core. RemoveContentTypeByName удаляет тип контента по умолчанию в библиотеке документов.

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

После создания библиотеки документов перейдите в Параметры библиотеки в библиотеке документов, чтобы просмотреть имя, описание, параметр управления версиями документа, тип контента и настраиваемые поля, которые надстройка назначила вашей библиотеке документов.

Параметры библиотеки, примененные надстройкой

Снимок экрана: страница параметров библиотеки документов с выделенными полями имени, веб-адреса и описания.

См. также