请选择 进入手机版 | 继续访问电脑版
搜索
查看: 945|回复: 0

phpcmsv9自定义模型字段超限100不显示[phpcms如何生成模型表单]

[复制链接]

72

主题

73

帖子

355

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
355
发表于 2016-8-4 11:59:27 | 显示全部楼层 |阅读模式


phpcms模型中,如果添加的自定义字段太多,超过100个自定义字段,就不会在在添加内容的地方显示出来,解决办法如下:

分别修改:

phpcms\modules\content\sitemodel_field.php
phpcms\modules\content\sitemodel.php

两个文件中有 100的地方,如下:
  1. $datas = $this->db->select(array('modelid'=>$modelid),'*',100,'listorder ASC');
复制代码

以下为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. view plainprint?
  2. require CACHE_MODEL_PATH."content_form.class.php';  
  3. $content_form = new content_form($modelid,$catid,$this->categorys);  
  4. $forminfos = $content_form->get();  
复制代码

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

先看它的构造函数:

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

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

再看到get方法:

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

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

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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热议作品
精华帖子排行
精彩推荐
发布主题 快速回复 返回列表 官方QQ群

努力、专心、专注!

为我们吹过的牛逼奋斗终身!

Copyright © 2015 林羽凡 Inc. 京ICP备11043715号-5

返回顶部 返回列表