Create backend menu item example
Hi,
Is there a example on creating a new menu node in the backend page from the module installation? Perhaps using the new fluent api?
thanks
Hello,
I took the source code from the Sitefinity documentation and made some changes. It is published here. The new page will be created under the parent backend page. I have marked the important changes I have made. The page is rendered as link and if you set the
protected
void
Page_Load(
object
sender, EventArgs e)
using
(var fluent = App.WorkWith())
//Get the parent backend page the new page will be created under.
//Alternatively you can pass Guid.Empty and it will be created in the root.
var myPage = fluent.Pages().LocatedIn(Telerik.Sitefinity.Fluent.Pages.PageLocation.Backend).Where(p => p.Title ==
"Content"
).Get().SingleOrDefault().Id;
CreatePage(Guid.NewGuid(),
"MyNewBackendLinkPage"
, myPage);
public
void
CreatePage(Guid pageId,
string
pageName, Guid parentPageNodeId,
bool
renderAsLink =
true
)
var pageDataId = Guid.NewGuid();
PageManager manager = PageManager.GetManager();
PageData pageData =
null
;
PageNode pageNode =
null
;
// Get the parent node Id
if
(parentPageNodeId == Guid.Empty)
parentPageNodeId = SiteInitializer.BackendRootNodeId;
PageNode parent = manager.GetPageNode(parentPageNodeId);
// Check whether exists
var initialPageNode = manager.GetPageNodes().Where(n => n.Id == pageId).SingleOrDefault();
if
(initialPageNode !=
null
)
return
;
// Create the page
pageData = manager.CreatePageData(pageDataId);
pageData.HtmlTitle = pageName;
pageData.Title = pageName;
pageData.Description = pageName;
pageData.Culture = Thread.CurrentThread.CurrentCulture.ToString();
pageData.UiCulture = Thread.CurrentThread.CurrentUICulture.ToString();
pageNode = manager.CreatePage(parent, pageId, NodeType.Standard);
pageNode.Page = pageData;
pageNode.Name = pageName;
pageNode.Description = pageName;
pageNode.Title = pageName;
pageNode.UrlName = Regex.Replace(pageName.ToLower(), @
"[^\w\-\!\$\'\(\)\=\@\d_]+"
,
"-"
);
pageNode.ShowInNavigation =
true
;
pageNode.DateCreated = DateTime.UtcNow;
pageNode.LastModified = DateTime.UtcNow;
//if set to false it will appear as Grouping page in the Backend Menu
pageNode.RenderAsLink = renderAsLink;
manager.SaveChanges();
// Publish
var bag =
new
Dictionary<
string
,
string
>();
bag.Add(
"ContentType"
,
typeof
(PageNode).FullName);
WorkflowManager.MessageWorkflow(pageId,
typeof
(PageNode),
null
,
"Publish"
,
false
, bag);
I modified it a bit using the fluent api example in the post, and it's working now.
just curious if there is a way to have the pagenode show up at the top even if there is no child pagenode?
// create the page
App.WorkWith().Page()
.CreateNewPageGroup(parentPageNodeId, pageId)
.Do(p =>
p.Title = pageName;
p.Description = pageName;
p.Title = pageName;
p.UrlName = Regex.Replace(pageName.ToLower(), @
"[^\w\-\!\$\'\(\)\=\@\d_]+"
,
"-"
);
p.ShowInNavigation =
true
;
p.DateCreated = DateTime.UtcNow;
p.LastModified = DateTime.UtcNow;
p.RenderAsLink =
true
;
p.Ordinal = -0.55f;
).SaveChanges();
Hello,
Group page doesn't have a content and it shows the content of its first child page. If you want the page node to show up at the top even, use the source code below.
protected
void
Page_Load(
object
sender, EventArgs e)
//var pageId = Guid.NewGuid();
var sfBackendPageId = App.WorkWith().Pages().LocatedIn(Telerik.Sitefinity.Fluent.Pages.PageLocation.Backend).Where(p => p.Title ==
"Sitefinity"
).Get().SingleOrDefault().Id;
CreateNewBackendPage(sfBackendPageId,
"TestPageStandart"
);
public
void
CreateNewBackendPage(Guid pageId,
string
pageName)
var myPageID = Guid.NewGuid();
// if you create a group page use CreateNewGroupPage
App.WorkWith().Page()
.CreateNewStandardPage(pageId, myPageID)
.Do(p =>
p.Title = pageName;
p.Description = pageName;
p.Title = pageName;
p.UrlName = Regex.Replace(pageName.ToLower(), @
"[^\w\-\!\$\'\(\)\=\@\d_]+"
,
"-"
);
p.ShowInNavigation =
true
;
p.DateCreated = DateTime.UtcNow;
p.LastModified = DateTime.UtcNow;
//set PageData properties:
p.Page.Title = pageName;
p.Page.Description = pageName;
p.Page.Title = pageName;
p.Page.UrlName = Regex.Replace(pageName.ToLower(), @
"[^\w\-\!\$\'\(\)\=\@\d_]+"
,
"-"
);
p.Page.DateCreated = DateTime.UtcNow;
p.Page.LastModified = DateTime.UtcNow;
).SaveChanges();
// publish the standart page
var bag =
new
Dictionary<
string
,
string
>();
bag.Add(
"ContentType"
,
typeof
(PageNode).FullName);
WorkflowManager.MessageWorkflow(myPageID,
typeof
(PageNode),
null
,
"Publish"
,
false
, bag);