设为首页 收藏本站
查看: 877|回复: 0

[经验分享] php内容模型概念,方便新建各种类型表

[复制链接]

尚未签到

发表于 2018-12-20 09:37:56 | 显示全部楼层 |阅读模式
  dede,phpcms等内容模型的概念挺不错的,可以自定义表的字段,可以满足各种网站要显示内容的需求。
  比如我有一个文章表,基本字段都有,但是我还需要一个qq,如果去更改表,还得更改后台添加文章时候的表单,非常麻烦,所以就想了想,结合TP的框架,做了一个内容模型的例子,现在分享出来给大家。
  这个例子也可以结合下载功能,或者视频站等功能,把自己做的cms打造成一个全面的cms。
  流程如下:
  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是保存关于模型的字段等详细信息。
  现在先写好前台样式。

  在填写模型以后则可以保存到模型表category
  至于插入数据库的php代码我就不写了。太简单了
  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代码,然后显示出来即可。
  有时候,逻辑真的比技术更加重要。技术只是基础,逻辑思维才是技术提升的技巧。





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-653451-1-1.html 上篇帖子: httpd六之源码编译lamp并能够实现xcache为php加速 下篇帖子: php几个不起眼儿的小技巧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表