《shop》 --- 角色数据维护
控制器:RoleController 操作方法:showlist
商品列表界面,在left.html中
<table id=child{$v.auth_id} style="display:none" cellspacing=0 cellpadding=0 width=150 border=0>
{foreach $auth_infoB as $kk => $vv}
{*子级权限的pid与外部权限的id必须相等*}
{if $vv.auth_pid == $v.auth_id}
<tr height=20>
<td align=middle width=30>
<img height=9 src="{$smarty.const.ADMIN_IMG_URL}menu_icon.gif" width=9>
</td>
<td><a class="menuchild" href="{$smarty.const.__MODULE__}/{$vv.auth_c}/{$vv.auth_a}" target="right">{$vv.auth_name}</a></td>
</tr>
{/if}
{/foreach}
<tr height=4><td colspan=2></td></tr>
</table>
{/foreach}
</td>
<td width=1 bgcolor=#d1e6f7></td>
</tr>
</table>
1,展示角色列表,
控制器:RoleController
操作方法:showlist
class RoleController extends AdminController{
//角色列表展示
function showlist(){
//获得角色数据、展示数据
$info = D('Role')->select();
$this -> assign('info',$info);
$this -> display();
}
在view的role模块下showlist.html中
{foreach $info as $k => $v}
<tr id="product1">
<td>{*$v@iteration*}{$v.role_id}</td>
<td>{$v.role_name}</td>
<td>{$v.role_auth_ids}</td>
<td>{$v.role_auth_ac}</td>
<td><a href="{$smarty.const.__CONTROLLER__}/distribute/role_id/{$v.role_id}">分配权限</a></td> //传递role_id信息给distribute方法,告知当前为哪个角色分配权限
<td><a href="">修改</a></td>
<td><a href="" onclick="">删除</a></td>
</tr>
{/foreach}
2,给角色分配权限
控制器:RoleController
操作方法:distribute
//分配权限
function distribute($role_id){
查询被分配到权限的角色信息
$role_info = D('Role') -> find($role_id);
//获得全部用于分配的权限并展示给模板
//顶级权限、次顶级权限
$auth_infoA = D('Auth')->where('auth_level=0')->select();
$auth_infoB = D('Auth')->where('auth_level=1')->select();
$this -> assign('have_auth',$have_auth);
$this -> assign('auth_infoA',$auth_infoA);
$this -> assign('auth_infoB',$auth_infoB);
$this -> assign('role_info',$role_info);
$this -> display();
}
}
}
在distribute.html中
<table border="1" width="100%" class="table_a">
{foreach $auth_infoA as $k => $v}
<tr>
<td width='18%'>
{*判断是否已经拥有该权限*}
<input type='checkbox' name='auth_id[]' value='{$v.auth_id}'
{if in_array($v.auth_id,$have_auth)}checked='checked'{/if}
/>
{$v.auth_name}</td>
<td>
{foreach $auth_infoB as $kk => $vv}
{if $vv.auth_pid==$v.auth_id}
<div style='width:200px;float:left;'>
<input type='checkbox' name='auth_id[]' value='{$vv.auth_id}'
{if in_array($vv.auth_id,$have_auth)}checked='checked'{/if}
/>
{$vv.auth_name}</div>
{/if}
{/foreach}
</td>
</tr>
{/foreach}
</table>
2.2收集表单
接收到的form表单信息不能直接写入到数据库,需要二期制作
在RoleController控制器中
//分配权限
function distribute($role_id){
$role = new \Model\RoleModel();
//两个逻辑:展示、收集
if(!empty($_POST)){
//$_POST数据需要二期制作才可以写入数据库
//在自定义RoleModel里边制作一个方法saveAuth,实现数据制作和存储
$z = $role->saveAuth($role_id,$_POST['auth_id']);
if($z){
$this -> redirect('showlist',array(),2,'分配权限成功');
}else{
$this -> redirect('distribute',array('role_id'=>$role_id),2,'分配权限失败');
}
}else{
//查询被分配权限的角色信息
$role_info = $role->find($role_id);
//角色已经拥有的权限信息
$have_auth = explode(',',$role_info['role_auth_ids']);//变为数组
//获得全部用于分配的权限并展示给模板
//顶级权限、次顶级权限
$auth_infoA = D('Auth')->where('auth_level=0')->select();
$auth_infoB = D('Auth')->where('auth_level=1')->select();
$this -> assign('have_auth',$have_auth);
$this -> assign('auth_infoA',$auth_infoA);
$this -> assign('auth_infoB',$auth_infoB);
$this -> assign('role_info',$role_info);
$this -> display();
}
}
RoleModel模型实现制作和修改逻辑:
//Role模型model类
class RoleModel extends Model{
//分配权限,收集信息、二期制作、存储信息
function saveAuth($role_id,$authids){
//① 数组的authid 变为 字符串的authid
$authid_str = implode(',',$authids); //implode 把字符串转为数组
//② 根据字符串的authid信息 查询对应的"控制器-操作方法""
$authinfo = D('Auth')->select($authid_str);
$s = "";
foreach($authinfo as $k => $v){
if(!empty($v['auth_c']) && !empty($v['auth_a'])){
$s .= $v['auth_c']."-".$v['auth_a'].",";
}
}
$s = rtrim($s,',');
$sql = "update sw_role set role_auth_ids='$authid_str',role_auth_ac='$s' where role_id='$role_id'";
return $this -> execute($sql);
}
}
rtrim :从字符串右侧移除字符:
<?php $str = "Hello World!"; echo $str . "<br>"; echo rtrim($str,"World!"); ?>
运行结果:
Hello World!
Hello
2.3 把已经拥有的权限给显示出来
每次给角色分配权限的时候,把已经拥有的权限给显示出来。
实现其功能就是一个“判断”过程:
① 在模板表单页面显示全部的权限
② 把“被分配权限角色”已经拥有的权限信息也查询获得出来,并传递给模板表单
判断:遍历全部权限,判断每个权限的id信息是否是“已经拥有权限”的数组元素即可。
在 RoleController 控制器中获得当前角色已经拥有的权限:
//角色已经拥有的权限信息
$have_auth = explode(',',$role_info['role_auth_ids']);//变为数组
模板 distribute.html 中做判断:
<table border="1" width="100%" class="table_a">
{foreach $auth_infoA as $k => $v}
<tr>
<td width='18%'>
{*判断是否已经拥有该权限*}
<input type='checkbox' name='auth_id[]' value='{$v.auth_id}'
{if in_array($v.auth_id,$have_auth)}checked='checked'{/if}
/>
{$v.auth_name}</td>
<td>
{foreach $auth_infoB as $kk => $vv}
{if $vv.auth_pid==$v.auth_id}
<div style='width:200px;float:left;'>
<input type='checkbox' name='auth_id[]' value='{$vv.auth_id}'
{if in_array($vv.auth_id,$have_auth)}checked='checked'{/if}
/>
{$vv.auth_name}</div>
{/if}
{/foreach}
</td>
</tr>
{/foreach}
</table>