Автоматическое создание списка и папки при активации функции в SharePoint 2007
Я разрабатываю функцию, которая будет предоставлена для веб-сайта SharePoint 2007. Конфигурационные файлы функции приведены ниже.
Что я хочу, чтобы произошла, когда функция установлена и активирована:
- Список с именем xxx, который будет создан в Интернете, где эта функция активирована.
- В этом списке будет создана папка с именем yyy.
- Файл page1.aspx должен быть помещен в эту папку.
Пока что я получаю ошибки при попытке активировать функцию, но если я создаю список и папку вручную, тогда файл помещается туда.
Итак, вопрос в том, как сделать так, чтобы список и папка создавались автоматически?
feature.xml
<?xml version="1.0" encoding="utf-8"?>
<Feature Id="5EAAAAD9-E885-43f8-B2FD-4C63271E7BAA"
Title="ABC"
Description="ABC"
Version="1.0.0.0"
Hidden="FALSE"
Scope="Web"
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest Location="elements.xml"/>
<ElementFile Location="CustomPages/yyy/page1.aspx" />
</ElementManifests>
</Feature>
Elements.xml
<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Name="Module1" Url="xxx/yyy" RootWebOnly="TRUE" Path="CustomPages/yyy">
<File IgnoreIfAlreadyExists="TRUE" Type="GhostableInLibrary" Url="page1.aspx"></File>
</Module>
</Elements>
1 ответ
Если вы можете использовать пользовательский код, вы можете переопределить FeatureActivated event receiver
функции для создания списка и папки.
Вам нужно будет создать еще одну функцию для ее запуска, прежде чем эта функция предоставит файлы и даст функции предоставления файлов зависимость от первой, чтобы обеспечить доступность списка.
В качестве альтернативы вы можете добавить определение списка и экземпляр через xml. Я лично избегаю этот маршрут, когда это возможно, но вы можете найти руководство по этому вопросу в MSDN - Создание определений списков с помощью настраиваемых столбцов списков для SharePoint Server 2007
Пример добавления списка с помощью кода (предостережение - у меня нет 2007 года для тестирования, но это работает в 2010 году, и я не думаю, что я использовал какой-либо специальный код 2010 года)
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWeb web = properties.Feature.Parent as SPWeb; // Assuming web scoped feature
SPList customPagesList;
bool listExists = true;
//Check to see if the list exists, this method sucks but 2007 doesn't have web.TryGetList()
try
{
customPagesList = web.GetList("/CustomPages"); // server relative url of the list
}
catch (FileNotFoundException e)
{
listExists = false;
}
if (!listExists)
{
// Create list and record returned guid
Guid customPagesListGuid = web.Lists.Add("CustomPages",
"Library to store web pages used in the site", SPListTemplateType.DocumentLibrary);
//Get list from stored guid
customPagesList = web.Lists[customPagesListGuid];
// Set list properties and add required content types
customPagesList.Title = "CustomPages";
customPagesList.OnQuickLaunch = false; // Set to true to display on the quick launch
customPagesList.ContentTypesEnabled = true;
customPagesList.NoCrawl = true; // Set to false if you want pages indexed by search
customPagesList.EnableFolderCreation = true;
customPagesList.EnableSyndication = false; // Turn off rss
SPContentType webPartPageCT = web.AvailableContentTypes[SPBuiltInContentTypeId.WebPartPage];
SPContentType basicPageCT = web.AvailableContentTypes[SPBuiltInContentTypeId.BasicPage];
customPagesList.ContentTypes.Add(webPartPageCT);
customPagesList.ContentTypes.Add(basicPageCT);
// Remove the default content type added on list creation if it is not needed
DeleteContentType(customPagesList.ContentTypes, "Document");
// Commit changes
customPagesList.Update();
//Get library from stored guid
SPDocumentLibrary customPagesLibrary = (SPDocumentLibrary)web.Lists[customPagesListGuid];
customPagesLibrary.Folders.Add("/Lists/CustomPages/yyy", SPFileSystemObjectType.Folder);
string rootFolderUrl = customPagesLibrary.RootFolder.ServerRelativeUrl;
SPListItem newFolder = customPagesLibrary.Folders.Add(rootFolderUrl, SPFileSystemObjectType.Folder, "yyy");
newFolder.Update();
}
}
private void DeleteContentType(SPContentTypeCollection ctCollection, string ctName)
{
foreach (SPContentType ct in ctCollection)
{
if (ct.Name.Equals(ctName))
{
ct.Delete();
}
}
}