用CodeSmith及DNNProjectTemplates進行DNN模塊開發(2)

三.數據提供者(Data Providers

至此,VS.NET模板已經創建了一些通用的代碼,並且在大多數情況下需要一些修正。正如你猜測的那樣,該模板並不關注你使用的是什麼表、什麼數據庫,因此所有的數據庫相關的代碼應該被提煉出來。

現在我們將構建SqlDataProvider代碼。打開CodeSmith,使用VB SqlDataProvider.cst模板。輸入和存儲過程相同的選擇,並生成代碼。拷貝新代碼到文件SqlDataProvider.vb中。只替代最後部分的代碼,在那部分
定義了所有HelloWorld相關的方法。保存文件並關閉。
 
我們已經完成了這部分,並不是很困難吧!
 
 

四.數據提供者抽象層(Data Provider Abstract Layer)

 
下一個需要的步驟是構建數據提供者抽象層(Data Provider Abstract Layer(DAL))。這部分將把我們的模塊從使用的真實數據庫中抽象出來。如果你想增加對另一個數據庫的支持,你只需要爲該數據庫(表和存儲過程)生成相關的DataProviders(正如最後一步)和特定的代碼即可。
 
打開CodeSmith並找到Vb DataProvider.cst模板。使用和前一步相同的選擇並拷貝生成的代碼到DataProvider.vb文件中。再一次只替代最後部分的代碼,在那裏定義了抽象方法。


五.業務層(Business Layer 

DotNetNuke使用自定義業務對象作爲一種與數據層通訊的方式,因此爲了能夠與前面建立的表一同工作,我們需要創建這些對象。

包括這兩步:

1.   生成支持業務對象的類;

2.   生成定義可使用操作的控制器類;

在先前版本中(DNNProjectTemplates 2.X,這兩個類包含在同一個文件中。在DotNetNuke 3.X中通用的做法是把兩個類分割成單獨的類文件。

下一步,執行名爲“Vb BLL Controller Class.cst”的模板。產生的代碼應該拷貝到你的主模塊項目的HelloWorldController.vb中。

這裏你可以看到除了兩個屬性的常用選擇:NameSpaceClassNameSpaceData。這裏你應該用你實際的項目名稱來代替“PA”(Private Assembly)部分,即這裏的HelloWorld

         注意:如果使用“Get”作爲你的“SelectPrefix”(選擇前綴),你應當把“Get”方法放置在“[ ]”中,因爲在VB.NET中“Get”是保留關鍵字。

 

六.視圖控制(View Control

我們從簡單的部分開始:只生成一個視圖控制並測試它是否工作。打開HelloWorld.ascx並添加一個Label(名爲Label1),設置屬性text爲“HelloWorld says Hello to:”,添加一個dataGrid(名爲DataGrid1)。爲了使情況變得有趣,我們在一個模板列中增加一個超鏈接控件。你的代碼應當看起來是這個樣子:

Example 1. 

<asp:Label id="Label1" runat="server">

  HelloWorld says hello to:

</asp:Label>

<aspataGrid id="DataGrid1" runat="server">

  <Columns>

    <asp:TemplateColumn>

      <ItemTemplate>

        <asp:HyperLink id="Hyperlink1" runat="server"

           Visible='<%# IsEditable %>'

           NavigateUrl='<%# EditUrl("itemid",
               DataBinder.Eval(Container.DataItem,"ItemID")) %>'>

          <asp:Image id="Image3" ImageUrl="~/images/edit.gif"

               AlternateText="Edit" Visible="<%# IsEditable %>"
               Runat="server" />

        </asp:HyperLink>

      </ItemTemplate>

    </asp:TemplateColumn>

  </Columns>

</aspataGrid>  

    

把如下代碼添加到 Page_Load函數中:

Example 2. 

Private Sub Page_Load(....) Handles MyBase.Load

    Try

        Dim objHelloWorld As New HelloWorldController

        Dim list As ArrayList

        If Not Page.IsPostBack Then

            list = objHelloWorld.GetByModules(ModuleId)

            Label1.ControlStyle.Font.Bold = CType(Settings("HelloBold"), Boolean)

            DataGrid1.DataSource = list

            DataBind()

        End If

    Catch exc As Exception

        ProcessModuleLoadException(Me, exc)

    End Try

End Sub

你會看到模板自動產生名爲“Optional Interfaces”的代碼區域。這包括被DotNetNuke框架使用的幾個屬性和方法定義,目的是爲了得知如何與模塊交互。不要改變任何東西,因爲自動生成的代碼就可以用了。

 

現在編譯解決方案。如果你沒有出錯的話就會毫無錯誤的編譯通過。確信也編譯了前邊我們創建的項目。

 

現在我們將在你的DotNetNuke portal中安裝該模塊,以host身份登陸,轉到模塊定義,增加一個模塊並定義如下:

(待續)

 
 
 

八.設置控制(Settings Control

作爲最後一步,我們將學會如何使用模塊的設置控制。該控制將使用標準的DotNetNuke核心特性被添加到模塊動作菜單的默認設置選項中。

 

打開Settings.ascx用戶控件並添加一個CheckBox控件(將它命名爲Checkbox1)並設置文本屬性爲“Header in bold”。

 

打開該控件的代碼文件並將下面的代碼代替LoadSettings中的代碼:

Public Overrides Sub LoadSettings()
   Try
        If Not Page.IsPostBack Then
            CheckBox1.Checked = CType(Settings("HelloBold"), Boolean)
        End If
    Catch exc As Exception
        ProcessModuleLoadException(Me, exc)
    End Try
End Sub

 

用下面的代碼代替UpdateSettings中的代碼:

 

Public Overrides Sub UpdateSettings()
    Try
        Dim objModules As New Entities.Modules.ModuleController
        objModules.UpdateModuleSetting(ModuleId, "HelloBold",
             CheckBox1.Checked.ToString)
    Catch exc As Exception
        ProcessModuleLoadException(Me, exc)
    End Try
End Sub

 

現在你可以重新編譯項目,測試一下看是否工作正常。增加幾條信息並改變模塊設置中的粗體選項,看看模塊是如何工作的。

 

一切ok!你現在在DotNetNuke 3.X中已經擁有了一個很好的HelloWorld模塊。

 

九.打包(Packaging

         如果你打算分發該模塊,你應當把所有必需的文件打包到一個zip文件中,並創建一個配置文件(其擴展名爲 .dnn)。之後你就可以在任何站點使用DotNetNuke的自動處理來安裝該模塊。

 

         如果你遵從先前的指導的話,壓根兒你就不需要修改HelloWorld.dnn文件(你可以在VS.NET中你的項目的Install文件夾下找到該文件)。爲了確信該文件的正確性,檢查其中列出的文件並查看它們是否和你創建的文件相同。

除了zip文件自身,對於zip壓縮文件中的每個文件,確信HelloWorld.dnn包含一節:        

<file>

                   <name>……</name>

</file>

 

App_LocalResources文件夾下的文件應該象下面這樣列出:

 

<file>

         <path>App_LocalResources </path>

         <name>……</name>

</file>

 

Zip文件中應當包含如下文件:

  • HelloWorld.ascx

  • HelloWorldEdit.ascx

  • Settings.ascx

  • VMasanas.DNN.Modules.HelloWorld.dll (dll for the module project)

  • VMasanas.DNN.Modules.HelloWorld.SqlDataProvider.dll (dll for the dataprovider)

  • HelloWorld.dnn (install file)

  • icon_HelloWorld_32px.gif

  • module.css

  • HelloWorld.ascx.res (from the App_LocalResources folder)

  • HelloWorldEdit.ascx.res (from the App_LocalResources folder)

  • Settings.ascx.res (from the App_LocalResources folder)

還應該包含2個文件:

  • 01.00.00.SqlDataProvider。該文件包含第四步(數據庫DataBase)中產生的代碼。還記得我們把那些代碼保存到一個文件中嗎?把這些生成的代碼複製到該文件中並把它包含在zip壓縮文件中。名稱的第一部分應當和dnn文件(<version>01.00.00</version>)中的數字相同。該文件會在這個私有程序集(PA)被安裝到DotNetNuke中時執行。你也必須添加sql腳本來創建在該指南中我們先前創建的HelloWorld表(你可以使用VS.NET或企業管理器來生成該表的創建腳本)。在生成的腳本中你應當移除所有對你使用的數據庫的引用-數據庫擁有者,並用{databaseOwner}替代。同樣的,如果你對你所有的DotNetNuke對象(在web.config中所指定)使用了一個對象限定符,你應當把所有的引用用{objectQualifier}來替代。

  • uninstall.SqlDataProvider。你應當把當模塊卸載時清理數據庫所需要的代碼放到這裏。在我們的用例中,它應當包含用於存儲過程和HelloWorld表的drop語句。

     

你會在HelloWorldSqlDataProvider文件夾中找到上述的兩個文件。

這是一個在任何給定的DotNetNuke安裝中用來創建HelloWorld表的正確的腳本:

 

if exists (select * from dbo.sysobjects where id = object_id(
N'{databaseOwner}{objectQualifier}VMasanas_HelloWorld') and
OBJECTPROPERTY(id, N'IsUserTable') = 1)
{databaseOwner}{objectQualifier}VMasanas_HelloWorld
GO

 

if not exists (select * from dbo.sysobjects where id = object_id(
N'{databaseOwner}{objectQualifier}VMasanas_HelloWorld') and
OBJECTPROPERTY(id, N'IsUserTable') = 1)
 BEGIN
CREATE TABLE {databaseOwner}{objectQualifier}VMasanas_HelloWorld (
 [itemID] [int] IDENTITY (1, 1) NOT NULL ,
 [moduleID] [int] NOT NULL ,
 [message] [nvarchar] (50) NOT NULL
) ON [PRIMARY]
END

 

GO

 

ALTER TABLE {databaseOwner}{objectQualifier}VMasanas_HelloWorld
WITH NOCHECK ADD
 CONSTRAINT [PK_VMasanas_HelloWorld] PRIMARY KEY  CLUSTERED
 (
  [itemID]
 )  ON [PRIMARY]
GO

 

ALTER TABLE {databaseOwner}{objectQualifier}VMasanas_HelloWorld ADD
 CONSTRAINT [FK_VMasanas_HelloWorld_Modules] FOREIGN KEY
 (
  [moduleID]
 ) REFERENCES {databaseOwner}{objectQualifier}Modules (
  [ModuleID]
 ) ON DELETE CASCADE
GO

 

你需要用一個乾淨的,沒有安裝HelloWorldDotNetNuke站點來測試私有程序集安裝包。

(全文完!)



4-09-2006 10:17 上午 舉報 

(接上面的)

第一個控制應當被定義爲 Type=View ;編輯控制的類型應當爲 Type=Edit ;設置控制應當設置爲 Type=Admin

一旦模塊被正確定義之後,我們就可以測試看它如何工作。把 HelloWorld 模塊添加到任意頁中,看看有什麼情況發生。如果順利的話,你應該只能看到消息“ HelloWorld says hello to: ”。因爲數據庫中的表裏還沒有任何記錄因此 DataGrid 中什麼也不顯示。

 

下一步我們將學習如何調整編輯控制以便於我們能夠添加並修改 HelloWorld 表中的記錄。

 

七.編輯控制(Edit Control

這一步我們將修改 HelloWorldEdit 控件以便於我們能夠往數據庫表中添加以及修改工作項。打開 HelloWorldEdit.ascx 。就象你看到的那樣,它已經包含了默認的命令按鈕在任何編輯屏幕中來執行通用的過程: Update,Delete Cancel

 

添加一個 textBox 控件到該自定義控件中並命名爲 txtMessage 。現在打開該控件的後臺代碼。

 

如果你遵循該指南的所有步驟,該頁中大多數自動生成的代碼會起作用。。我們只添加很少量的更新:

 

1.   Page_Load 方法中的 ’Load Data 註釋後面添加如下代碼 :

txtMessage.Text = objHelloWorld.message

 

這會從數據庫獲取消息並在 textbox 中顯示出來。

2.   cmdUpdate_Click 方法的註釋 bind text values to Object 後面添加如下代碼 :

 

objHelloWorld.message = txtMessage.Text

 

在更新我們當前的記錄到數據庫之前我們要設置我們自定義業務對象的參數爲用戶輸入的實際值。我們也同樣設置當前編輯記錄( itemId )和 ModuleId (作爲當前模塊的引用,如果想在你的站點中能夠擁有該模塊的多個實例,並關聯記錄到每一個特定的模塊實例,這樣做很有必要)。

 

這就是這一步中所有要做的。重新編譯解決方案,並瀏覽你的 web 站點。你現在應該能夠增加新的消息,並編輯和刪除現存的某一個。爲了打開你的 DotNetNuke 中的 HelloWorld 模塊的編輯控件,站點( portal )使用模塊動作菜單( module actions menu )。

 

你可能已經注意到,該菜單的第一項既有可能爲空,也有可能包含如下文本: RESX:AddContent.Action 。在這裏你究竟會看到什麼樣的內容最終依賴於 web.config 中的一項設置: ShowMissingKeys 如果它設置爲“ true ”,你會看到 RESX:AddContent.Action 信息,否則它將會是一個空的入口。

 

DotNetNuke 版本 3 支持靜態本地化。這是什麼意思呢? DotNetNuke 核心框架(以及在任何第三方模塊如你的 HelloWorld 中)的所有文本,並不依賴於最終用戶所輸入的內容(因爲名稱爲靜態內容),因此可以被翻譯爲當前活動用戶使用的語言。這是通過添加所有的本地化字符串到一個資源文件中來實現的。資源文件是爲在 DotNetNuke 中某個給定的控件所使用的所有字符串提供本地化值的一種方式(如果這裏你需要更多的信息,請查閱 DotNetNuke 文檔)。每一個 DotNetNuke 控件應當在控件文件夾下的 App_LocalResources 文件夾中 擁有一個相關的資源文件。

 

你只需要添加引用健值到字符串中(在 AddContent.Action 中)並適當的翻譯到正確的文件中。因此,在文件夾 App_localresources 中打開 HelloWorld.ascx 文件並添加一個入口點,名爲 AddAction.Content 值爲 Edit Message (確保在這裏使用準確的名稱,因爲健值是大小寫敏感的)。

 

保存文件,重新打開站點,現在你應當會在模塊動作菜單中看到正確的文本。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章