2010-11-29 8 views
1

Je travaille sur un site DotNetNuke qui sera utilisé en magasin. Chaque produit aura sa propre page DotNetNuke contenant divers modules. Je voudrais créer un module qui permettra à un administrateur de créer de nouveaux produits.Comment créer par programme des pages DotNetNuke?

Quelle est la meilleure façon de procéder? Comment créer par programme de nouvelles pages DotNetNuke, les remplir avec des modules et configurer les modules?

Je suis sûr que cela peut être fait, je ne sais pas comment commencer.

Répondre

3

Enfin, après plusieurs jours, j'ai trouvé la réponse à ma propre question. Si quelqu'un d'autre cherche un moyen de créer par programmation des pages DotNetNuke, remplissez-les avec des modules, et configurez les modules - voilà votre solution! Par Rafe Kemmis était mon point de départ, bien que basé sur une version antérieure de DNN. Il a plusieurs autres articles de DNN qui peuvent également être utiles.

Une autre section du code ci-dessous provient de la source DNN. J'ai fait quelques ajustements, mais c'est toujours 99% de la source.

Ce qui suit est un module de test DNN que j'ai assemblé en travaillant sur ce problème. J'espère que tu trouves cela utile. Le comprendre était certainement éducatif.

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 

est ici le balisage ...

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

Ancien poste, je sais. Est-ce la solution complète? Malheureusement, ce blog est en panne depuis un moment - et j'ai cherché ce type de solution pendant un moment. Je veux juste savoir si c'est tout ce dont j'ai besoin (évidemment ajusté à mon propre scénario). Merci. +1 –

+1

Répondre à Moriarty: Je n'ai pas travaillé avec DNN depuis quelques années, mais je me souviens d'avoir posté les pièces clés nécessaires. Bien que, je ne sais pas comment DNN a changé entre-temps. J'espère que ma vieille solution vous sera utile. – ks78

2

Je pense que la chose la plus facile à faire serait de créer un modèle de niveau page. Configurez une page avec tous les modules que vous voulez. Enregistrez-le/Exportez-le en tant que modèle. Ensuite, votre utilisateur qui a besoin de créer un nouveau produit clique sur Ajouter une page. Faites la page. Ensuite, configurez simplement le module qui contient la logique de votre produit/magasin. Devrait faire l'affaire.

+1

J'ai examiné en utilisant des modèles, mais je pense que la configuration laisse encore trop pour les utilisateurs. Merci pour la suggestion, cependant. – ks78

+0

Je n'utilise pas souvent les modèles, mais je pense que si votre module prend en charge la fonction d'exportation, vous pouvez également pré-configurer le module. Donc, je ne sais pas quel module vous utilisez pour votre produit réel. On dirait que c'est une sacrée besogne de créer une page par produit en général mais je dois supposer que vous avez vos raisons:] –

+0

je dois dire que je suis d'accord avec @Ryan Doom - cela semble être une folle quantité de travail - beaucoup d'ecomm paquets là-bas vont le faire tellement plus simplement et l'administration sera tellement plus facile – braindice

Questions connexes