The content you're reading is getting on in years
This post is on the older side and its content may be out of date.
Be sure to visit our blogs homepage for our latest news, updates and information.
Sitefinity offers Shared Content Block, which allows static content on multiple pages to be easily managed from one place, eliminating the need of going through every page and editing it. However, in some cases, there are content blocks that are not shared and we would like to easily replace content on them.
This can be done by going through all pages, finding the content blocks and doing a search and replace in the html. Here is a video of the end result: ttp://screencast.com/t/qUi7DL5AxpI
Here is the full code for the sample:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SearchAndReplace.aspx.cs" Inherits="SitefinityWebApp.SearchAndReplace" %>
<!DOCTYPE html>
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
<
head
runat
=
"server"
>
<
title
></
title
>
</
head
>
<
body
>
<
form
id
=
"form1"
runat
=
"server"
>
<
div
>
culture:<
asp:TextBox
id
=
"cultureTxtBox"
runat
=
"server"
/>
Search:<
asp:TextBox
ID
=
"srchContentTxtxBox"
runat
=
"server"
/>
Replace:<
asp:TextBox
ID
=
"replaceContentTxtxBox"
runat
=
"server"
></
asp:TextBox
>
Do:<
asp:Button
ID
=
"srchAndReplaceBtn"
Text
=
"Search and replace"
runat
=
"server"
/>
Done:<
asp:Literal
ID
=
"statusLiteral"
runat
=
"server"
/>
</
div
>
</
form
>
</
body
>
</
html
>
using
System;
using
System.Globalization;
using
System.Linq;
using
Telerik.Sitefinity.Abstractions;
using
Telerik.Sitefinity.Modules.GenericContent.Web.UI;
using
Telerik.Sitefinity.Modules.Pages;
using
Telerik.Sitefinity.Pages.Model;
namespace
SitefinityWebApp
{
public
partial
class
SearchAndReplace : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e)
{
srchAndReplaceBtn.Click += srchAndReplaceBtn_Click;
}
void
srchAndReplaceBtn_Click(
object
sender, EventArgs e)
{
var replacedInstances = GlobalSearchAndReplace(srchContentTxtxBox.Text, replaceContentTxtxBox.Text,
this
.cultureTxtBox.Text);
this
.statusLiteral.Text = String.Format(
"{0} ocurrences replaced"
, replacedInstances);
}
public
int
GlobalSearchAndReplace(
string
searchString,
string
replaceString,
string
cultureName=
"en"
)
{
var replaceCount = 0;
var pageManager = PageManager.GetManager();
var pageNodes = pageManager.GetPageNodes().Where(p => p.RootNodeId == SiteInitializer.FrontendRootNodeId);
foreach
(var pageNode
in
pageNodes)
{
// var pageNode = pageManager.GetPageNodes().Where(p => p.Title == "imageullsize").FirstOrDefault();
PageDraft temp;
PageDraft pageEdit;
if
(pageNode !=
null
)
{
var page = pageNode.Page;
if
(page !=
null
)
{
var temps = page.Drafts.Where(d => d.IsTempDraft ==
true
).ToList();
if
(temps.Count > 1)
pageEdit = temps.FirstOrDefault();
else
pageEdit = pageManager.PagesLifecycle.Edit(page);
try
{
temp = pageManager.PagesLifecycle.CheckOut(pageEdit);
var culture = CultureInfo.GetCultureInfo(cultureName);
foreach
(var control
in
temp.Controls)
{
if
(control.ObjectType ==
typeof
(ContentBlock).FullName)
{
//get the control HTML property from the database
var htmlProperty = control.GetProperties(culture,
false
).Where(p => p.Name ==
"Html"
).SingleOrDefault();
if
(htmlProperty !=
null
)
{
//get the control HTML
var contentBlockHtml = htmlProperty.Value;
////update the HTML property in the database
if
(contentBlockHtml.ToString().Contains(searchString))
{
var newHtml = contentBlockHtml.ToString().Replace(searchString, replaceString);
htmlProperty.Value = newHtml;
htmlProperty.MultilingualValue = newHtml;
replaceCount++;
}
}
//Save the changes
pageManager.SaveChanges();
//Checking the temp and publish
pageEdit = pageManager.PagesLifecycle.CheckIn(temp);
pageManager.PagesLifecycle.Publish(pageEdit);
pageManager.SaveChanges();
}
}
}
catch
(Exception ex)
{
}
}
}
}
return
replaceCount;
}
}
}
Atanas Valchev is a Tech Support Engineer at Telerik. He joined the Sitefinity Support team in March 2012.
Let our experts teach you how to use Sitefinity's best-in-class features to deliver compelling digital experiences.
Learn MoreSubscribe to get all the news, info and tutorials you need to build better business apps and sites
Progress collects the Personal Information set out in our Privacy Policy and the Supplemental Privacy notice for residents of California and other US States and uses it for the purposes stated in that policy.
You can also ask us not to share your Personal Information to third parties here: Do Not Sell or Share My Info
We see that you have already chosen to receive marketing materials from us. If you wish to change this at any time you may do so by clicking here.
Thank you for your continued interest in Progress. Based on either your previous activity on our websites or our ongoing relationship, we will keep you updated on our products, solutions, services, company news and events. If you decide that you want to be removed from our mailing lists at any time, you can change your contact preferences by clicking here.