PHPCMS乱解读之 PHPCMS如何生成模型表单
作者:admin 日期:2014-06-23
标 题: PHPCMS乱解读之 PHPCMS如何生成模型表单
作 者: web开发网[http://www.zeroplace.cn]
时 间: 2014/06/23 17:00:00
链 接: http://www.zeroplace.cn/article.asp?id=908
说 明: 转载请保留本段文字
PHPCMS有模型管理,定义好一个模型之后PHPCMS会自动生成一个编辑这个模型的内容的表单。看看PHPCMS是怎么做到这一点的。
首先找到表单页面的地址大致是这样的
/index.php?m=content&c=content&a=add&menuid=&catid=6&pc_hash=dVlnS2&pc_hash=dVlnS2
根据PHPCMSV9 乱解读 之 PHPCMS V9的MVC的介绍, 可以很方便的找到代码所在文件位于modules/content/content.php文件中。再从此文件中找到add方法,就可以看到生成表单和处理表单的代码。
这里我们不看处理表单的代码,直接看如何生成表单。
先看代码的最后一句,可以发现生成这个表单用的模板为content_add.tpl.php, 这个文件位于modules/content/templates/content_add.tpl.php。
打开content_add.tpl.php这个文件,找到<form>标签,可以很明显看到form里面有几个php的循环在输出一些什么东西,而这些东西来自$forminfos这个变量。它一定是content.php中生成的。
再回到content.php中,可以看到$forminfos这个变量是content_form这个类的get方法返回的。如下:
require CACHE_MODEL_PATH."content_form.class.php'; $content_form = new content_form($modelid,$catid,$this->categorys); $forminfos = $content_form->get();
它的上面有一句require, 不难想到这个content_form正是定义在content_form.class.php这个文件中,通过查找CACHE_MODEL_PATH这个宏定义可以发现它的值为/caches/caches_model/caches_data/。这样我们就可以找到content_form.class.php的位置了。
先看它的构造函数:
function __construct($modelid,$catid = 0,$categorys = array()) { $this->modelid = $modelid; $this->catid = $catid; $this->categorys = $categorys; $this->fields = getcache("model_field_'.$modelid,'model'); $this->siteid = get_siteid(); }
主要的起作用的的$this->fields这行,意思就是从缓存中获取这个模型的所有字段
再看到get方法。
foreach($this->fields as $field=>$v) { if(defined("IN_ADMIN')) { if($v['iscore'] || check_in($_SESSION['roleid'], $v['unsetroleids'])) continue; } else { if($v['iscore'] || !$v['isadd'] || check_in($_groupid, $v['unsetgroupids'])) continue; } $func = $v['formtype']; $value = isset($data[$field]) ? new_html_special_chars($data[$field]) : ''; if($func=='pages' && isset($data['maxcharperpage'])) { $value = $data['paginationtype'].'|'.$data['maxcharperpage']; } if(!method_exists($this, $func)) continue; $form = $this->$func($field, $value, $v); if($form !== false) { if(defined('IN_ADMIN')) { if($v['isbase']) { $star = $v['minlength'] || $v['pattern'] ? 1 : 0; $info['base'][$field] = array('name'=>$v['name'], 'tips'=>$v['tips'], 'form'=>$form, 'star'=>$star,'isomnipotent'=>$v['isomnipotent'],'formtype'=>$v['formtype']); } else { $star = $v['minlength'] || $v['pattern'] ? 1 : 0; $info['senior'][$field] = array('name'=>$v['name'], 'tips'=>$v['tips'], 'form'=>$form, 'star'=>$star,'isomnipotent'=>$v['isomnipotent'],'formtype'=>$v['formtype']); } } else { $star = $v['minlength'] || $v['pattern'] ? 1 : 0; $info[$field] = array('name'=>$v['name'], 'tips'=>$v['tips'], 'form'=>$form, 'star'=>$star,'isomnipotent'=>$v['isomnipotent'],'formtype'=>$v['formtype']); } } }
这是就是一个大的循环,对每个字段,根据它的formtype字段调用自身的方法。例如你在添加模型的时候选择字段类型为图片,phpcms就会定义这个字段名为image, 然后这里就会调用它自身的image方法。如果这个方法不存在,就直接跳过。有兴趣的可以看看image这个方法,大致就是生成一段html代码。
这样就可以根据用户定义的模型自动生成html的form表单了。