Social Icons

viernes, 3 de diciembre de 2010

Copiando ListViewWebParts entre diferentes sitios con sus correspondientes vistas personalizadas

Por un segundo he dudado si escribir el resto del post en el título.

En otro ejemplo de lo que ahora he dado en llamar Guerrilla Coding gracias a mis asombrosos conocimientos de la lengua que se habla en la pérfida Albión ahora puedo usar palabras como guerrilla en un par de horas tuve que hacer un programita para copiar cientos de páginas llenas de ListViewWebparts cada uno con su vista personalizada. Yo no sé vosotros, pero yo cada vez que tengo que tocar el ListViewWebpart me pongo a temblar...

Los ListViewWebparts crean en la lista de la que son "hijos" una vista Oculta cuando nosotros personalizamos la vista del webpart. Esto implica que para copiar los webparts a otro sitio tendremos que copiar las vistas en la lista del sitio de destino y apuntar al webpart a la nueva vista, no sé si me explico bien... mejor pondré un trozo de código...

Aquí lo que hago es copiar los webparts de cada fichero de origen al de destino, y les doy un tratamiento especial si son ListViewWebpart para esta aplicación es suficiente.

private static void CopyWebParts(SPFile origFile, SPFile destFile)
        {
            SPLimitedWebPartManager origWpm = origFile.GetLimitedWebPartManager(PersonalizationScope.Shared);
            SPLimitedWebPartManager destWpm = destFile.GetLimitedWebPartManager(PersonalizationScope.Shared);

            DeleteWebparts(destWpm);

            foreach (Microsoft.SharePoint.WebPartPages.WebPart webpart in origWpm.WebParts)
            {
                Microsoft.SharePoint.WebPartPages.WebPart newWp;

                if (webpart is ListViewWebPart)
                    newWp = UpdateListViewWebPart(webpart as ListViewWebPart, origFile.GetWeb(), destFile.GetWeb());
                else
                    newWp = webpart;

                destWpm.AddWebPart(newWp, Common.ConvertToString(newWp.ZoneID), newWp.ZoneIndex);
            }

            try
            {
                destFile.Publish("Added Web Parts");
                destFile.Approve("Web Part additions approved");
            }
            catch { }
        }

        private static ListViewWebPart UpdateListViewWebPart(ListViewWebPart webpart, SPWeb origWeb, SPWeb destWeb)
        {
            ListViewWebPart newWebPart = webpart; //yeah I know.

            string oldListName = webpart.ListName;
            string oldViewGuid = webpart.ViewGuid;

            SPList OrigList = origWeb.Lists.GetList(new Guid(oldListName), true);
            
            SPList DestList = destWeb.Lists[OrigList.Title];

            SPView OrigView = OrigList.GetView(new Guid(oldViewGuid));
            SPView DestView = DestList.Views.Add(string.Empty, OrigView.ViewFields.ToStringCollection(), OrigView.Query,
                OrigView.RowLimit, OrigView.Paged, OrigView.DefaultView);
            DestView.Hidden = OrigView.Hidden;
            DestView.Scope = OrigView.Scope;
            DestView.ApplyStyle(destWeb.ViewStyles.StyleByID(Convert.ToInt32(OrigView.StyleID)));

            DestView.Update();

            newWebPart.ViewGuid = DestView.ID.ToString("B").ToUpper();
            newWebPart.ListName = destWeb.Lists[OrigList.Title].ID.ToString("B").ToUpper();


            return newWebPart;
        }
Y, contra todo pronóstico, funcionó... Espero no tener que tocar estos webparts otra vez en mucho tiempo.

No hay comentarios: