你现在的位置:首页 > PHP网站建设知识库 > phpcms > 正文

深入了解phpcms内容模型

phpcms通过内容模型功能实现了在后台即可管理文章数据表的功能。内容模型是一个 cms 最基本的功能。

每个内容模型对应一张数据表,添加一个内容模型就会添加一张数据表,删除一个内容模型就会删除一张数据表。

模型与数据表的对应规则是:数据表名=表前序 + c_ + 模型定义的表名。
\

对应的数据表就是 phpcms2008_c_jieju

在后台可以管理模型数据:
\
模型信息保存在 model 表中(eg. phpcms2008_model)

每个模型都有一组相同的字段,称为[系统字段]:
\
在添加模型时会自动加入系统字段,系统字段不能删除,只能禁用。

添加模型的操作通过 /admin/model.inc.php 中的 add 部份实现,真正处理的代码是 /include/admin/model.class.php 的 add() 方法。
通过执行 /include/admin/model.sql 中的 SQL 语句建立模型对应的数据表。

新建立的模型对应的数据表只有 contentid, content, template 三个字段,除 contentid 外,并没有如 catid, title 这类模型[系统字段]。

这些系统字段放在 content 表中(eg. phpcms2008_content),这个表有 contentid, catid, title, url, thumb 等这些基本的文章字段。

所有模型中的文章的 url, title, thumb 等数据都是保存在 content 表中的,除这些字段外的字段值才保存在对应的模型数据表中,比如 content 字段就保存在模型数据表。

在添加一篇文章时,先把由 content 表保存的数据插入 content 表,取回插入的 contentid, 就是数据库的 insert_id ,再把其它字段值插入模型数据表中, content 表称为主表,模型数据表称为扩展表,主表与扩展表通过 contentid 关联。

这种结构有以下几个特点:
1. 所有模型中的文章都可以使用一个连续的 contentid ,因此主表的一个作用就是产生一个自动编号的 contentid 。
2. 通过一个主表就可以查询到所有的文章数据,实现前台不同栏目不同模型的数据整合显示。
3. 从数据库优化的角度,一个数据表若要查询速度快,尽量使用定长的字段类型(eg. char),避免使用变长的字段类型(eg. varchar, text),因此把所有变长的字段(eg. content)都放在扩展表中,令主表所有字段都是定长字段类型,加快查询速度。

一个模型的字段信息保存在 model_field 表中(eg. phpcms2008_model_field),系统字段每一个对应主表中的一个字段,所以才会不能删除,其它字段每一个对应扩展表中的一个字段。

如 content 字段:

\

虽是在新建模型时建立的字段,但并非系统字段,对应的是扩展表中的 content 字段。

在给一个模型添加字段时,所添加的都是扩展表的字段。添加字段的操作由 /admin/model_field.inc.php 中的 add 部份执行。在使用 /include/admin/model_field.class.php 的 add() 方法把字段数据保存到 model_field 表后,会调用对应字段类型的 field_add.inc.php 文件为扩展表增加实际的数据表字段。

字段类型是对数据表字段的一种包装,cms 的所有字段类型存放于 /include/fields/ 目录下,每个字段类型一个文件夹,文件夹名就是字段类型名。

每个字段类型的中文含意保存在 /include/fields/fields.inc.php 文件中。

在后台添加模型字段时,会调用对应字段类型的 field_add.inc.php 文件,此文件的作用就是为扩展表添加字段。

以 editor 字段类型为例, editor 字段类型的中文含意是[编辑器],可以在 /include/fields/fields.inc.php 中查到,字段类型目录是 /include/fields/editor/ 。

字段类型可以有自己的设置参数,使用 field_add_form.inc.php 文件,editor 字段类型的设置参数表单文件就是 /include/fields/editor/field_add_form.inc.php :

\

另一个相似的文件是 field_edit_form.inc.php ,在修改字段时使用。

editor 字段类型实际使用 MySQL 的 MEDIUMTEXT 字段类型保存。在添加模型字段时,会调用字段类型的 field_add.inc.php 文件,其作用就是为扩展表添加实际的表字段, editor 字段类型的 /include/fields/editor/field_add.inc.php 文件就是给扩展表加上一个 MEDIUMTEXT 字段。

与 field_add.inc.php 功能相似的是 field_edit.inc.php 文件,在修改模型字段时调用,用于修改扩展表的字段。

在定义好模型及模型字段后,就可以使用模型录入数据了。cms 采用的是栏目关联模型,要使用模型需要先建立与此模型关联的栏目:
\
建好栏目后,就可以在[内容管理]菜单中打开对应的栏目,点击[发布],便可见到文章录入表单:

\

\

\

录入表单由对应的字段类型自己负责生成,比如 editor 字段类型的表单是一个 HTML 编辑器,由 editor 自己负责生成:
\
生成录入表单调用的是 /include/content_form.class.php 文件,里面是所有字段类型生成其表单的方法,比如 editor() 方法就是生成 editor 字段类型的录入表单。

录入文章的后台控制器是 /admin/content.inc.php 文件 add 部份。生成各字段的录入表单是这三句 PHP 代码:
require PHPCMS_ROOT .'include/content_form.class.php';
$content_form = new content_form($modelid);
$forminfos = $content_form->get($data);

修改文章时也是用同样的逻辑生成数据编辑表单。

表单提交数据后,会使用 /include/admin/content.class.php 的 add() 方法把数据保存到数据表中,在写入数据表之前,会先调用 /include/content_input.class.php 的 get() 方法对表单提交的数据进行处理,并按主表及扩展表的字段分成两个数据。之后先插入主表,再插入扩展表。
在插入完数据后再调用 /include/content_update.class.php 的 update() 方法。进行插入数据后的后续操作。

content_input.class.php 主要让字段类型对输入的数据进行格式化操作,比如 int 类的表字段在 php 中使用 intval 格式化一下,不允许 html 的文本框使用 html 过滤函数过滤一下,文件上传形的字段类型处理上传的文件等。

content_update.class.php 主要用于执行需要得到 contentid 后才能进行的操作。

这样,便能为模型录入数据了。

至于前台查询(主要是首页,列表页这种页面),主要是从主表中查询,需要用到扩展表字段时则使用 join 连表查询。采用直接写 sql 语句的形式。
前台查询最常见的就是显示某一栏目的文章,所以主表会根据前台主要的查询建立索引。比如给 catid 加索引,在 where 时走索引,给 listorder, updatetime 这些加索引,在 order by 时走索引。

在前台显示一篇文章时,使调用 /include/content_output.class.php 对字段值进行输出前的加工处理。字段类型需要输出前的格式化都可以在这里完成。