php内容模型概念,方便新建各种类型表
dede,phpcms等内容模型的概念挺不错的,可以自定义表的字段,可以满足各种网站要显示内容的需求。
比如我有一个文章表,基本字段都有,但是我还需要一个qq,如果去更改表,还得更改后台添加文章时候的表单,非常麻烦,所以就想了想,结合TP的框架,做了一个内容模型的例子,现在分享出来给大家。
这个例子也可以结合下载功能,或者视频站等功能,把自己做的cms打造成一个全面的cms。
流程如下:
1.必须有一个模型表,去保存已经定义的模型,例子的sql语句如下
DROPTABLEIFEXISTS`think_category`;CREATETABLE`think_category`(`id`int(3)NOTNULLAUTO_INCREMENT,`name`varchar(20)DEFAULTNULL,`addtable`varchar(20)DEFAULTNULL,`type`tinyint(1)DEFAULT'2',`fields`text,`status`tinyint(1)DEFAULT'1',PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=3DEFAULTCHARSET=utf8;
这个表,name是代表内容模型的名称,addtable是附加表,指明模型所需要依赖的表,type是模型的类型,1是系统模型,防止后台管理员不小心删除,2.是自由模型,可直接删除。fields是保存关于模型的字段等详细信息。
现在先写好前台样式。
在填写模型以后则可以保存到模型表category
至于插入数据库的php代码我就不写了。太简单了
2.在新建好内容模型以后,要做的就是编辑模型的字段,并且生成相应的表。
添加了两个模型软件和图片集,然后下一步的操作是字段管理(包括新建字段,编辑字段,删除字段,以及生成模型)
这是字段管理界面,先新建一个字段,假如我想新建一个qq的字段。 添加字段
表单提示字段是在后台添加文章里面所显示的字段,其中都有相应的说明,重要的几个就是数据类型是在后台添加文章里显示不同的表单元素
在修改了相应的数据类型以后,后台里添加文章等也会随之改变。假如我添加的字段是性别,那么 用到的就是radio单选的表单。
点击保存以后代码
functionsaveField(){$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这个函数真的非常好用,可以把数组或者对象转变成字符串保存在数据库中。
字段列表页面的代码
functionsetField(){$model=M('Category');$map['id']=$_REQUEST['id'];$fields=getField('Category',$map,'fields');$fieldList=unserialize($fields);$this->assign('fieldsList',$fieldList);$this->display();}
获取到指定模型的fields字段的信息,然后unserialize把字符串再转换为数组,显示在页面中
编辑字段代码:
functioneditField(){$model=M('Category');$map['id']=$_REQUEST['id'];$fields=getField('Category',$map,'fields');$fields=unserialize($fields);$field=$_REQUEST['field'];foreach($fieldsas$k=>$v){if($v['field_name']==$field){$fields=$v;}}$this->assign('fields',$fields);$this->display();}
更新字段的代码:
functionupdateField(){$model=M('Category');$map['id']=$_REQUEST['id'];$fields=getField('Category',$map,'fields');$fields=unserialize($fields);$field=$_REQUEST['old_field'];foreach($fieldsas$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));}
删除字段的代码:
functiondeleteField(){$model=M('Category');$map['id']=$_REQUEST['id'];$fields=getField('Category',$map,'fields');$fields=unserialize($fields);foreach($fieldsas$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));}
完成以上以后,要做的就是生成最后所要使用的表。
functioncreateCategory(){//获取模型表名以及字段$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("showcreatetable".$tableName)){M()->query("droptable".$tableName);}$createSql="CREATETABLE`".$tableName."`(`id`int(7)unsignedzerofillNOTNULLAUTO_INCREMENT,`title`varchar(100)DEFAULTNULL,`content`text,`write`varchar(20)DEFAULTNULL,`sort`int(7)DEFAULTNULL,`view`int(7)DEFAULTNULL,`pics`varchar(200)DEFAULTNULL,`create_time`int(20)DEFAULTNULL,`flag`varchar(50)DEFAULTNULL,`info`text,`keywords`varchar(300)DEFAULTNULL,`nav_id`int(7)DEFAULTNULL,`source`varchar(50)DEFAULTNULL,";$sql=$this->createSql($fields);$createSql.=$sql;$createSql.="PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=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语句*/functioncreateSql($fields){foreach($fieldsas$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代码,然后显示出来即可。
有时候,逻辑真的比技术更加重要。技术只是基础,逻辑思维才是技术提升的技巧。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。