一、引入
无论平时我们自己制作,还是浏览别人的网站,它都具有其相应的一些共用的、通用的属性,比如:网站的名字,关键字、备案号、分页数量、是否开启缓存等信息。一些网站可能将配置项写死在后台,无法动态更新,便会出现字段可能太多有些我们不会使用;也许会出现字段太少,不能满足我们的实际需求。今天我们要实现的功能就是要将网站后台配置项,在网站中动态添加并为其设置相应内容,使其具有很强的动态适应性、和灵活性。
二、实现思路:
在TP5中建立
1、Conf控制器类,分别创建add()、lst()、edit()、delete()、conf()等方法。
2、在view下建立conf文件夹存放需要的视图页面,add、lst、edit、conf.html等。
(1)add()方法用来添加配置项,其中中文名称、英文名称、配置类型为必填项。
/***
* 添加
*/
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()方法用来修改配置项,其中中文名称、英文名称、网站类型为必填项。
/***
* 编辑
*/
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()显示后台动态添加的配置项。
/***
* 列表
*/
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()方法
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();
}