在代码层次上看,SinaCMS是使用C++编码的,模板取数据的时候则使用了perl脚本。SinaCMS里面频道、项目和模板是结合在一起的,他们三者的关系是:

  1. 一个频道就是一个项目,在数据库里面体现就是一个数据库,比如说新闻中心,对应一个名为news的数据库;
  2. 一个频道会有若干个模板,例如首页,新闻页,这些在数据库中体现为相关的表;
  3. 模板需要定义模板域,模板域有表单类型模板域(Form)和应用类型模板域(Application)两种类型,前者面向编辑的提供数据界面接口功能,后者面向技术支持人员提供高级的二次开发功能。模板域在数据库中就是模板表中相对应的数据扩展字段,例如Form::TextField对应的就是text字段,数据由编辑录入,Application::SQLResult 也是text字段,存储的则是执行Perl脚本执行后的结果。模板的内容存储在另外的字段中。

不难看出,SinaCMS具有极其强大的灵活性。因为它的数据库结构是项目建立以后构建模板的时候才确定的。各个频道,例如资讯频道、财经频道和汽车频道,可以拥有完全不同的数据库结构,不同频道的特殊需求也可以完全定制。另外可以看出SinaCMS里面的模板是最主要的模型,承担了确定数据表结构、文章发布和管理以及配置频道参数等等功能。

我们来看CMS系统中常见的新闻页,频道首页和列表页在SinaCMS中是怎么实现的。

编辑上文章时,先找到该频道的新闻页,然后在下面录入文章,录入完毕后点击发布,系统会根据模板的内容去获取相关的字段内容,根据模板的属性最后发布成相应的静态文件,其间如果和其他模板有相关关系(在新闻页模板域中定义Application::PostInPage),则会去触发相应的模板(例如首页和列表页)更新。

在首页模板的区块中,可以分为动态和静态两种。对于需要经常更新的静态区块,可以独立出来做成一个模板,静态区块就相当于该模板下的一篇(有且仅有一篇)文章,当然也可以在首页中新建一个Form::TextField的模板域。动态区块例如动态新闻列表,则可以在首页中新建一个Application::SQLResult的模板域,通过执行perl脚本获取内容填充,然后在首页模板内容引用该模板域,当然同样也可以新建一个只包含一个Application::SQLResult域的模板。

对于列表页,首先列表页的分页值可以存储在列表页的模板域中,也可以保存在某个模板中。分页在处理时,会通过perl脚本来执行分页算法。最终所有列表页都是列表页模板下的一个文档集。

在一个项目中,为了提高发布效率,还会存在若干的临时存储表和归档表(其实就是一些模板啦)。例如在首页的动态新闻列表,就有可能建一个临时存储数据的模板,这时如果频繁更新首页或者含有动态新闻列表的模板时,无疑将减轻数据库的压力。新闻单页的模板在处理时可以就保存最近一个月内的文章,尤其在文章数据增长较快的频道,这时就很有必要。那么以前的文章就需要转储到一个归档表中,作为查询和偶尔更新某篇文章使用。

SinaCMS中的频道路径path(例如资讯>大陆>正文)是通过模板处理的,在模板的模板域中会用perl来处理相关的逻辑。子频道和专题也是通过模板来实现的,它会通过新增一个模板来建立子频道和专题之间的关系。

至此,我们可以了解到SinaCMS中使用了非常多的冗余字段来存储本来需要多表联合查询的数据,这无疑提高了文章的发布效率。

在其他的CMS中,模板只是独立概念中的一个,而在SinaCMS中,万事万物皆模板

其实我理解也不是很透,所以以后有时间我会再对本文做一些更新。