首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Cuyahoga 平添模块

2012-10-08 
Cuyahoga 添加模块Cuyahoga 国外的开源CMS一般都是基于模块设计的 ,好处是可以随意定制自己的页面和模块,

Cuyahoga 添加模块
Cuyahoga 国外的开源CMS一般都是基于模块设计的 ,好处是可以随意定制自己的页面和模块,这样在以后的应用中就能够灵活的满足变化的功能需求. 一个模块齐全的CMS如DNN , Rainbow就可以快速搭建符合需求的系统.

下面就来介绍如何为Cuyahoga这个著名的开源网站框架加入具有后台管理的公告模块.可以参考这篇如何在Cuyahoga中新增一个简单的功能模块了解基础的步骤.

为Cuyahoga开发自定义模块时,你可以选择任何数据访问策略.然而Cuyahoga本身是使用NHibernate作为数据持久层,可以做到支持多数据库. 采用Castle.Windsor进行依赖注入,降低模块之间的耦合. 我们的数据访问层也将用NHibernate实现.

最终项目的目录结构如下:
Cuyahoga 平添模块

主要步骤如下
1 .创建一个Sql文件(Install.sql)用来安装数据表及添加模块的相关信息 , 该sql文件会在安装模块时,由Cuyahoga自动执行.也可以手工执行进行安装.
Cuyahoga 平添模块Cuyahoga 平添模块install.sql
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->IF?NOT?EXISTS?(SELECT?*?FROM?sysobjects?WHERE?id?=?OBJECT_ID(N'[cm_Announcements]')?AND?OBJECTPROPERTY(id,?N'IsUserTable')?=?1)
?BEGIN
CREATE?TABLE?[cm_Announcements]?(
????[AnnouncementsID]?[int]?IDENTITY?(1,1)NOT?NULL?,
????[sectionid]?[int]?NOT?NULL?,
????[createdby]?[nvarchar]?(100)?NULL?,//公告作者
????[Title]?[nvarchar]?(150)?NULL?,//公告标题
????inserttimestamp?datetime?DEFAULT?current_timestamp?NOT?NULL,
????updatetimestamp?datetime?DEFAULT?current_timestamp?NOT?NULL,
????
????CONSTRAINT?[PK_cm_Announcements]?PRIMARY?KEY??NONCLUSTERED?
????(
????????[AnnouncementsID]
????),
????CONSTRAINT?[FK_cm_Announcements_cm_Modules]?FOREIGN?KEY?
????(sectionid)?REFERENCES?cuyahoga_section?(sectionid)
)
END
GO
/*加入模块信息*/
INSERT?INTO?cuyahoga_moduletype?([name],?assemblyname,?classname,?path,?editpath,?inserttimestamp,?updatetimestamp)?VALUES?
('Announcements',?'Cuyahoga.Modules.Announcements',?'Cuyahoga.Modules.Announcements.AnnouncementsModule',?
'Modules/Announcements/Announcements.ascx',?'Modules/Announcements/EditAnnouncements.aspx',?current_timestamp,?current_timestamp)
GO
/*加入模块版本信息*/
INSERT?INTO?cuyahoga_version?(assembly,?major,?minor,?patch)?VALUES?('Cuyahoga.Modules.Announcements',?1,?5,?0);
go
2.创建域模型 在本例中是实体类
Cuyahoga 平添模块Cuyahoga 平添模块Announcement.cs
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using?System;
using?Cuyahoga.Core.Domain;

namespace?Cuyahoga.Modules.Announcements.Domain
{
????public?class?Announcement
????{
????????private?int?_id;
????????private?string?_title;
????????private?string?_content;
????????private?DateTime?_expiredate;
????????private?Section?_section;
????????private?User?_createdBy;
????????private?DateTime?_updateTimestamp;

????????///?<summary>
????????///?Property?Id?(int)
????????///?</summary>
????????public?int?Id
????????{
????????????get?{?return?this._id;?}
????????????set?{?this._id?=?value;?}
????????}
????????///?<summary>
????????///?Property?Title?(string)
????????///?</summary>
????????public?string?Title
????????{
????????????get?{?return?this._title;?}
????????????set?{?this._title?=?value;?}
????????}
????????///?<summary>
????????///?Property?Section?(Section)
????????///?</summary>
????????public?Section?Section
????????{
????????????get?{?return?this._section;?}
????????????set?{?this._section?=?value;?}
????????}
????????///?<summary>
????????///?Property?CreatedBy?(User)
????????///?</summary>
????????public?User?CreatedBy
????????{
????????????get?{?return?this._createdBy;?}
????????????set?{?this._createdBy?=?value;?}
????????}
????????///?<summary>
????????///?Property?UpdateTimestamp?(DateTime)
????????///?</summary>
????????public?DateTime?UpdateTimestamp
????????{
????????????get?{?return?this._updateTimestamp;?}
????????????set?{?this._updateTimestamp?=?value;?}
????????}
????????public?Announcement()
????????{
????????????this._id?=?-1;
????????}
????}
}
3.创建映射文件
Cuyahoga 平添模块Cuyahoga 平添模块Announcement.hbm.xml
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><?xml?version="1.0"?encoding="utf-8"??>
<hibernate-mapping?xmlns="urn:nhibernate-mapping-2.0">
??<class?name="Cuyahoga.Modules.Announcements.Domain.Announcement,?Cuyahoga.Modules.Announcements"?table="cm_Announcements">
????<id?name="Id"?column="Announcementsid"?type="Int32"?unsaved-value="-1">
??????<generator?class="native">
????????<param?name="sequence">cm_Announcements_Announcementsid_seq</param>
??????</generator>
????</id>
????<timestamp?name="UpdateTimestamp"?column="updatetimestamp"?/>
????<property?name="Title"?column="title"?type="String"?length="150"?/>
????<many-to-one?name="Section"?class="Cuyahoga.Core.Domain.Section,?Cuyahoga.Core"?column="sectionid"?not-null="true"?/>
????<many-to-one?name="CreatedBy"?class="Cuyahoga.Core.Domain.User,?Cuyahoga.Core"?column="createdby"?not-null="true"?/>
??</class>
</hibernate-mapping>

4.创建公告模块的核心控制类
Cuyahoga 平添模块Cuyahoga 平添模块AnnouncementsModule.cs
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using?System;
using?System.Collections;
using?System.Xml;
using?System.Xml.XPath;
using?System.Net;
using?System.Web;
using?System.Text;
using?System.IO;
using?System.Threading;

using?NHibernate;
using?Castle.Services.Transaction;
using?Castle.Facilities.NHibernateIntegration;

using?log4net;

using?Cuyahoga.Core;
using?Cuyahoga.Core.Domain;
using?Cuyahoga.Core.Service;
using?Cuyahoga.Core.Util;
using?Cuyahoga.Web.Util;
using?Cuyahoga.Web.Components;
using?Cuyahoga.Modules.Announcements.Domain;

namespace?Cuyahoga.Modules.Announcements
{
????//采用Facilities管理事务
????[Transactional]
????public?class?AnnouncementsModule?:?ModuleBase,?INHibernateModule
????{
????????private?static?readonly?ILog?log?=?LogManager.GetLogger(typeof(AnnouncementsModule));
????????private?int?_cacheDuration;
????????private?ISessionManager?_sessionManager;

????????//该模块需要用到NHibernate?session?manager提供的服务?进行依赖注入
????????public?AnnouncementsModule(ISessionManager?sessionManager)
????????{
????????????this._sessionManager?=?sessionManager;
????????}

????????public?override?void?ReadSectionSettings()
????????{
????????????base.ReadSectionSettings();
????????????//?Set?dynamic?module?settings
????????????this._cacheDuration?=?Convert.ToInt32(base.Section.Settings["CACHE_DURATION"]);
????????}

????????///不创建子事务
????????[Transaction(TransactionMode.RequiresNew)]
????????public?virtual?IList?GetAllAnnouncements()
????????{
????????????ISession?session?=?this._sessionManager.OpenSession();
????????????string?hql?=?"from?Announcement?f?where?f.Section.Id?=?:sectionId";
????????????IQuery?q?=?session.CreateQuery(hql);
????????????q.SetInt32("sectionId",?base.Section.Id);
????????????return?q.List();
????????}

????????[Transaction(TransactionMode.RequiresNew)]
????????public?virtual?Announcement?GetAnnouncementsById(int?AnnouncementsID)
????????{
????????????ISession?session?=?this._sessionManager.OpenSession();
????????????return?(Announcement)session.Load(typeof(Announcement),?AnnouncementsID);
????????}

????????[Transaction(TransactionMode.RequiresNew)]
????????public?virtual?void?SaveAnnouncement(Announcement?announcements)
????????{
????????????ISession?session?=?this._sessionManager.OpenSession();
????????????session.SaveOrUpdate(announcements);
????????}

????????[Transaction(TransactionMode.RequiresNew)]
????????public?virtual?void?DeleteAnnouncements(Announcement?announcements)
????????{
????????????ISession?session?=?this._sessionManager.OpenSession();
????????????session.Delete(announcements);
????????}
????}
}

5.创建用于前台显示的用户控件 用来显示公告的标题 作者和发布时间.
Cuyahoga 平添模块
Cuyahoga 平添模块Cuyahoga 平添模块Announcements.ascx
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><%@?Control?Language="C#"?AutoEventWireup="true"?Codebehind="Announcements.ascx.cs"
????Inherits="Cuyahoga.Modules.Announcements.Web.Announcements"?%>
<asp:repeater?id="rptAnnouncementItems"?runat="server"?enableviewstate="False">
????<itemtemplate>
????????????<div?class="genericdetails"?style="width:100%">
????????????<marquee??direction="left"?>
????????????????<asp:label?id="lblTitle"?runat="server"><%#?DataBinder.Eval(Container.DataItem,?"Title")%></asp:label>
????????????????<asp:label?id="lblAuthor"?runat="server">作者:<%#?DataBinder.Eval(Container.DataItem,?"CreatedBy.FullName")%></asp:label>
????????????????<asp:label?id="lblTime"?runat="server">发布时间:<%#?DataBinder.Eval(Container.DataItem,?"UpdateTimestamp")%></asp:label>
????????????</marquee>
????????????</div>
????</itemtemplate>
</asp:repeater>
Cuyahoga 平添模块Cuyahoga 平添模块Announcements.ascx.cs
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using?System;
using?System.Data;
using?System.Drawing;
using?System.Web;
using?System.Web.UI.WebControls;
using?System.Web.UI.HtmlControls;

using?Cuyahoga.Core.Util;
using?Cuyahoga.Web.UI;
using?Cuyahoga.Modules.Announcements.Domain;

namespace?Cuyahoga.Modules.Announcements.Web
{
????public?partial?class?Announcements?:?BaseModuleControl
????{
????????private?AnnouncementsModule?_module;
????????protected?void?Page_Load(object?sender,?EventArgs?e)
????????{
????????????if?(!this.IsPostBack?&&?!base.HasCachedOutput)
????????????{
????????????????this._module?=?base.Module?as?AnnouncementsModule;
????????????????this.rptAnnouncementItems.DataSource?=?this._module.GetAllAnnouncements();
????????????????this.rptAnnouncementItems.DataBind();
????????????}
????????}
????}
}
6.创建公告管理的列表页面
Cuyahoga 平添模块

Cuyahoga 平添模块Cuyahoga 平添模块EditAnnouncements.aspx
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><%@?Page?Language="C#"?AutoEventWireup="true"?Codebehind="EditAnnouncements.aspx.cs"
????Inherits="Cuyahoga.Modules.Announcements.Web.EditAnnouncements"?%>

<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html?xmlns="http://www.w3.org/1999/xhtml">
<head?runat="server">
????<title>公告管理页面</title>
</head>
<body>
????<form?id="Form1"?method="post"?runat="server">
????????<div?id="moduleadminpane">
????????????<h1>
????????????????公告管理</h1>
????????????<table?class="tbl">
????????????????<asp:Repeater?ID="rptAnnouncements"?runat="server"?OnItemDataBound="rptFiles_ItemDataBound">
????????????????????<HeaderTemplate>
????????????????????????<tr>
????????????????????????????<th>
????????????????????????????????公告标题</th>
????????????????????????????<th>
????????????????????????????????作者</th>
????????????????????????????<th>
????????????????????????????????发布日期</th>
????????????????????????????<th>
????????????????????????????</th>
????????????????????????</tr>
????????????????????</HeaderTemplate>
????????????????????<ItemTemplate>
????????????????????????<tr>
????????????????????????????<td>
????????????????????????????????<%#?DataBinder.Eval(Container.DataItem,?"Title")?%>
????????????????????????????</td>
????????????????????????????<td>
????????????????????????????????<%#?DataBinder.Eval(Container.DataItem,?"CreatedBy.FullName")%>
????????????????????????????</td>
????????????????????????????<td>
????????????????????????????????<asp:Literal?ID="litDateModified"?runat="server"></asp:Literal></td>
????????????????????????????<td>
????????????????????????????????<asp:HyperLink?ID="hplEdit"?runat="server">修改</asp:HyperLink>
????????????????????????????</td>
????????????????????????</tr>
????????????????????</ItemTemplate>
????????????????</asp:Repeater>
????????????</table>
????????????<br?/>
????????????<input?id="btnNew"?type="button"?value="新的公告"?runat="server"?name="btnNew"/>
????????</div>
????</co

热点排行