我们有一个使用现成的内容编辑器webpart对内容进行了大量开发的sharepoint网站。在使用除IE之外的任何其他浏览器时,这有点垃圾。
我们考虑更新到免费的Telerik内容编辑器,但是我们希望自己保存大量的复制和粘贴,然后单击并选择交换Web部件。
似乎没有正式的升级路径,但在我看来,必须有可能使用代码(tm)的力量来获取原始webpart的内容,新建一个telerik webopart并将内容放入新的webpart ...然后删除旧的原始Web部件。
有没有人做过这种事情?如何布置代码并实际运行将进行交换的代码(如果可能的话)。一个带有“Do Swap”按钮的新webpart?还是更复杂的东西?
我还需要遍历每个页面和子网站(以及子网站中的页面)并查看每个Web部件。这样做有最佳实践方法吗?
谢谢,并且抱歉有点啰嗦!
答案 0 :(得分:2)
我会为此编写一个控制台应用程序。
打开根网并遍历其子网。 通过打开WebPartManager,完成每个页面所需的工作。
这里有一些伪代码可以帮助你入门。
string SourceUrl = "http://ThisWeb";
using (SPSite sourceSite = new SPSite(SourceURL))
{
using (SPWeb sourceWeb = sourceSite.OpenWeb(SourceURL))
{
IterateSubWebsProd(sourceWeb):
}
}
private void IterateSubWebsProd(SPWeb sourceWeb)
{
// This is the migration function
DoThingyWithThisWeb(sourceWeb);
foreach (SPWeb subWeb in sourceWeb.Webs)
{
IterateSubWebsProd(subWeb);
subWeb.Dispose();
}
}
private void DoThingyWithThisWeb(SPWeb sourceWeb)
{
PublishingPage currentPage = null;
string currentPageName = "<something>";
// Find the pages that you want to modify, with a CAML query for example
SPQuery query = new SPQuery();
query.Query = string.Format("" +
"<Where>" +
"<Eq>" +
"<FieldRef Name='FileLeafRef' />" +
"<Value Type='File'>{0}</Value>" +
"</Eq>" +
"</Where>" +
"", currentPageName);
// This codesnippet is from a Publishing web example
PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(sourceWeb);
PublishingPageCollection pageColl = publishingWeb.GetPublishingPages(query);
if (pageColl.Count > 0)
{
currentPage = pageColl[0];
}
using (SPLimitedWebPartManager wpMan = currentPage.ListItem.File.GetLimitedWebPartManager(System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared))
{
foreach (WebPart wp in wpMan.WebParts)
{
if (wp.GetType().Equals(typeof(Microsoft.SharePoint.WebPartPages.ContentEditorWebPart)))
{
Microsoft.SharePoint.WebPartPages.ContentEditorWebPart thisWebPart = wp as Microsoft.SharePoint.WebPartPages.ContentEditorWebPart;
// This is just dummy code, here you will do your content migration
XmlDocument xmlDoc = new XmlDocument();
XmlElement xmlElement = xmlDoc.CreateElement("RootElement");
xmlElement.InnerText = sourceItem[SourceField].ToString();
thisWebPart.Content = xmlElement;
wpMan.SaveChanges(thisWebPart);
}
}
}
}
答案 1 :(得分:1)
我对此并不是100%肯定,但如果您的内容作为单独的字段保存到列表中,您是否可以将Telerik控件指向保存内容的位置?这可能会导致Telerik控件在第一次编辑该内容时出现一些问题,但他们应该可以重新格式化内容并恢复。