2010-11-29 2 views
1

Я работаю над сайтом DotNetNuke, который будет использоваться в качестве магазина. Каждый продукт будет иметь собственную страницу DotNetNuke, содержащую различные модули. Я хотел бы создать модуль, который позволит администратору создавать новые продукты.Как программно создавать страницы DotNetNuke?

Каков наилучший способ для этого? Как вы программно создаете новые страницы DotNetNuke, заполняете их модулями и настраиваете модули?

Я уверен, что это можно сделать, я просто не знаю, с чего начать.

ответ

3

Наконец, через несколько дней я нашел ответ на свой вопрос. Если кто-то еще ищет способ программно создавать страницы DotNetNuke, заполнять их модулями и настраивать модули - вот ваше решение!

This blog entry от Rafe Kemmis была моей отправной точкой, хотя на основе более ранней версии DNN. У него есть еще несколько статей DNN, которые также могут быть полезны.

Еще один раздел приведенного ниже кода был взят из источника DNN. Я сделал некоторые настройки, но это все еще 99% от источника.

Ниже приведен тестовый модуль DNN, который я собрал во время работы над этой проблемой. Надеюсь, вы сочтете это полезным. Выяснить это было, конечно, образовательным.

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 

Вот разметка ...

<%@ 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> 
2

Я думаю, что проще всего было бы создать шаблон уровня страницы. Настройте страницу со всеми необходимыми вами модулями. Сохраните его/экспортируйте в качестве шаблона. Затем ваш пользователь, которому нужно создать новый продукт, нажимает кнопку «Добавить». Сделайте страницу. Затем просто настройте модуль, в котором есть логика продукта/магазина. Должен сделать трюк.

+1

Я рассматривал возможность использования шаблонов, но я думаю, что по-прежнему оставляет слишком много конфигурации для пользователей. Спасибо за предложение. – ks78 2010-11-30 17:43:14

+0

Я не часто использую шаблоны, но я думаю, что если ваш модуль поддерживает функцию экспорта, вы также можете настроить модуль. SO, не уверен, какой модуль вы используете для своего продукта. Похоже, сумасшедший объем работы для создания страницы на продукт в целом, но я должен предположить, что у вас есть причины:] – 2010-12-01 02:26:24