2009-08-12 12 views
2

私は前にsharepointのwebpartsを使っていませんでしたが、Webpartに変更を加える必要があります。これは700のWebサイトに伝播する必要があります。 Webパーツのプロパティの1つに変更が加えられた場合、値を変更する必要があります。 Webパーツのメタデータを取得し、それをデータベースで直接変更する方法はありますか(それが格納されている場所であると仮定します)。WebPartの「メタデータ」?

シナリオは次のとおりです。Webpartには、表示する必要があるドキュメントタイプ(内部タイプ)のカンマ区切りリストが含まれています。今すぐ新しい文書があります。 700種類のウェブサイトすべてに追加する必要があるタイプです。ウェブサイトを列挙し、Webパーツのメタデータを取得し、これらの新しいタイプのドキュメントをwebpartに追加する方法が必要です。現在、各Webサイトに手動で移動し、編集をクリックし、新しい文書タイプを入力して保存します。

答えて

3

他の人が正しいアプローチは、プログラムでこれを実現するのではなく、編集することであると述べてきたように:

あなたのサイトにWebパーツにアクセスするためのAPIを使用することができますが、ここでの作業を開始すべきいくつかのコードですあなたのインストールをサポートできなくするコンテンツデータベース。私は定期的にコンソールアプリケーションを使用して、サイトテンプレートから作成されたサイトで構成されるサイトコレクションでこれを行います。

ここでは、ListViewWebPartのTitleプロパティを変更する例を示します。再帰的ループのコードを含むように更新されました。私はこれをテストしていないが、うまくいくはずです。

private static void ProcessSiteCollection(string url) 
{ 
    using (SPSite siteCollection = new SPSite(url)) 
    { 
     SPWeb rootWeb = siteCollection.RootWeb; 
     ProcessWebs(rootWeb); 
    } 
} 

private static void ProcessWebs(SPWeb parentWeb) 
{ 
    foreach (SPWeb web in parentWeb.Webs) 
    { 
     try 
     { 
      UpdateWebPart(web); // Set web part properties 
      ProcessWebs(web); // Recursively loop through children 
     } 
     finally 
     { 
      web.Dispose(); 
     } 
    } 
} 

private static void UpdateWebPart(SPWeb web) 
{ 
    using (SPLimitedWebPartManager webPartManager = 
     web.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared)) 
    { 
     try 
     { 
      foreach (WebPart webPart in webPartManager.WebParts) 
      { 
        if (webPart.Title == "My Web Part") 
        { 
          ListViewWebPart listViewWebPart = (ListViewWebPart)webPart; 
          listViewWebPart.Title = "Updated Web Part"; 
          webPartManager.SaveChanges(listViewWebPart); 
          web.Update(); 
          break; 
        } 
      } 
     } 
     finally 
     { 
      webPartManager.Web.Dispose(); 
     } 
    } 
} 
+1

これは、今追加したシナリオでは機能しますか。すべてのウェブサイトは、tamplateから作成されました。 SharepointにはこれらのWebサイトを列挙し、各Webサイトのwebpartインスタンスを取得する方法がありますか? – epitka

+0

私の答えの最初のバージョンで述べたように、はいこれを行うことができますが、私はそれを省略するために省略しました。私は完全なコードサンプルで答えを更新しました。 –

+0

WebパーツマネージャーでWebを処分する必要がありますか? – Evgeny

3

Sharepointのコンテンツデータベースに直接アクセスすることは大きな「no no」です。それは正式な答えです。 :)

私はコンテンツデータベースを調べたことがあり、手動で実際に何かを変更しようとしたことはありません。

私の提案は、現在設定されているプロパティに基づいてプロパティを変更するように既存のWebパーツを変更することです。 (現在設定されているプロパティの一部が無効であるか、インフラストラクチャの変更に基づいて更新する必要があると仮定しています)...これが当てはまる場合は、プロパティを検証できます。現在のプロパティが必要なものに変更されていること、および/または将来のプロパティの変更が有効であることを確認すること。

幸運を祈る!

2

を真剣にしないで

をDO、コンテンツデータベースに移動して、それを編集しないでください。そうすれば、何らかの事態が発生してもMicrosoftはもうサポートしません(バックアップからデータベースを元のバージョンに戻すまでは、サポートされなくなります)。

Enumerate page webparts