Introducción
Estamos trabajando en AVANADE participando de un proyecto de desarrollo para una importante cadena de supermercados. Estamos realizando un sitio web basado en SharePoint 2010 que utilizaran los empleados como portal interno.Necesidad
Necesitamos que las webparts aparezcan cargadas en la página luego de hacer el deploy. Lo primero que intentamos fue reproducir los controls dentro de .aspx pero el problema que tuvimos fue que no podían ser modificados desde el front-end de SharePoint.
Solución
Para agregar las webpart desde un solo deploy creamos dos features, una para deployar los archivos necesarios, por ejemplo la página de default, y otra que es la que inyectará las webparts a las respectivas paginas.
Abajo explicaremos los pasos a seguir para poder realizar este procedimiento.
Feature 1:
Se encargara de agregar las webparts a nuestro proyecto para poder utilizarlas1. Hacemos click derecho en la carpeta donde se contienen las features y hacemos click en Add Feature. El scope de la feature debe ser SITE.
2. Agregamos los controles que queremos que se deployen con esta feature, en nuestro caso las paginas, webparts, controles, etc..
Feature 2:
1. Creamos una feature para que al activarse se ejecute el código que agrega la webpart. El scope de la feactures es nivel site.
2. Una vez creada la feature debemos agregar un event received y sobre escribir el método FeatureActivated. Este medo recibe como parámetro un SPFeatureReceiverProperties. Con este parámetro nosotros podemos obtener el spSite al que pertenece y con este último saber finalmente a que spWeb nos referimos. Asignandole la propiedad AllowUnsafeUpdates a la web permitimos agregar la webpart.
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
if (properties.Feature.Parent is SPSite)
// This is a site collection
SPSite siteCollection = properties.Feature.Parent as SPSite;
// This is the top level site in the site collection
SPWeb rootWeb = siteCollection.RootWeb;
rootWeb.AllowUnsafeUpdates = true;
3. Con el SPWeb obteneos el SPFile y con el podemos finalmente llegar al SPLimitedWebPartManager el cual contiene los métodos que utilizaremos para agregar las webpart a la pagina.
SPFile file = rootWeb.GetFile(@"PAges\Home.aspx");
if (file.CheckOutType == SPFile.SPCheckOutType.None) file.CheckOut();
SPLimitedWebPartManager manager =
file.GetLimitedWebPartManager(PersonalizationScope.Shared);
4. Por otro lado solo nos queda crear la webpart que queremos agregar, para esto tenemos dos opciones. Utilizar las webparts OOB o exportando una webpart desde el sharepoint.
5. Si vamos a utilizar una webpart out of the box o una custom webpart solo debemos instanciar el objeto, dale valor a las propiedades y luego agregarla con el manager creado en el punto 3.
ContentByQueryWebPart myWebPart = new ContentByQueryWebPart();
myWebPart.Title = "Links";
myWebPart.ListName = "Links";
manager.AddWebPart(myWebPart, "LeftColumn", 3);
manager.SaveChanges(myWebPart);
6. Si queremos utilizar una webpart de una página ya existente podemos exportarla haciendo click en export…
7. Para utilizar esta webpart exportada debemos primero leer el archivo con un XmlTextReader para luego castearlo a webpart.
string url = string.Empty;
XmlTextReader reader = null;
// Add the Announcements Web Part
url = rootWeb.Url + "/_catalogs/wp/announcement.webpart";
reader = new XmlTextReader(new StringReader(rootWeb.GetFileAsString(url)));
Microsoft.SharePoint.WebPartPages.WebPart announcementsWebPart =
(Microsoft.SharePoint.WebPartPages.WebPart)manager.ImportWebPart(reader,
out announcementsWebPartError);
manager.AddWebPart(announcementsWebPart, announcementsWebPartZoneID, 0);
manager.SaveChanges(announcementsWebPart);
8. Una vez realizado esto volvemos la property AllowUnsafeUpdates a false.
web.AllowUnsafeUpdates = false;
Por último para quitar las webparts desde el código.
9. En la misma feature sobre escribimos el metodo FeatureDeactivating. Y volvemos a realizar todo el proceso para obtener el SPLimitedWebPartManager. Después debemos poner la propiedad AllowUnsafeUpdates con el valor true.
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
SPSite siteCollection = properties.Feature.Parent as SPSite;
SPWeb rootWeb = siteCollection.RootWeb;
SPLimitedWebPartManager webPartManager = rootWeb.GetLimitedWebPartManager(rootWeb.Url + @"\Pages\Home.aspx", PersonalizationScope.Shared);
rootWeb.AllowUnsafeUpdates = true;
10. Luego recorremos con un for las webparts de la web y desactivamos la que nosotros queremos.
for (int i = webPartManager.WebParts.Count - 1; i > -1; i--)
{
if (webPartManager.WebParts[i].Title == webPartTitle)
{
webPartManager.DeleteWebPart(webPartManager.WebParts[i]);
// don't break because there could be more than one.
}
}
11. Al finalizar todo el proceso debemos modificar la propiedad AllowUnsafeUpdates nuevamente.
web.AllowUnsafeUpdates = false;