QeePHP 开源社区 - 引领 PHP 开发新思想、新模式's Archiver

dualface 发表于 2008-5-27 04:09

CMS 模型

经过前段时间的讨论,方向、目标等都已经确定下来,下一步就是比较实质性的东西了。

这几天我综合以前的经验和一些实验,设计了如下的 CMS 模型。

首先,整个 CMS 模型中有下列对象:

[list]
[*][b]内容[/b] - 这个不用多说了,文本、图片、视频都是内容;
[*][b]标签[/b] - 标签是用来给内容进行分类的,所有的内容都可以指定多个标签;
[*][b]标签分类[/b] - 标签本身是分了类的。例如有“栏目”标签、“某某分类”标签等;
[*][b]标签属性[/b] - 标签分类具备各种扩展属性,例如“栏目”类型的标签就具有栏目模板等属性;
[*][b]内容查询[/b] - 是一个开发者定义的查询结构,用于按照特定条件从内容中查询出需要的部分。例如“最新添加的10个内容”;
[/list]


[size=4][b]内容的分类[/b][/size]

在这个 CMS 模型中,我们不再使用栏目、版块等字段来区分内容是属于哪一个栏目或者版块的。因为在当今现代化的 CMS 中,我们不应该限定一个内容只能用于一个栏目或版块。

但是,我们仍然需要对网站设置不同的栏目、版块、专题等。所以我们用一个分类系统来完成该项工作。分类系统由标签、标签分类、标签属性三种对象组成。

例如我们的网站有“栏目”和“专题”两种类型的标签。两种类型的标签又分别有:

【栏目】标签
PHP应用
Web开发

【专题】标签
FleaCMS专题
QeePHP专题
MySQL专题

现在,我们录入任何一个内容,都可以为这个内容指定上述 5 个标签的其中一个或多个。

假设《如何用 QeePHP 备份 MySQL 数据库》这篇文章有“PHP应用”、“Web开发”、“QeePHP专题”和“MySQL专题”四个标签。那么可能在上述两个栏目和两个专题中都可以看到该篇文章。

由于这种分类方式的灵活性,CMS 系统中的任何一个内容都是可以被“复用”的。

考虑到实际系统中,不同类型的标签通常会有一些额外设置。例如“栏目”通常需要指定该栏目对应的模板文件等信息,所以我们还需要一个标签属性对象。


[size=4][b]内容的检索[/b][/size]

好了,我们现在解决了内容的分类问题。那么怎么检索需要的分类呢?

这就是“内容查询”对象的作用了。内容查询类似一个数据库,可以查询出符合特定条件的内容。例如我们可以定义一个查询出“PHP应用”栏目最新10篇文章的查询对象。


[size=4][b]内容的呈现[/b][/size]

最终,内容需要以合适的方式呈现出现才有意义。这个工作就不能光靠 CMS 模型来完成了。

过去,我们在设计一个 CMS 页面时,通常是先做好页面。然后确定页面由哪段代码来显示。在这段代码中,我们写上一些查询语句,查询出需要的数据,然后指定给模板引擎。最后让模板引擎将模板显示出来。

这种方法很简单,但是没有灵活性。如果页面要显示的数据不同了,你得改代码。增加一个新页面,只要有一点点不同,你就要写一段新的代码来查询和给模板引擎指定数据。

现在,改为在模板中直接获取需要的内容。

[code lang="php"]

<?php $contents = Content::find(....); // 查询内容 ?>
<ul>
<?php foreach ($contents as $content): ?>
  <li><?php echo h($content->title); ?></li>
<?php endforeach; ?>
</ul>

[/code]

很显然,这样改一下,我们如果改模板,根本不需要动程序。而且几乎可以用一段代码来显示不同的多个页面。

但是,我们把查询语句放到模板中存在许多问题:

1、查询操作和显示逻辑混在一起了。如果我在多个地方需要查询同样的内容,我就得把查询代码重复几次(或者写成公共函数);
2、直接查询绕过了内容的访问控制。例如某些内容是只有特定用户才能访问的。如果从模板里面直接查询,显然会有问题,除非把访问控制的代码也写到模板。但这样一来,我们岂不是倒退了?
3、如果一个页面上多处需要显示同样的内容,我们还得在页面模板里面考虑查询缓存。

总之,把查询放到模板里面绝对是个坏主意。

幸好,我们可以利用 FleaPHP 的 WebControls,把一个区域封装为可以复用的“区块”。然后在不同的页面中就可以共享这些区块了。

如果我们更进一步呢?把查询操作也委托出去,WebControl 区块仅仅负责调用查询对象获得数据,然后够造成 HTML 代码。这样我们就可以在查询对象中进行查询缓存、访问控制等操作了。而且由于查询对象返回的是纯数据,所以在 WebControl 区块中,我们可以用喜欢的方式来呈现这些数据。轻松实现了“同一内容多种表现方式”的需求。

OK,大家现在知道“内容查询”对象的作用了吧。


[size=4][b]简化模板和区块的开发[/b][/size]

经过我们一番努力,我们已经可以比较容易的实现一个很灵活的 CMS 系统了。现在大家发现在这个系统里面做一个内容网站,最大的工作量反倒成了模板的制作和区块的开发。那么这部分工作还能够简化吗?
答案是使用一套特别的标签系统来简化工作。

这套标签系统由一系列标签组成,例如 CMSEntries、CMSEntryTitle 等。

这些标签用起来很简单:

[code lang="html"]
<ul>
<CMSEntries source='最热门的10篇文章'>
  <li><CMSEntryTitle></li>
</CMSEntries>
</ul>
[/code]

CMSEntries 的 source 属性指定了从哪个查询对象(查询对象都有自己的名字)获得数据,然后在嵌套的 CMSEntryTitle 中就可以输出内容的标题了。

由于有了这样的标签系统。我们可以把许多 WebControl 给去掉,仅仅用模板引擎的子模板机制来实现。而且对于页面制作人员来说,简单的标签系统绝对比 WebControl 区块更容易创建。也就说最终用户只要简单学习一下,就可以自己改模板了。当然了,查询对象现在还得自己编写。不过以后可以通过工具来生成,或者在后台定义。

dualface 发表于 2008-5-27 04:17

这个附件里面的代码是几年前做的一个标签系统,主要有 CMSEntry 和 CMSCategory 两类,以 Smarty 插件的形式实现的。

只要稍加扩展,标签系统本身可以做成模板引擎无关的。

dualface 发表于 2008-5-27 04:26

除了 CMS 模型和内容的呈现,还有页面访问路径等问题需要解决。继续研究。。。。最新成果随时向大家汇报。

张文豪 发表于 2008-5-27 08:01

抢个位
我顶
:victory:

张文豪 发表于 2008-5-27 08:17

[quote]原帖由 [i]dualface[/i] 于 2008-5-27 04:26 发表 [url=http://www.fleaphp.org/bbs/redirect.php?goto=findpost&pid=19121&ptid=3366][img]http://www.fleaphp.org/bbs/images/common/back.gif[/img][/url]
除了 CMS 模型和内容的呈现,还有页面访问路径等问题需要解决。继续研究。。。。最新成果随时向大家汇报。 [/quote]
路径确实是个很头疼的问题
FLEAPHP支持PHPINFO和URL重写
还是使用绝对路径比较好
方便用户选择
定义一个ROOT常量
指向网站根目录

wwwwgq 发表于 2008-5-27 08:37

恩~

另外,是否考虑有静态页面输出呢?

1. 静态页面当然是绝对路径;
2. 动态页面的路径可以类似虚拟html就行了(类似discuz那样方便检索就行)
至于ROOT变量 建议是如果设定了则按ROOT来指定根路径,否则程序自行判断路径。方便高级用户及初级用户区别。谁不想程序拿来就能用呢~ 如果需要再设定也不迟~

[[i] 本帖最后由 wwwwgq 于 2008-5-27 09:06 编辑 [/i]]

dos2000 发表于 2008-5-27 13:20

路由问题的关键是完善url()函数,否则一旦路由改变,页面中数量众多的链接改动起来绝对是个麻烦事

单入口程序结构本身就必须依赖urlrewrite构造路由,所以urlrewrite可用的情况下,可以比较容易地将url显示成
任意的样式。如果打开静态开关,则可以在程序第一次运行的时候在重定向的位置生成静态页面,当静态页面被
删除或不存在的情况下,php程序被执行,否则,服务器会自动调用html文件

如果urlrewrite不可用的情况下,就维持url原状吧,shopex之类的产品也都是这么做的

heixiake 发表于 2008-5-27 15:12

老大的作息时间呀,唉,辛苦了

heixiake 发表于 2008-5-27 15:15

回复 7# dos2000 的帖子

做成后台可以自己设置的URL,如静态还是动态的就行

swaygently 发表于 2008-5-27 16:44

真佩服dualface的工作热情和状态!

session1987 发表于 2008-5-27 18:23

要考虑一下容易实现二级域名. 生成出来的HTML文件要容易分发到多台服务器上, 数据库方面无所谓了, 反正全站静态的. 我们这里有100多个编辑人员.

还有就是图片附件/ 其它格式的附件也要容易分离到多服务器.

[[i] 本帖最后由 session1987 于 2008-5-27 18:25 编辑 [/i]]

session1987 发表于 2008-5-27 18:30

CMS 模版标签也需要解决那种 一行多条显示. 某一部分不带链接. 特殊内容加图标表示等功能. 附张图
还有要很容易做到内容编辑人员和页面审核人员的工作分离.

skyblue 发表于 2008-5-28 17:06

为何不做QeeCMS....
比较诧异.

pennyhe 发表于 2008-6-3 15:46

根据dualface大大标签模型,如果是分级的问题怎样解决?
如:
php
    --php文章
  --php源码
asp
    --asp文章
  --asp源码

dualface 发表于 2008-6-3 22:33

嗯。标签也可以是树形结构的。

比如栏目标签之间有层次关系。

dualface 发表于 2008-6-3 22:35

回复 13# skyblue 的帖子

现在就在用 qeephp 验证这个 cms 模型。只要模型验证通过,用 fleaphp/qeephp 都不是问题。

ppxstar 发表于 2008-6-4 11:52

为了以后能用fleacms,决定让我们公司的员工开始学习flea,并将其做为以后工作主要框架。

xiaobaby87 发表于 2008-6-8 19:04

顶你, 快点搞出来, fleaphp的速度好快 !

leiting084 发表于 2008-6-16 14:29

:lol 支持,看见各位的讨论,馋死我了
似乎就是我想要的cms

cha369 发表于 2008-7-16 17:41

关于内容的多重分类如果使用标签+标签属性的办法来处理确实灵活, 关键是如果检索出特定条件的内容比较麻烦, 使用正则或者like,再或者把内容id和标签id组合成主键, 感觉那个都不是现在的mysql数据查询擅长的,如果解决检索和编辑删除问题, 将是现有cms的一个飞跃.:lol

wukewei00o 发表于 2008-7-17 09:21

关注中

dos2000 发表于 2008-7-19 19:37

最近有啥新进展?老大能否定期公开模型设计文档,让俺们跟着学学?:pan_65:

ylcz 发表于 2008-8-1 13:51

期待期待:)

rennai 发表于 2008-8-1 13:56

怎么这么长时间也没有动静了?进展的怎么样了?

页: [1] 2

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.