Reputation: 927
I'm working on a DotNetNuke site which will be used as a store. Each product will have its own DotNetNuke page containing various modules. I'd like to create a module that will allow an administrator to create new products.
What is the best way to go about this? How do you programmatically create new DotNetNuke pages, populate them with modules, and configure the modules?
I'm sure this can be done, I just don't know how to get started.
Upvotes: 1
Views: 4865
Reputation: 927
Finally after several days I found the answer to my own question. If anyone else is looking for a way to programatically create DotNetNuke pages, populate them with modules, and configure the modules --here's your solution!
This blog entry by Rafe Kemmis was my starting point, though based on an earlier version of DNN. He has several other DNN articles which may also be useful.
Another section of the code below was taken from the DNN source. I did some tweaking, but it's still 99% from source.
The following is a test DNN module I put together while working on this problem. I hope you find it useful. Figuring it out was certainly educational.
Imports System.Web.UI
Imports System.Collections.Generic
Imports System.Reflection
Imports DotNetNuke
Imports DotNetNuke.Security.Permissions
Imports DotNetNuke.Services.Exceptions
Imports DotNetNuke.Services.Localization
Imports DotNetNuke.Entities.Modules
Imports DotNetNuke.Entities.Modules.Definitions
Imports DotNetNuke.Entities.Users
Namespace DNNTest.Modules.PageGenerator
Partial Class ViewPageGenerator
Inherits Entities.Modules.PortalModuleBase
#Region "Enums"
Private Enum ViewPermissionType
View = 0
Edit = 1
End Enum
#End Region
#Region "Events"
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
If (Not IsPostBack) Then
PermGrid.TabID = -1
ParentsDropDownList.DataSource = TabController.GetPortalTabs(PortalId, TabId, True, False)
ParentsDropDownList.DataBind()
End If
Catch ex As Exception
'failure
Exceptions.ProcessModuleLoadException(Me, ex)
End Try
End Sub
Protected Sub btnAddPage_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnAddPage.Click
CreatePage(Trim(txtTabName.Text), Trim(txtTabTitle.Text), Trim(txtTabDesc.Text), Trim(txtTabKeyWords.Text), PermGrid.Permissions)
End Sub
#End Region
#Region "DNN Page Creation"
Private Sub CreatePage(ByVal PageName As String, ByVal PageTitle As String, ByVal Description As String, ByVal Keywords As String, ByVal Permissions As TabPermissionCollection, Optional ByVal LoadDefaultModules As Boolean = True)
Dim controller As New TabController
Dim newTab As New Tabs.TabInfo
Dim newPermissions As TabPermissionCollection = newTab.TabPermissions
Dim permissionProvider As PermissionProvider = permissionProvider.Instance
Dim infPermission As TabPermissionInfo
' set new page properties
newTab.PortalID = PortalId
newTab.TabName = PageName
newTab.Title = PageTitle
newTab.Description = Description
newTab.KeyWords = Keywords
newTab.IsDeleted = False
newTab.IsSuperTab = False
newTab.IsVisible = True
newTab.DisableLink = False
newTab.IconFile = ""
newTab.Url = ""
newTab.ParentId = CInt(ParentsDropDownList.SelectedValue)
' create new page
controller.AddTab(newTab, LoadDefaultModules)
' copy permissions selected in Permissions collection
For index As Integer = 0 To (Permissions.Count - 1)
infPermission = New TabPermissionInfo
infPermission.AllowAccess = Permissions(index).AllowAccess
infPermission.RoleID = Permissions(index).RoleID
infPermission.RoleName = Permissions(index).RoleName
infPermission.TabID = Permissions(index).TabID
infPermission.PermissionID = Permissions(index).PermissionID
'save permission info
newPermissions.Add(infPermission, True)
permissionProvider.SaveTabPermissions(newTab)
Next index
'create module on page
'CreateModule(newTab.TabID, "MyHTMLModule", "ContentPane", "Text/HTML")
CreateModule(newTab.TabID, "MyModule", "ContentPane", "Custom_DNN_Module")
' clear the cache
DataCache.ClearModuleCache(newTab.TabID)
End Sub
Private Sub CreateModule(ByVal TabID As Integer, ByVal modTitle As String, ByVal paneName As String, ByVal modDefinitionFriendlyName As String)
'Create a completely new module on the new page
Dim modDefInfo As ModuleDefinitionInfo = ModuleDefinitionController.GetModuleDefinitionByFriendlyName(modDefinitionFriendlyName)
AddNewModule(TabID, modTitle, modDefInfo.DesktopModuleID, paneName, 0, ViewPermissionType.View, "")
'Configure Module Settings
ConfigModuleSettings(ModuleID)
End Sub
Private Sub ConfigModuleSettings(ByVal ModuleID As Integer)
Dim objModules As New ModuleController
Dim TabModuleID As Integer = objModules.GetModule(ModuleID).TabModuleID
objModules.UpdateTabModuleSetting(TabModuleID, "MySetting", "1")
End Sub
#Region "From DNN Source --mostly"
''' -----------------------------------------------------------------------------
''' <summary>Adds a New Module to a Pane</summary>
''' <param name="align">The alignment for the Module</param>
''' <param name="desktopModuleId">The Id of the DesktopModule</param>
''' <param name="permissionType">The View Permission Type for the Module</param>
''' <param name="title">The Title for the resulting module</param>
''' <param name="paneName">The pane to add the module to</param>
''' <param name="position">The relative position within the pane for the module</param>
''' -----------------------------------------------------------------------------
Private Sub AddNewModule(ByVal TabID As Integer, ByVal title As String, ByVal desktopModuleId As Integer, ByVal paneName As String, ByVal position As Integer, ByVal permissionType As ViewPermissionType, ByVal align As String)
Dim objTabController As New TabController
Dim objTabPermissions As TabPermissionCollection = objTabController.GetTab(TabID, PortalId, True).TabPermissions
Dim objPermissionController As New PermissionController
Dim objModules As New ModuleController
Dim objModuleDefinition As ModuleDefinitionInfo
Dim objEventLog As New Services.Log.EventLog.EventLogController
Dim j As Integer
Try
Dim desktopModule As DesktopModuleInfo = Nothing
If Not DesktopModuleController.GetDesktopModules(PortalSettings.PortalId).TryGetValue(desktopModuleId, desktopModule) Then
Throw New ArgumentException("desktopModuleId")
End If
Catch ex As Exception
LogException(ex)
End Try
Dim UserId As Integer = -1
If Request.IsAuthenticated Then
Dim objUserInfo As Users.UserInfo = UserController.GetCurrentUserInfo
UserId = objUserInfo.UserID
End If
For Each objModuleDefinition In ModuleDefinitionController.GetModuleDefinitionsByDesktopModuleID(desktopModuleId).Values
Dim objModule As New ModuleInfo
objModule.Initialize(PortalSettings.PortalId)
objModule.PortalID = PortalSettings.PortalId
objModule.TabID = TabId
objModule.ModuleOrder = position
If title = "" Then
objModule.ModuleTitle = objModuleDefinition.FriendlyName
Else
objModule.ModuleTitle = title
End If
objModule.PaneName = paneName
objModule.ModuleDefID = objModuleDefinition.ModuleDefID
If objModuleDefinition.DefaultCacheTime > 0 Then
objModule.CacheTime = objModuleDefinition.DefaultCacheTime
If Portals.PortalSettings.Current.DefaultModuleId > Null.NullInteger AndAlso Portals.PortalSettings.Current.DefaultTabId > Null.NullInteger Then
Dim defaultModule As ModuleInfo = objModules.GetModule(Portals.PortalSettings.Current.DefaultModuleId, Portals.PortalSettings.Current.DefaultTabId, True)
If Not defaultModule Is Nothing Then
objModule.CacheTime = defaultModule.CacheTime
End If
End If
End If
Select Case permissionType
Case ViewPermissionType.View
objModule.InheritViewPermissions = True
Case ViewPermissionType.Edit
objModule.InheritViewPermissions = False
End Select
' get the default module view permissions
Dim arrSystemModuleViewPermissions As ArrayList = objPermissionController.GetPermissionByCodeAndKey("SYSTEM_MODULE_DEFINITION", "VIEW")
' get the permissions from the page
For Each objTabPermission As TabPermissionInfo In objTabPermissions
If objTabPermission.PermissionKey = "VIEW" AndAlso permissionType = ViewPermissionType.View Then
'Don't need to explicitly add View permisisons if "Same As Page"
Continue For
End If
' get the system module permissions for the permissionkey
Dim arrSystemModulePermissions As ArrayList = objPermissionController.GetPermissionByCodeAndKey("SYSTEM_MODULE_DEFINITION", objTabPermission.PermissionKey)
' loop through the system module permissions
For j = 0 To arrSystemModulePermissions.Count - 1
' create the module permission
Dim objSystemModulePermission As PermissionInfo
objSystemModulePermission = CType(arrSystemModulePermissions(j), PermissionInfo)
If objSystemModulePermission.PermissionKey = "VIEW" AndAlso permissionType = ViewPermissionType.Edit AndAlso _
objTabPermission.PermissionKey <> "EDIT" Then
'Only Page Editors get View permissions if "Page Editors Only"
Continue For
End If
Dim objModulePermission As ModulePermissionInfo = AddModulePermission(objModule, _
objSystemModulePermission, _
objTabPermission.RoleID, objTabPermission.UserID, _
objTabPermission.AllowAccess)
' ensure that every EDIT permission which allows access also provides VIEW permission
If objModulePermission.PermissionKey = "EDIT" And objModulePermission.AllowAccess Then
Dim objModuleViewperm As ModulePermissionInfo = AddModulePermission(objModule, _
CType(arrSystemModuleViewPermissions(0), PermissionInfo), _
objModulePermission.RoleID, objModulePermission.UserID, _
True)
End If
Next
'Get the custom Module Permissions, Assume that roles with Edit Tab Permissions
'are automatically assigned to the Custom Module Permissions
If objTabPermission.PermissionKey = "EDIT" Then
Dim arrCustomModulePermissions As ArrayList = objPermissionController.GetPermissionsByModuleDefID(objModule.ModuleDefID)
' loop through the custom module permissions
For j = 0 To arrCustomModulePermissions.Count - 1
' create the module permission
Dim objCustomModulePermission As PermissionInfo
objCustomModulePermission = CType(arrCustomModulePermissions(j), PermissionInfo)
AddModulePermission(objModule, objCustomModulePermission, _
objTabPermission.RoleID, objTabPermission.UserID, _
objTabPermission.AllowAccess)
Next
End If
Next
objModule.AllTabs = False
objModule.Alignment = align
objModules.AddModule(objModule)
Next
End Sub
''' -----------------------------------------------------------------------------
''' <summary>Adds a Module Permission</summary>
''' <param name="permission">The permission to add</param>
''' <param name="roleId">The Id of the role to add the permission for.</param>
''' -----------------------------------------------------------------------------
Private Function AddModulePermission(ByVal objModule As ModuleInfo, ByVal permission As PermissionInfo, ByVal roleId As Integer, ByVal userId As Integer, ByVal allowAccess As Boolean) As ModulePermissionInfo
Dim objModulePermission As New ModulePermissionInfo
objModulePermission.ModuleID = objModule.ModuleID
objModulePermission.PermissionID = permission.PermissionID
objModulePermission.RoleID = roleId
objModulePermission.UserID = userId
objModulePermission.PermissionKey = permission.PermissionKey
objModulePermission.AllowAccess = allowAccess
' add the permission to the collection
If Not objModule.ModulePermissions.Contains(objModulePermission) Then
objModule.ModulePermissions.Add(objModulePermission)
End If
Return objModulePermission
End Function
#End Region
#End Region
End Class
End Namespace
Here's the markup...
<%@ Control Language="vb" Inherits="DNNTest.Modules.PageGenerator.ViewPageGenerator" AutoEventWireup="false" Explicit="True" CodeBehind="ViewPageGenerator.ascx.vb" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<%@ Register TagPrefix="Portal" Namespace="DotNetNuke.Security.Permissions.Controls" Assembly="DotNetNuke" %>
<div>
<table>
<tr>
<td>
<asp:Label ID="Label1" runat="server" Text="Parent Tab:" />
</td>
<td>
<asp:DropDownList ID="ParentsDropDownList" runat="server" DataTextField="TabName" DataValueField="TabID" />
</td>
</tr>
<tr>
<td>
<asp:Label ID="Label2" runat="server" Text="Tab Name:"/>
</td>
<td>
<asp:TextBox ID="txtTabName" runat="server"/>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Label3" runat="server" Text="Tab Title:"/>
</td>
<td>
<asp:TextBox ID="txtTabTitle" runat="server"/>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Label4" runat="server" Text="Description:"/>
</td>
<td>
<asp:TextBox ID="txtTabDesc" runat="server"/>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Label5" runat="server" Text="Key Words:"/>
</td>
<td>
<asp:TextBox ID="txtTabKeyWords" runat="server"/>
</td>
</tr>
</table>
<br />
<Portal:TabPermissionsGrid ID="PermGrid" runat="server" />
<br />
<asp:Button ID="btnAddPage" runat="server" OnClick="btnAddPage_Click" Text="Add New Page Here" Width="161px" />
</div>
Upvotes: 3
Reputation: 2391
I think the easiest thing to do would be to create a page level Template. Setup a page with all the modules you want on it. Save it / Export it as a template. Then your user who needs to create a new product clicks Add page. Make the page. Then just configure the module that has your product / store logic in it. Should do the trick.
Upvotes: 2