0

SharePoint 2007 Web にプロビジョニングされる機能を開発しています。機能構成ファイルは以下のとおりです。

機能がインストールされてアクティブ化されたときに私がしたいこと:

  1. 機能がアクティブ化されている Web の下に作成される xxx という名前のリスト。
  2. そのリストの下に作成される yyy という名前のフォルダー。
  3. そのフォルダーの下に配置されるファイル page1.aspx。

今のところ、機能を有効にしようとするとエラーが発生しますが、リストとフォルダーを手動で作成すると、ファイルがそこに配置されます。

問題は、リストとフォルダが自動的に作成されるようにするにはどうすればよいかということです。

機能.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>

要素.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>
4

1 に答える 1

2

カスタム コードを使用できる場合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();
        }
    }
}
于 2013-10-24T12:59:24.087 に答える