Admin View in Sitefinity 4
Does the ProviderControlPanel architecture still exist?
as per ivan's old blog post
http://www.sitefinity.com/blogs/ivan/posts/09-04-22/reference_most_important_base_classes_-_providercontrolpanel_class.aspx
Seems like everything has moved around and I'm feeling mega confused.
Normally inside the ProviderControlPanel class we'd have something like this
/// <summary>
/// Summary description for PromotionsControlPanel
/// </summary>
public
class
PromotionsControlPanel : ProviderControlPanel<PromotionsControlPanel>
public
PromotionsControlPanel()
:
base
(
false
)
protected
override
void
CreateViews()
AddView<PromotionView>();
AddView(
"PermissionsView"
,
"~/Views/Backend/PermissionsView.ascx"
,
"Permissions"
,
string
.Empty,
string
.Empty,
null
);
protected
override
void
CreateCommandPanelsFromUserControls(
string
viewMode, System.Collections.Generic.List<
string
> userControls, System.Collections.Generic.List<Telerik.Web.ICommandPanel> list)
if
(userControls ==
null
)
userControls =
new
List<
string
>();
userControls.Add(
"~/Modules/Promotions/Views/Backend/CommandPanel.ascx"
);
base
.CreateCommandPanelsFromUserControls(viewMode, userControls, list);
public
PromotionsManager Manager
get
if
(
this
.manager ==
null
)
this
.manager =
new
PromotionsManager();
return
this
.manager;
private
PromotionsManager manager;
public
class
PromotionView : ViewModeControl<PromotionsControlPanel>
/// <summary>
/// Creates the child views for the contacts view
/// </summary>
protected
override
void
CreateViews()
AddView(
"ListView"
,
"~/Views/Backend/Promotion/PromotionsListView.ascx"
,
"Promotion List"
,
"Listing Promotion"
,
string
.Empty,
null
);
AddView(
"EditView"
,
"~/Views/Backend/Promotion/PromotionsEditView.ascx"
,
"Edit Promotion"
,
"Edit Promotion"
,
string
.Empty,
null
);
AddView(
"InsertView"
,
"~/Views/Backend/Promotion/PromotionsInsertView.ascx"
,
"Create Promotion"
,
"Create Promotion"
,
string
.Empty,
null
);
Hi Luke ,
In 4.0 we use definition classes and the architecure is completely diferent from what you see in 3.x. In 4.0 we use RESTful services and client side binders. The data is persisted by Telerik Open Access which is responsible for database management.
In the definition you have
1. ListView - it is represented by MasterGridViewElement
var moduleGridView =
new
MasterGridViewElement(backendContentView.ViewsConfig)
ViewName = ModuleDefinitions.BackendListViewName,
ViewType =
typeof
(MasterGridView),
AllowPaging =
true
,
DisplayMode = FieldDisplayMode.Read,
ItemsPerPage = 50,
ResourceClassId =
typeof
(ModuleResources).Name,
ExtendedSearchFields =
"Title"
,
SortExpression =
"Title ASC"
,
Title =
"Title"
,
WebServiceBaseUrl =
"~/Sitefinity/Services/Content/ContentItemService.svc/"
var gridMode =
new
GridViewModeElement(moduleGridView .ViewModesConfig)
Name =
"Grid"
;
(moduleGridView .ViewModesConfig.Add(gridMode);
DataColumnElement titleColumn =
new
DataColumnElement(gridMode.ColumnsConfig)
Name =
"Title"
,
HeaderText = Res.Get<Labels>().Title,
HeaderCssClass =
"sfTitleCol"
,
ItemCssClass =
"sfTitleCol"
,
ClientTemplate = @
"<a sys:href='javascript:void(0);' sys: 'sf_binderCommand_edit sfItemTitle sf' + UIStatus.toLowerCase()"
">
<strong>Title</strong>
<span
class
=
'sfStatusLocation'
>Status</span></a>"
;
gridMode.ColumnsConfig.Add(titleColumn);
var translationsColumn =
new
DynamicColumnElement(gridMode.ColumnsConfig)
Name =
"Translations"
,
HeaderText = Res.Get<LocalizationResources>().Translations,
DynamicMarkupGenerator =
typeof
(LanguagesColumnMarkupGenerator),
ItemCssClass =
"sfLanguagesCol"
,
HeaderCssClass =
"sfLanguagesCol"
;
translationsColumn.GeneratorSettingsElement =
new
LanguagesColumnMarkupGeneratorElement(translationsColumn)
LanguageSource = LanguageSource.Frontend,
ItemsInGroupCount = DefinitionsHelper.LanguageItemsPerRow,
ContainerTag =
"div"
,
GroupTag =
"div"
,
ItemTag =
"div"
,
ContainerClass =
string
.Empty,
GroupClass =
string
.Empty,
ItemClass =
string
.Empty
;
gridMode.ColumnsConfig.Add(translationsColumn);
ActionMenuColumnElement actionsColumn =
new
ActionMenuColumnElement(gridMode.ColumnsConfig)
Name =
"Actions"
,
HeaderText = Res.Get<Labels>().Actions,
HeaderCssClass =
"sfMoreActions"
,
ItemCssClass =
"sfMoreActions"
;
DefinitionsHelper.FillActionMenuItems(actionsColumn.MenuItems, actionsColumn,
typeof
(MyCustomResources).Name);
gridMode.ColumnsConfig.Add(actionsColumn);
DataColumnElement authorColumn =
new
DataColumnElement(gridMode.ColumnsConfig)
Name =
"Author"
,
HeaderText = Res.Get<Labels>().Author,
ClientTemplate =
"<span>Author</span>"
,
HeaderCssClass =
"sfRegular"
,
ItemCssClass =
"sfRegular"
;
gridMode.ColumnsConfig.Add(authorColumn);
DataColumnElement dateColumn =
new
DataColumnElement(gridMode.ColumnsConfig)
///.format('dd MMM, yyyy hh:mm:ss')
Name =
"Date"
,
HeaderText = Res.Get<Labels>().Date,
ClientTemplate =
"<span> (DateCreated) ? DateCreated.sitefinityLocaleFormat('dd MMM, yyyy hh:mm:ss'): '-' </span>"
,
HeaderCssClass =
"sfDate"
,
ItemCssClass =
"sfDate"
;
gridMode.ColumnsConfig.Add(dateColumn);
DecisionScreenElement dsElement =
new
DecisionScreenElement((moduleGridView .DecisionScreensConfig)
Name =
"NoItemsExistScreen"
,
DecisionType = DecisionType.NoItemsExist,
MessageType = MessageType.Neutral,
Displayed =
false
,
Title =
"WhatDoYouWantToDoNow"
,
MessageText =
"NoItems"
,
ResourceClassId =
typeof
((moduleResources).Name
;
CommandWidgetElement actionCreateNew =
new
CommandWidgetElement(dsElement.Actions)
Name =
"Create"
,
ButtonType = CommandButtonType.Create,
CommandName = DefinitionsHelper.CreateCommandName,
Text =
"CreateItem"
,
ResourceClassId =
typeof
(moduleResources).Name,
CssClass =
"sfCreateItem"
,
PermissionSet = SecurityConstants.Sets.General.SetName,
ActionName = SecurityConstants.Sets.General.Create
;
dsElement.Actions.Add(actionCreateNew);
moduleGridView.DecisionScreensConfig.Add(dsElement);
var EditDetailView =
new
DetailFormViewElement(backendContentView.ViewsConfig)
Title =
"EditItem"
,
ViewName = ModuleDefinitions.BackendEditViewName,
ViewType =
typeof
(DetailFormView),
ShowSections =
true
,
DisplayMode = FieldDisplayMode.Write,
ShowTopToolbar =
true
,
ResourceClassId =
typeof
(MyCustomResources).Name,
WebServiceBaseUrl =
"~/Sitefinity/Services/Content/ContentItemService.svc/"
,
IsToRenderTranslationView =
true
,
AlternativeTitle =
"CreateNewItem"
;
backendContentView.ViewsConfig.Add(EditDetailView );
var InsertDetailView =
new
DetailFormViewElement(backendContentView.ViewsConfig)
Title =
"CreateNewItem"
,
ViewName = ModuleDefinitions.BackendInsertViewName,
ViewType =
typeof
(DetailFormView),
ShowSections =
true
,
DisplayMode = FieldDisplayMode.Write,
ShowTopToolbar =
true
,
ResourceClassId =
typeof
(moduleResources).Name,
WebServiceBaseUrl =
"~/Sitefinity/Services/Content/ContentItemService.svc/"
,
IsToRenderTranslationView =
false
;
backendContentView.ViewsConfig.Add(InsertDetailView);
private
static
void
CreateDialogs(ConfigElementCollection parent)
var parameters =
string
.Concat(
"?ControlDefinitionName="
,
MyDefinition.BackendDefinitionName,
"&ViewName="
,
MyDefinition.BackendInsertViewName);
DialogElement createDialogElement = DefinitionsHelper.CreateDialogElement(
parent,
DefinitionsHelper.CreateCommandName,
"ContentViewInsertDialog"
,
parameters);
parent.Add(createDialogElement);
public const string BackendDefinitionName = "MyModuleBackend";
#region Dialogs definition
MyDefinitions.CreateDialogs(myCustomGridView.DialogsConfig);
var parameters =
string
.Concat(
"?TypeName=Telerik.Sitefinity.Samples.CustomDataItem&Title="
, Res.Get<MyModuleResources>().MyDataFields,
"&BackLabelText="
, Res.Get<MyModuleResources>().BackToItems,
"&ItemsName="
, Res.Get<MyModuleResources>().PluralNameForMyObject);
DialogElement moduleEditorDialogElement = DefinitionsHelper.CreateDialogElement(
myGridView.DialogsConfig,
DefinitionsHelper.ModuleEditor,
"ModuleEditorDialog"
,
parameters);
myGridView.DialogsConfig.Add(moduleEditorDialogElement);
#endregion
#region Links definition
myCustomGridView.LinksConfig.Add(
new
LinkElement(myGridView.LinksConfig)
Name =
"viewComments"
,
CommandName = DefinitionsHelper.CommentsCommandName,
NavigateUrl = RouteHelper.CreateNodeReference(MyCutomModule.CommentsPageId)
);
myGridView.LinksConfig.Add(
new
LinkElement(myCustomGridView.LinksConfig)
Name =
"viewSettings"
,
CommandName = DefinitionsHelper.SettingsCommandName,
NavigateUrl = RouteHelper.CreateNodeReference(SiteInitializer.AdvancedSettingsNodeId) +
"/MyCustomModule"
);
DefinitionsHelper.CreateNotImplementedLink(myGridView);
#endregion
Hmmm I see. I was afraid you were going to say that.
Yes I have downloaded the Sitefinity 4.0 SP1.
What happens if you want to modify the admin add and edit pages is it at all possible?
For example:
I have a Custom Module that I need to build that has a title and description field as well as an image, I also need to plot points on the image as hotspots.
Previously I did this through by creating an object that stores the x and y points and the associated custom module ID.
This was very easy to do in Sitefinity 3.7 and I have done a similar projects before however I'm struggling to find were I even start with doing it in 4.0. Like you said there's no coding to
I've built numerous Sitefinity 3.x websites in the past and it seems the learning curve for Sitefinity 4.0 is quite steep, I hate to think what it's like for any newbies.
Hello Luke,
When you create a new module it installs backend pages. This is done in InstallPages method. You can create backend pages from the UI as well.
For title and description you can use TextFieldDefinitionElement - represents a configuration element for text fields. For the image - ImageFieldDefinition.
Kind regards,
Ivan Dimitrov
the Telerik team