一、引入

     无论平时我们自己制作,还是浏览别人的网站,它都具有其相应的一些共用的、通用的属性,比如:网站的名字,关键字、备案号、分页数量、是否开启缓存等信息。一些网站可能将配置项写死在后台,无法动态更新,便会出现字段可能太多有些我们不会使用;也许会出现字段太少,不能满足我们的实际需求。今天我们要实现的功能就是要将网站后台配置项,在网站中动态添加并为其设置相应内容,使其具有很强的动态适应性、和灵活性。

二、实现思路:

在TP5中建立

1、Conf控制器类,分别创建add()、lst()、edit()、delete()、conf()等方法。

2、在view下建立conf文件夹存放需要的视图页面,add、lst、edit、conf.html等。

(1)add()方法用来添加配置项,其中中文名称、英文名称、配置类型为必填项。

Thinkphp5通用网站后台配置项的动态添加及更新-LMLPHP

  /***
     * 添加
     */
    public function add(){
        //判断是否post提交
        if(request()->isPost()){
            //接受数据
            $data=input('post.');
           // var_dump($data);die;
            //验证数据
            $validate=Loader::validate('conf');
            if(!$validate->scene('add')->check($data)){
                $this->error($validate->getError());
            }
            //判断有无提交值
            if($data['values']){
                $data['values']=str_replace(',',',',$data['values']);
            }
            //向数据库插入数据
            $result=db('conf')->insert($data);
            if($result){
                $this->success('配置项添加成功!','lst');
            }else{
                $this->error('配置项添加失败!');
            }
        }
        return $this->fetch();
    }

2.edit()方法用来修改配置项,其中中文名称、英文名称、网站类型为必填项。

Thinkphp5通用网站后台配置项的动态添加及更新-LMLPHP

/***
     * 编辑
     */
    public function edit($id){
        $conf=db('conf')->find($id);
        if(!$conf){
            $this->error('该配置项不存在!');
        }
        if(request()->isPost()){
            $data=input('post.');
            //验证提交数据
            $validate=Loader::validate('conf');
            if(!$validate->scene('edit')->check($data)){
                $this->error($validate->getError());
            }

            //替换中文字符逗号
            if(isset($data['type'])){
                $data['type']=str_replace(',',',',$data['type']);
            }
            //更新
            $result=db('conf')->update($data);
            if($result !==false){
                $this->success('配置项信息更新成功!','lst');
            }else{
                $this->error('配置项信息更新失败!');
            }
        }

        $this->assign('conf',$conf);
        return $this->fetch();
    }

3.lst()显示后台动态添加的配置项。

Thinkphp5通用网站后台配置项的动态添加及更新-LMLPHP

/***
     * 列表
     */
    public function lst(){
        $conf=new ConfModel();
        if(request()->isPost()){
            $data=input('post.');
            //按照排序字段更新记录
            foreach($data as $k=>$v){
                $conf->update(['id'=>$k,'sort'=>$v]);
            }
            $this->success("配置项排序更新成功!");
        }
        $list=$conf->order('sort desc')->paginate(10);
        $this->assign('list',$list);
        return $this->fetch();
    }

注意:前三个方法,只是针对配置项动态的添加、修改、显示用的。而下面的conf()方法,完成对配置项值的动态显示及修改。

4.conf()方法

Thinkphp5通用网站后台配置项的动态添加及更新-LMLPHP

conf.html源码:



<body>
    <!-- 头部 -->
    {include file="common/header"}
    <!-- /头部 -->

    <div class="main-container container-fluid">
        <div class="page-container">
            <!-- Page Sidebar -->
            {include file="common/sidebar"}
            <!-- /Page Sidebar -->
            <!-- Page Content -->
            <div class="page-content">
                <!-- Page Breadcrumb -->
                <div class="page-breadcrumbs">
                    <ul class="breadcrumb">
                        <li>
                            <a href="#">系统</a>
                        </li>
                        <li class="active">配置项管理</li>
                    </ul>
                </div>
                <!-- /Page Breadcrumb -->

                <!-- Page Body -->
                <div class="page-body">

                    <button type="button" tooltip="网站配置项" class="btn btn-sm btn-azure btn-addon"
                         <i class="fa fa-plus"></i>
                         网站配置项
                    </button>
                    <div class="row">
                        <div class="col-lg-12 col-sm-12 col-xs-12">
                            <div class="widget">
                                <div class="widget-body">
                                    <div class="flip-scroll">
                                        <form action="" method="post">
                                            <table class="table table-bordered table-hover">
                                                <thead class="">
                                                    <tr>
                                                        <th class="text-right" width=2%>配置名称</th>
                                                        <th class="text-left" width=10%>配置值</th>
                                                    </tr>
                                                </thead>
                                                <tbody>

                                                        <?php  foreach($confres  as $v):?>
                                                        </tr>
                                                            <td class="text-right"><?php echo $v['cnname'];?></td>
                                                            <td class="text-left">
                                                                <?php if($v['type']==1): ?>
                                                                    <input type="text" name="<?php echo $v['enname'];?>" value="<?php echo $v['value'];?>"/>
                                                                <?php elseif($v['type']==2): ?>
                                                                     <textarea class="form-control" name="<?php echo $v['enname']; ?>" id="" ><?php echo $v['value'];?></textarea>
                                                                <?php elseif($v['type']==3):
                                                                      if($v['values']){
                                                                        $str=explode(',',$v['values']);
                                                                      }
                                                                      foreach($str as $v1):
                                                                ?>
                                                                    <label style="margin-right:15px;">
                                                                        <input type="radio" name="<?php echo $v['enname']; ?>" <?php if($v1==$v['value']){echo "checked='checked'";} ?>  value="<?php echo $v1;?>">
                                                                        <span class="text"><?php echo $v1?></span>
                                                                    </label>
                                                                     <?php endforeach;?>
                                                                <?php elseif($v['type']==4):?>
                                                                <label>
                                                                    <input type="checkbox"  name="<?php echo $v['enname']; ?>" <?php if($v['value']==$v['values']){echo "checked='checked'";} ?> value="<?php echo $v['values'];?>">
                                                                    <span class="text"><?php echo $v['values'];?></span>
                                                                </label>
                                                                <?php elseif($v['type']==5):
                                                                    if($v['values']){
                                                                        $str=explode(',',$v['values']);
                                                                    }
                                                                ?>
                                                                <select name="<?php echo $v['enname']; ?>" id="">
                                                                    <?php foreach($str as $arr): ?>
                                                                        <option value="<?php echo $arr ?>" <?php if($v['value']==$arr){ echo "selected=selected" ;} ?> ><?php echo $arr ?> </option>
                                                                    <?php endforeach;?>
                                                                </select>


                                                                <?php endif;?>


                                                            </td>
                                                        </tr>
                                                        <?php endforeach; ?>
                                                </tbody>
                                            </table>
                                            <div>

                                                <input class="btn btn-primary btn-sm shiny" type="submit" value="提交修改"
                                                style="margin:0 auto;display: block;" />
                                            </div>

                                        </form>
                                    </div>
                                    <div>

                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>

                </div>
                <!-- /Page Body -->
            </div>
            <!-- /Page Content -->
        </div>
    </div>





</body>

</html>

conf()方法中源码:

  public function conf(){
        if(request()->isPost()){
            $data=input('post.');
            //取出前台提交过来的所有enname字段
            $formarr=array();
            foreach($data as $k=>$v){
                $formarr[]=$k;
            }
            //取出数据库中所有enname字段
            $_confarr=db('conf')->field('enname')->select();
            //将其转换成一维数组
            $confarr=array();
            foreach($_confarr as $k=>$v){
                $confarr[]=$v['enname'];
            }
            //用来存储数据库与前台提交字段对比后保存的enname字段
            $checkboxarr=array();
            foreach($confarr as $k=>$v){
                if(!in_array($v,$formarr)){//对比数据库和前台提交字段
                    $checkboxarr[]=$v;
                }
            }
            //将上面对比出来的字段,直接添加到$data中并为其赋值,以备后面更新
            foreach($checkboxarr as $k=>$v){
                $data[$v]='否';
            }
            if($data){
                foreach($data as $k=>$v){
                    db('conf')->where('enname',$k)->update(['value'=>$v]);
                }
            }
            $this->success('修改配置成功!','conf');
        }
        $confres=ConfModel::order('sort desc')->select();
        $this->assign('confres',$confres);
        return $this->fetch();
    }
03-08 09:13