PHPCMS乱解读之 PHPCMS如何生成模型表单

标 题: 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表单了。



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 11759