2009-08-12 8 views
2

Je n'ai pas travaillé avec des webparts pour sharepoint auparavant, mais j'ai besoin de changer un webpart, qui doit être propagé sur quelque 700 sites web. C'est un changement à l'une des propriétés de la partie web, la valeur doit être changée. Existe-t-il un moyen d'obtenir des métadonnées pour une partie Web et de la modifier directement dans la base de données (je suppose que c'est là où elle est stockée)?WebPart "métadonnées"?

Voici le scénario: Webpart contient une liste délimitée par des virgules de types de documents (type interne) qu'il doit afficher. Maintenant, il y a un nouveau document. types qui doivent être ajoutés à tous les 700 sites Web. J'ai besoin d'un moyen d'énumérer les sites Web, d'obtenir les métadonnées du webpart et d'ajouter ces nouveaux types de documents à webpart. Actuellement, ils vont manuellement à chaque site Web, cliquez sur modifier, tapez le nouveau type de document et enregistrez-le.

Répondre

3

Comme d'autres ont dit que la bonne approche est de réaliser par programme ce plutôt que de modifier la base de données de contenu qui rendra votre installation insupportable. J'utilise régulièrement une application console pour le faire dans une collection de sites constituée de sites créés à partir d'un modèle de site.

Voici un exemple qui modifie la propriété Title d'une ListViewWebPart. Mis à jour pour inclure le code pour la boucle récursive. Je n'ai pas testé cela mais ça devrait marcher.

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

Cela fonctionnera pour le scénario que je viens d'ajouter. Tous les sites Web ont été créés à partir de la tamplate. Est-ce que sharepoint a un moyen d'énumérer ces sites Web et d'obtenir une instance de webpart pour chaque site Web? – epitka

+0

Comme mentionné dans la première version de ma réponse, oui cela peut être fait mais je l'ai omis pour garder les choses courtes. J'ai maintenant mis à jour la réponse avec un échantillon de code complet. –

+0

Où devons-nous disposer de web dans webpart manager? – Evgeny

3

L'accès direct aux bases de données de contenu sharepoint est un gros «non non». C'est la réponse officielle. :)

Cela étant dit, j'ai seulement regardé dans les bases de données de contenu et n'a jamais essayé de changer quoi que ce soit manuellement.

Ma suggestion serait de modifier la partie Web existante pour modifier la propriété en fonction des propriétés actuellement définies. (Je suppose que certaines propriétés actuellement définies ne sont pas valides ou doivent être mises à jour en fonction des modifications apportées à l'infrastructure.) ... Si c'est le cas, vous pouvez valider la propriété; s'assurer que la propriété actuelle est changée pour ce qu'elle doit être, et/ou s'assurer que les futurs changements de propriété sont valides.

Bonne chance!

2

NE PAS

Sérieusement, ne vont pas dans les bases de données de contenu et de le modifier. De cette façon, vous ne serez plus supporté si quelque chose devait arriver et Microsoft ne vous supportera plus (pas avant que vous ne restauriez la base de données à une version antérieure à partir d'une sauvegarde).

Vous pouvez utiliser l'API pour accéder à webparts dans vos sites, voici un code qui devrait vous aider à démarrer:

Enumerate page webparts

Questions connexes