dede,phpcms等内容模型的概念挺不错的,能够自定义表的字段,能够知足各类网站要显示内容的需求。php
好比我有一个文章表,基本字段都有,可是我还须要一个qq,若是去更改表,还得更改后台添加文章时候的表单,很是麻烦,因此就想了想,结合TP的框架,作了一个内容模型的例子,如今分享出来给你们。html
这个例子也能够结合下载功能,或者视频站等功能,把本身作的cms打形成一个全面的cms。ajax
流程以下:sql
1.必须有一个模型表,去保存已经定义的模型,例子的sql语句以下数据库
DROP TABLE IF EXISTS `think_category`; CREATE TABLE `think_category` ( `id` int(3) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `addtable` varchar(20) DEFAULT NULL, `type` tinyint(1) DEFAULT '2', `fields` text, `status` tinyint(1) DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
这个表,name是表明内容模型的名称,addtable是附加表,指明模型所须要依赖的表,type是模型的类型,1是系统模型,防止后台管理员不当心删除,2.是自由模型,可直接删除。fields是保存关于模型的字段等详细信息。json
如今先写好前台样式。数组
在填写模型之后则能够保存到模型表category框架
至于插入数据库的php代码我就不写了。太简单了ide
2.在新建好内容模型之后,要作的就是编辑模型的字段,而且生成相应的表。函数
添加了两个模型软件和图片集,而后下一步的操做是字段管理(包括新建字段,编辑字段,删除字段,以及生成模型)
这是字段管理界面,先新建一个字段,假如我想新建一个qq的字段。 添加字段
表单提示字段是在后台添加文章里面所显示的字段,其中都有相应的说明,重要的几个就是数据类型是在后台添加文章里显示不一样的表单元素
在修改了相应的数据类型之后,后台里添加文章等也会随之改变。假如我添加的字段是性别,那么 用到的就是radio单选的表单。
点击保存之后代码
function saveField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); if (!empty($fields)){ $fields=unserialize($fields); } $fields[]=$_POST; $strField=serialize($fields); $data['fields']=$strField; if ($model->where($map)->save($data)){ $ajax['data']='保存字段成功'; $ajax['url']=__URL__.'/setField/id/'.$_REQUEST['id']; }else{ $ajax['data']='保存字段失败,请联系管理员'; } die(json_encode($ajax)); }
这段代码意思很简单,就是把上面添加字段的表单保存到相应模型的fields字段里,方便之后调用处理,$fields=getField('Category', $map, 'fields'); 这个是获取到此模型里的fields字段里的数据,由于字段不止一个,因此每次添加,都会更新fields里的数据,serialize这个函数真的很是好用,能够把数组或者对象转变成字符串保存在数据库中。
字段列表页面的代码
function setField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fieldList=unserialize($fields); $this->assign('fieldsList',$fieldList); $this->display(); }
获取到指定模型的fields字段的信息,而后unserialize把字符串再转换为数组,显示在页面中
编辑字段代码:
function editField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fields=unserialize($fields); $field=$_REQUEST['field']; foreach ($fields as $k=>$v){ if ($v['field_name']==$field){ $fields=$v; } } $this->assign('fields',$fields); $this->display(); }
更新字段的代码:
function updateField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fields=unserialize($fields); $field=$_REQUEST['old_field']; foreach ($fields as $k=>$v){ if ($v['field_name']==$field){ $fields[$k]=$_POST; } } $data['fields']=serialize($fields); if ($model->where($map)->save($data)){ $ajax['data']='编辑字段成功'; $ajax['url']=__URL__.'/setField/id/'.$_REQUEST['id']; }else{ $ajax['data']='编辑失败,请联系管理员'; } die(json_encode($ajax)); }
删除字段的代码:
function deleteField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fields=unserialize($fields); foreach ($fields as $k=>$v){ if ($v['field_name']==$_REQUEST['field']){ unset($fields[$k]); } } $data['fields']=serialize($fields); if ($model->where($map)->save($data)){ $ajax['data']='删除字段成功'; $ajax['url']=__URL__.'/setField/id/'.$_REQUEST['id']; }else{ $ajax['data']='删除字段失败,请联系管理员'; } die(json_encode($ajax)); }
完成以上之后,要作的就是生成最后所要使用的表。
function createCategory(){ //获取模型表名以及字段 $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fields=unserialize($fields); $tableName=getField('Category', $map, 'addtable'); $tableName=C('DB_PREFIX').$tableName; //若是表存在则删除 if(M()->query("show create table ".$tableName)){ M()->query("drop table ".$tableName); } $createSql="CREATE TABLE `".$tableName."` ( `id` int(7) unsigned zerofill NOT NULL AUTO_INCREMENT, `title` varchar(100) DEFAULT NULL, `content` text, `write` varchar(20) DEFAULT NULL, `sort` int(7) DEFAULT NULL, `view` int(7) DEFAULT NULL, `pics` varchar(200) DEFAULT NULL, `create_time` int(20) DEFAULT NULL, `flag` varchar(50) DEFAULT NULL, `info` text, `keywords` varchar(300) DEFAULT NULL, `nav_id` int(7) DEFAULT NULL, `source` varchar(50) DEFAULT NULL,"; $sql=$this->createSql($fields); $createSql.=$sql; $createSql.="PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8"; if (M()->query($createSql)===false){ $ajax['data']='建立数据表失败,请联系管理员'; die(json_encode($ajax)); } $ajax['data']='生成模型成功'; $ajax['url']=__URL__.'/setField/id/'.$_REQUEST['id']; die(json_encode($ajax)); } /* * 建立数据库表的sql语句 */ function createSql($fields){ foreach ($fields as $v){ if (!strpos($v['default'], ',')&&$v['default']!=''){ $sql.="`".$v['field_name']."` ".$v['type']."(".$v['length'].") default ".$v['default'].','; }else{ $sql.="`".$v['field_name']."` ".$v['type']."(".$v['length']."),"; } } return $sql; }
逻辑方式就是先获取到指定模型里fiels里的数据,而后拼接成sql语句,再结合包含基础字段的sql语句,就能够生成一个本身须要的文章表。
接下来的操做也很是简单,仍是根据模型表里的fields字段里获取到的信息,生成对应的表单html代码,而后显示出来便可。
有时候,逻辑真的比技术更加剧要。技术只是基础,逻辑思惟才是技术提高的技巧。