phpcms 生成自己定义模型表单的过程

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方法返回的。如下:

  1. require CACHE_MODEL_PATH."content_form.class.php';  
  2. $content_form = new content_form($modelid,$catid,$this->categorys);  
  3. $forminfos = $content_form->get();  

它的上面有一句require, 不难想到这个content_form正是定义在content_form.class.php这个文件中,通过查找CACHE_MODEL_PATH这个宏定义可以发现它的值为/caches/caches_model/caches_data/。这样我们就可以找到content_form.class.php的位置了。

先看它的构造函数:

  1. function __construct($modelid,$catid = 0,$categorys = array()) {  
  2.     $this->modelid = $modelid;  
  3.     $this->catid = $catid;  
  4.     $this->categorys = $categorys;  
  5.     $this->fields = getcache("model_field_'.$modelid,'model');  
  6.     $this->siteid = get_siteid();  
  7. }  

主要的起作用的的$this->fields这行,意思就是从缓存中获取这个模型的所有字段

再看到get方法。

  1. foreach($this->fields as $field=>$v) {  
  2.     if(defined("IN_ADMIN')) {  
  3.         if($v['iscore'] || check_in($_SESSION['roleid'], $v['unsetroleids'])) continue;  
  4.     } else {  
  5.         if($v['iscore'] || !$v['isadd'] || check_in($_groupid$v['unsetgroupids'])) continue;  
  6.     }  
  7.     $func = $v['formtype'];  
  8.     $value = isset($data[$field]) ? new_html_special_chars($data[$field]) : '';  
  9.     if($func=='pages' && isset($data['maxcharperpage'])) {  
  10.         $value = $data['paginationtype'].'|'.$data['maxcharperpage'];  
  11.     }  
  12.     if(!method_exists($this$func)) continue;  
  13.     $form = $this->$func($field$value$v);  
  14.     if($form !== false) {  
  15.         if(defined('IN_ADMIN')) {  
  16.             if($v['isbase']) {  
  17.                 $star = $v['minlength'] || $v['pattern'] ? 1 : 0;  
  18.                 $info['base'][$field] = array('name'=>$v['name'], 'tips'=>$v['tips'], 'form'=>$form'star'=>$star,'isomnipotent'=>$v['isomnipotent'],'formtype'=>$v['formtype']);  
  19.             } else {  
  20.                 $star = $v['minlength'] || $v['pattern'] ? 1 : 0;  
  21.                 $info['senior'][$field] = array('name'=>$v['name'], 'tips'=>$v['tips'], 'form'=>$form'star'=>$star,'isomnipotent'=>$v['isomnipotent'],'formtype'=>$v['formtype']);  
  22.             }  
  23.         } else {  
  24.             $star = $v['minlength'] || $v['pattern'] ? 1 : 0;  
  25.             $info[$field] = array('name'=>$v['name'], 'tips'=>$v['tips'], 'form'=>$form'star'=>$star,'isomnipotent'=>$v['isomnipotent'],'formtype'=>$v['formtype']);  
  26.         }  
  27.     }  
  28. }  

这是就是一个大的循环,对每个字段,根据它的formtype字段调用自身的方法。例如你在添加模型的时候选择字段类型为图片,phpcms就会定义这个字段名为image, 然后这里就会调用它自身的image方法。如果这个方法不存在,就直接跳过。有兴趣的可以看看image这个方法,大致就是生成一段html代码。

这样就可以根据用户定义的模型自动生成html的form表单了。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值