thinkphp5实现无限添加配置项

该功能由:添加配置项、配置项列表、配置信息填写三个功能组成,但表用了同一个。

数据表结构

其中type分为如下类别:默认1,1是单行文本框,2是文本域,3是单选按钮,4是复选,5是下拉
thinkphp5实现无限添加配置项
本次sort的排序功能我没写,略过即可。

添加配置项

thinkphp5实现无限添加配置项

这里面的中文名称对应表的cn_name英文名称对应en_name…其它依次类推,各对于一个字段。
最为注意的是:可选值这对应的是values字段,value字段我们要用在配置信息填写里。
有多个可靠值的时候,用,号进行分隔。

配置项列表

thinkphp5实现无限添加配置项
除第一种类型外,上图中其它类型各配置了一种。
目前基本功能已经完成了,但填写这些配置项功能还没有完成。

配置信息填写

模型中将内容输出到模板

$confres = ConfModel::order('sort desc')->select();

        $this->assign('confres',$confres);
        return view('Template/conf');

模板代码

<?php foreach ($confres as $k => $v) :?>   
                            <tr>
                                <td align="center"><?php echo $v['cn_name'] ?></td>
                                <td align="left">
                                    <?php if ($v['type']==1) :?>
                                        <input type="text" value="<?php echo $v['value'] ?>" name="<?php echo $v['en_name'] ?>" style="width:400px; height:26px">





                                    <?php elseif ($v['type']==2) :?>
                                        <textarea name="<?php echo $v['en_name'] ?>"  class="form-control" rows="3"><?php echo $v['value'] ?></textarea>





                                    <?php elseif ($v['type']==3):
                                        if($v['values']){
                                            $arr = explode(',',$v['values']);
                                        }
                                        foreach($arr as $k1 => $v1) :?>

                                        <label style="margin-right:20px;">
                                            <input type="radio" <?php if($v['value']==$v1){echo 'checked="checked"';}  ?> value="<?php echo $v1; ?>" name="<?php echo $v['en_name'] ?>">
                                            <span class="text"><?php echo $v1; ?></span>
                                        </label>

                                        <?php endforeach;?> 





                                    <?php elseif ($v['type']==4) :?>
                                    <label style="margin-right:20px;">
                                        <input type="checkbox" <?php if($v['value']==$v['values']){echo 'checked="checked"';}  ?> value="<?php echo $v['values']; ?>" name="<?php echo $v['en_name'] ?>">
                                        <span class="text"><?php echo $v['values']; ?></span>
                                    </label>





                                    <?php elseif ($v['type']==5):
                                        if($v['values']){
                                            $arrs = explode(',',$v['values']);
                                        }
                                         ?>

                                        <select name="<?php echo $v['en_name'] ?>">
                                            <?php foreach($arrs as $k2 => $v2) :?>
                                            <option value="<?php echo $v2 ?>" <?php if($v['value']==$v2){echo 'selected="selected"';}  ?> ><?php echo $v2 ?></option>
                                            <?php endforeach;?> 
                                        </select>
                                <?php endif;?>
                                </td>
                            </tr>
                            <?php endforeach;?>

TP5的if设计的是真差,还不如原生的,所以这儿用了原生的。

采用foreach判断type进行输出,name值是en_name字段中的值,而不是字段名,指代码中的这段:name="<?php echo $v['en_name'] ?>"

里面的每个if我都进行了大换行分隔,方便查看。

前台输出后的样式

thinkphp5实现无限添加配置项

控制器里的代码

if(Request()->isPost()){
            $data = input('post.');

            #下面三个foreach都是为了自动判断是不是有空字段
            $formarr = array();
            foreach ($data as $k => $v) {
                $formarr[] = $k;
            }

            $_confarr = db('conf')->field('en_name')->select();
            $confarr = array();
            foreach ($_confarr as $k => $v) {
                $confarr[] = $v['en_name'];
            }
            #当为空的时候,加一个null识别
            foreach ($confarr as $k => $v) {
                if(!in_array($v,$formarr)){
                    $data[$v] = 'null';
                }
            }



            #因为不是采用字段的方式,所以存储时要采用foreach,将每一条内容逐条存储
            if($data){
                foreach ($data as $k => $v) {
                    ConfModel::where('en_name',$k)->update(['value'=>$v]);
                }
                $this->success('修改成功');
            }

        }

为什么要用三个foreach判断空字段值,看下面打印出来$data的结构

先打印验证码选择状态的
array(6) {
  ["webstar"] => string(6) "中国"
  ["keywords"] => string(9) "前进吧"
  ["desc"] => string(12) "踏下油门"
  ["started"] => string(6) "开启"
  ["code"] => string(3) "是"
  ["cache"] => string(6) "一天"
}
更麻烦打印验证码未选择状态的
array(5) {
  ["webstar"] => string(6) "中国"
  ["keywords"] => string(9) "前进吧"
  ["desc"] => string(12) "踏下油门"
  ["started"] => string(6) "开启"
  ["cache"] => string(6) "一天"
}

未选择状态里面是没有code的,可我们要改变value的值,便要用这种方式。

至此便全部完事了。

以后的扩展

可以再增加一个类似于文章的字段,那么就可以做到文章中无限加需要的模块,也就是百度知道里面的功能,需要添加某块时,直接点击添加就可以。

虽然那个功能要比这个略麻烦一些。

评论

大侠名号:   验证暗号: 点击我更换图片

修远兮

在这里记录每一点自己需要的知识

添加创始人微信,一起交流心得

推荐文章RECOMMEND