Programmatically changing user control content
I'm trying to write a method that will look into the custom controls we have in our pages and replace certain pieces of text. With the code below, I seem to be able to get to the container but not the control.
Can you please let me know where I'm missing it?
CmsManager cmsManager =
new
CmsManager();
foreach
(ICmsWebControl control
in
page.Controls)
if
(control.ControlType ==
typeof
(Telerik.Cms.Engine.WebControls.GenericContent))
Telerik.Cms.Engine.WebControls.GenericContent goControl = control.LoadControl(
this
)
as
Telerik.Cms.Engine.WebControls.GenericContent;
if
(goControl.Content.Contains(
"ReplaceMe"
))
goControl.Content = goControl.Content.Replace(
"ReplaceMe"
,
"newText"
);
cmsManager.SaveControl(control);
Hi Jason,
This looks like as a code for Sitefinity 3.x edition. Please check this article . You should work with staged version of the page and you should better specify a container. If you do not make an automated tool you can query the following tables of the database
For public controls like GenericContent you have to update [sf_CmsControlProperty] table.
For backend - modules you have to update -[sf_CmsTextContent]
Greetings,
Ivan Dimitrov
the Telerik team
Ivan,
Thank you for your reply. I tried using that code earlier and the trouble with it and with my code is that this line :
Telerik.Cms.Engine.WebControls.GenericContent gcCtrl = webCtrl.LoadControl() as Telerik.Cms.Engine.WebControls.GenericContent;
returns nothing - and I don't know why. I tried using the example you referenced but I ran into the same result.
Here is the code as it stands, I'm not using the currentNode as in the example, I allow the user to select a parent page and then I change everything in that pagegroup. Also I'm not calling page.publish() because I read that SavePage(page) was more efficient.
01.
protected
void
FindAndReplace(Guid parentPage)
02.
03.
CmsManager cmsManager =
new
CmsManager();
04.
// Gets all child pages of page
05.
IList childPages = cmsManager.GetPages(parentPage);
06.
string
pageName =
string
.Empty;
07.
foreach
(ICmsPage cmsPage
in
childPages)
08.
09.
ICmsPage page = (ICmsPage)cmsManager.GetPage(cmsPage.ID,
true
);
10.
// If group page get child pages
11.
if
(cmsPage.Pages.Count > 0 || cmsPage.PageType == CmsPageType.Group)
12.
13.
this
.FindAndReplace(page.ID);
14.
15.
else
16.
if
(
this
.ReplacePhraseInPageProperties(cmsPage))
17.
18.
cmsManager.SavePage(cmsPage);
19.
20.
21.
22.
23.
private
bool
ReplacePhraseInPageProperties(ICmsPage page)
24.
25.
bool
modified =
false
;
26.
if
(page.Title.IndexOf(
"find"
) > -1)
27.
28.
page.Title = page.Title.Replace(
"find"
,
"replace"
);
29.
modified =
true
;
30.
31.
if
(page.MenuName.IndexOf(
"find"
) > -1)
32.
33.
page.MenuName = page.MenuName.Replace(
"find"
,
"replace"
);
34.
modified =
true
;
35.
36.
if
(page.Description.IndexOf(
"find"
) > -1)
37.
38.
page.Description = page.Description.Replace(
"find"
,
"replace"
);
39.
modified =
true
;
40.
41.
if
(page.Name.IndexOf(
"find"
) > -1)
42.
43.
page.Name = page.Name.Replace(
"find"
,
"replace"
);
44.
modified =
true
;
45.
46.
// create a new instance of CmsManager
47.
Telerik.Cms.CmsManager cmsManager =
new
Telerik.Cms.CmsManager();
48.
// we are going to use Controls collection of a staged version of a page to
49.
// access all controls of current page
50.
IList<Telerik.Cms.ICmsWebControl> pageControls = page.Staged.Controls;
51.
// to each Generic Content control in SideBarContent we are going to append "[Obsolete]" text
52.
foreach
(Telerik.Cms.ICmsWebControl webCtrl
in
pageControls)
53.
54.
if
(webCtrl.ControlType ==
typeof
(Telerik.Cms.Engine.WebControls.GenericContent))
55.
56.
// the following line clearly demonstrates the difference between ICmsWebControl (any control that exists on the Sitefinity page)
57.
// and the actual control this ICmsWebControl carries. We have checked if ControlType of webCtrl is GenericContent, but to get
58.
// the actual instance of GenericContent control, we need to call the LoadControl() function of ICmsWebControl. You can think
59.
// of ICmsWebControl objects as Sitefinity wrapper for the actual control
60.
Telerik.Cms.Engine.WebControls.GenericContent gcCtrl = webCtrl.LoadControl()
as
Telerik.Cms.Engine.WebControls.GenericContent;
61.
if
(gcCtrl !=
null
)
62.
63.
if
(gcCtrl.Content.Contains(
"find"
))
64.
65.
gcCtrl.Content = gcCtrl.Content.Replace(
"find"
,
"replace"
);
66.
cmsManager.SaveControl(webCtrl);
67.
modified =
true
;
68.
69.
70.
71.
72.
// finally we need to publish the current page and refresh it to see the results
73.
return
modified;
74.
Looking at this, can you see why it doesn't work?
Hi Jason,
Could you verify that the control of type GenericContent is found on the page? I checked the code on a sample page and it works properly at my end.
Best wishes,
Ivan Dimitrov
the Telerik team