2010-11-29 11 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> 
+0

古い投稿、私は知っています。これは完全な解決策ですか?残念ながら、そのブログはしばらくダウンしており、私はしばらくこのタイプのソリューションを探していました。ちょうどそれが私が必要とするすべてであるかどうかを知りたい(明らかに自分のシナリオに合わせて微調整)。ありがとう。 +1 –

+1

Moriartyへの対応:私は数年後にDNNで働いていませんでしたが、私は必要なキーパーツを投稿したことを覚えています。 DNNがどのように変わったのか分かりません。私の古い解決策があなたに役立つことを願っています。 – ks78

2

私は最も簡単なことは、ページレベルのテンプレートを作成することだと思います。あなたが望むすべてのモジュールを含むページをセットアップします。保存する/テンプレートとしてエクスポートします。次に、新しい製品を作成する必要があるユーザーが[ページを追加]をクリックします。ページを作成します。次に、製品/店舗ロジックを持つモジュールを設定します。トリックをする必要があります。

+1

私はテンプレートを使用して検討しているが、私はまだ、ユーザーのためにあまりにも多くの設定を残していると思います。しかし、提案をありがとう。 – ks78

+0

私は頻繁にテンプレートを使用しませんが、あなたのモジュールがエクスポート機能をサポートしていれば、モジュールをあらかじめ設定することもできます。実際の製品にどのモジュールを使用しているのかはわかりません。 –

+0

@Ryan Doomに同意する - これは仕事の狂気のように思える - 多くのecommのように思える - あなたがあなたの理由を持っていると仮定しなければならない:パッケージがあればこれほど単純になり、管理はずっと楽になります – braindice

関連する問題