文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>CMS系统模版引擎设计(1):基础类型

CMS系统模版引擎设计(1):基础类型

时间:2010-11-09  来源:君之兰

初步设计就是如此,增加了一个IsPartial属性,因为我们的模版或许会作为部分视图在其他模版里调用,就像UserControl一样。

那么Page类的设计就略显复杂了。我们想访问一个Page起码要有访问路径吧,所以就要有一个UrlPattern属性,也就是访问规则,因为像详细页一般只是参数的变化,所以URL不能写死,只能是一个规则。既然有规则,也会有一些参数,而且参数不一定是?name=value形式,可能是/value/value1形式,所以我们还得设计一个UrlPattern类。

代码     /// <summary>
    /// Url访问规则
    /// </summary>
    public class UrlPattern
    {
        /// <summary>
        /// 具体规则
        /// </summary>
        public string Pattern { get; set; }
        /// <summary>
        /// 正则引擎
        /// </summary>
        public Regex Regex { get; set; }
        /// <summary>
        /// 参数列表
        /// </summary>
        public string[] Parameters { get; set; }
        /// <summary>
        /// 获取某个参数的值
        /// </summary>
        /// <param name="rawurl">当前访问的URL</param>
        /// <param name="name">参数名</param>
        /// <returns></returns>
        public string GetValue(string rawurl, string name)
        {
            throw new System.NotImplementedException();
        }
    }

 

是的,你没看错,我们要用正则表达式,这可能是对制作人员难度最大的部分。:)不过可以教他们初级的写法,可以应付绝大多数需求。

比如我写一个规则如下  /details/(?<articleid>\d+),这个表明参数名为articleid,访问规则就是 “/details/数字”

Page除了访问URL外还要有缓存的概念,不然我们如何提升性能,你说是不?!缓存可能还会用标签里去,因为如果Page不缓存只是缓存了某个标签,所以Label也要有缓存,那么我们是否需要设计一个缓存类呢?

代码     /// <summary>
    /// Page/Template/Label的缓存
    /// </summary>
    public class Cache
    {
        /// <summary>
        /// 缓存名
        /// </summary>
        public string Key { get; set; }
        /// <summary>
        /// 缓存秒数
        /// </summary>
        public int CacheSeconds { get; set; }
        /// <summary>
        /// 获取缓存数据
        /// </summary>
        /// <returns></returns>
        public object GetData()
        {
            throw new System.NotImplementedException();
        }
        /// <summary>
        /// 移除缓存
        /// </summary>
        public void Remove()
        {
            throw new System.NotImplementedException();
        }
        /// <summary>
        /// 更新缓存
        /// </summary>
        /// <param name="data"></param>
        public void SetData(object data)
        {
            throw new System.NotImplementedException();
        }
    }

 

那么Page类还应该有什么?Labels!是的,我们不可能每次都去解释模版来获取所有的Label,而是Page被缓存后我们只需要访问他的LabelCollection即可。那么我们来看下Page的设计雏形吧。

 代码

    /// <summary>
    /// Page类
    /// </summary>
    public class Page
    {
        /// <summary>
        /// ID
        /// </summary>
        public Guid PageId { get; set; }
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 关键字
        /// </summary>
        public string Keywords { get; set; }
        /// <summary>
        /// 描述
        /// </summary>
        public string Description { get; set; }
        /// <summary>
        /// 模版
        /// </summary>
        public Template Template { get; set; }
        /// <summary>
        /// 访问路径规则
        /// </summary>
        public UrlPattern UrlPattern { get; set; }
        /// <summary>
        /// 标签
        /// </summary>
        public Label[] Labels { get; set; }
        /// <summary>
        /// 缓存
        /// </summary>
        public Cache Cache { get; set; }
        /// <summary>
        /// 显示HTML代码
        /// </summary>
        public void Render()
        {
            throw new System.NotImplementedException();
        }
    }

 

不错哦,袄哟,不错哦。

其实对于大型的站点,子站的概念是不可缺少的。或者我们的CMS需要支持多站点,那么还需要一个Site类。

 代码

   /// <summary>
    /// 站点
    /// </summary>
    public class Site
    {
        /// <summary>
        /// 站点ID
        /// </summary>
        public Guid SiteId { get; set; }
        /// <summary>
        /// 站点名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 站点备注
        /// </summary>
        public string Note { get; set; }
        /// <summary>
        /// 站点域名
        /// </summary>
        public string[] Domains { get; set; }
        /// <summary>
        /// 站点状态
        /// </summary>
        public Status Status { get; set; }
        /// <summary>
        /// 站点的页面
        /// </summary>
        public Page[] Pages { get; set; }
    }

 


站点一般包含多个可访问的域名,所以有个Domains。当然站点包含N个Page。


好啦,初步的设计就到这了,下节我们讲怎么让这些类运作起来。



 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载