Details view for custom module
Hi,
I've gone through the article How to create a custom content-based module in the Developers Guide but I want to extend the control a bit more. I want to add a Job details view so that when I click on a job in the JobApplicationsOverviewTemplate it would load the details of that job in a seperate page. How can I achieve this?
Thanks
Hi Raihan,
You need to create DetailsView for your widget in the module definition
#region View Definitions
controlDefinition.ViewsConfig.AddLazy(FrontendListViewName, () =>
new ContentViewMasterElement(controlDefinition.ViewsConfig)
ViewName = FrontendListViewName,
ViewType = typeof(Telerik.Sitefinity.Samples.Module.Web.UI.Public.MasterView),
AllowPaging = true,
DisplayMode = FieldDisplayMode.Read,
ItemsPerPage = 20,
ResourceClassId = typeof(ModuleResources).Name,
FilterExpression = DefinitionsHelper.PublishedOrScheduledFilterExpression,
SortExpression = "PublicationDate DESC"
);
controlDefinition.ViewsConfig.AddLazy(FrontendDetailViewName, () =>
new ContentViewDetailElement(controlDefinition.ViewsConfig)
ViewName = FrontendDetailViewName,
ViewType = typeof(Telerik.Sitefinity.Samples.Module.Web.UI.Public.DetailsView),
ShowSections = false,
DisplayMode = FieldDisplayMode.Read,
ResourceClassId = typeof(ModuleResources).Name
);
#endregion
In your control you should set the views
public override string MasterViewName
get
if (string.IsNullOrEmpty(base.MasterViewName))
return ModuleDeifinition.FrontendListViewName;
return base.MasterViewName;
set
base.MasterViewName = value;
/// <summary>
/// Gets or sets the name of the detail view to be loaded when
/// control is in the ContentViewDisplayMode.Detail
/// </summary>
/// <value></value>
public override string DetailViewName
get
if (string.IsNullOrEmpty(base.DetailViewName))
return ModuleDeifinition.FrontendDetailViewName;
return base.DetailViewName;
set
base.DetailViewName = value;
Best wishes,
Ivan Dimitrov
the Telerik team
Thanks for the response. It seems my custom module is a bit different.
Can you please check the attached module file and then make the changes
there? It would be really helpful.
using
System;
using
System.Linq;
using
BiasMed.Modules.PublicControls;
using
Telerik.Sitefinity;
using
Telerik.Sitefinity.Abstractions;
using
Telerik.Sitefinity.Configuration;
using
Telerik.Sitefinity.Libraries.Model;
using
Telerik.Sitefinity.Services;
using
Telerik.Sitefinity.Model;
namespace
MyApp.Modules
public
class
ArticleModule : ModuleBase
public
const
string
ModuleName =
"Article"
;
/// <summary>
/// Gets the CLR types of all data managers provided by this module.
/// </summary>
/// <value>An array of <see cref="T:System.Type"/> objects.</value>
public
override
Type[] Managers
get
return
null
;
/// <summary>
/// Initializes the service with specified settings.
/// </summary>
/// <param name="settings">The settings.</param>
public
override
void
Initialize(ModuleSettings settings)
base
.Initialize(settings);
public
override
Guid LandingPageId
get
return
ArticleModule.landingPageId;
public
Guid SubPageId
get
return
ArticleModule.subPageId;
/// <summary>
/// Installs this module in Sitefinity system.
/// </summary>
/// <param name="initializer">The Site Initializer. A helper class for installing Sitefinity modules.</param>
public
override
void
Install(SiteInitializer initializer)
bool
restart =
false
;
this
.EnsureMetaFields(
ref
restart);
using
(var sf = App.WorkWith())
sf.Page().PageManager.Provider.SuppressSecurityChecks =
true
;
var moduleNode = sf.Page(SiteInitializer.ModulesNodeId).Get();
var jobsNode = sf.Pages().Where(p => p.Id ==
this
.LandingPageId).Get().SingleOrDefault();
if
(jobsNode ==
null
)
sf.Page().CreateNewPageGroup(moduleNode,
this
.LandingPageId).Do(p =>
p.Name =
"Articles"
;
p.ShowInNavigation =
true
;
p.Attributes[
"ModuleName"
] = ArticleModule.ModuleName;
p.Title =
"Articles"
;
p.UrlName =
"Articles"
;
);
restart =
true
;
// Create the subpage
var subPage = sf.Pages().Where(p => p.Id ==
this
.SubPageId).Get().SingleOrDefault();
if
(subPage ==
null
)
sf.Page().CreateNewStandardPage(
this
.LandingPageId,
this
.SubPageId).Do(p =>
p.Name =
"Articles"
;
p.UrlName =
"Articles"
;
p.Description =
"Articles Overview"
;
p.ShowInNavigation =
false
;
p.Attributes[
"ModuleName"
] = ArticleModule.ModuleName;
).CheckOut()
.Do(draft => draft.TemplateId = sf.Page().PageManager.GetTemplates().Where(t => t.Name == SiteInitializer.BackendTemplateName).SingleOrDefault().Id)
.Control().CreateNew(
new
ArticlesBackendControl(),
"Content"
).Done()
.Publish();
restart =
true
;
if
(restart)
SystemManager.RestartApplication(
true
);
public
static
readonly
Guid landingPageId =
new
Guid(
"82006664-3af9-47db-8ac0-6811e942ec44"
);
public
static
readonly
Guid subPageId =
new
Guid(
"f052be9d-f6ef-439b-964a-cb3d99eb9efc"
);
protected
override
ConfigSection GetModuleConfig()
return
null
;
public
override
void
Upgrade(SiteInitializer initializer, Version upgradeFrom)
private
void
EnsureMetaFields(
ref
bool
restart)
Hi Raihan,
In the module class you should only register the pubic widget inside InstallConfiguration. Generally you need to have a definition class for your custom module where you set the widget views.
Regards,
Ivan Dimitrov
the Telerik team
Thanks for the prompt response Ivan. Can you please post some code sample or link to a tutorial?
Hi Raihan,
You can download and check out Products sample module that comes with the SDK installation.
Best wishes,
Ivan Dimitrov
the Telerik team