453 lines
16 KiB
PHP
453 lines
16 KiB
PHP
<?php
|
|
class Menu extends kcate {
|
|
public $AUTH;
|
|
public $authDest = array();
|
|
|
|
function __construct( $cate_table="" ){
|
|
parent::__construct($cate_table);
|
|
$this->DB->tableExists(TB_menu_auth_page);
|
|
|
|
$this->set_cate_area();
|
|
$this->AUTH = new Auth();
|
|
}
|
|
|
|
public function getMenuList($usage="Y"){
|
|
$where = new DB_where("and");
|
|
$where->add("cate.cate_area = ?", $this->cate_area);
|
|
if( $usage ){
|
|
$where->add("cate_use = ?", "Y");
|
|
}
|
|
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
|
|
$sql = "select * from {$this->cate_table} where cate_area = '{$this->cate_area}' and cate_use != 'Y'";
|
|
$notuse_row = $this->DB->query($sql);
|
|
$use_fld = array();
|
|
foreach( (array)$notuse_row as $nrow ){
|
|
$use_fld[] = " cate.cate_code like '{$nrow['cate_code']}%' ";
|
|
}
|
|
if( count($use_fld) ){
|
|
$add_fld = implode(" or ", $use_fld);
|
|
}else{
|
|
$add_fld = " 1!=1 ";
|
|
}
|
|
|
|
$sql = "select
|
|
cate.cate_area,
|
|
cate.cate_id,
|
|
cate.cate_code,
|
|
cate.cate_name,
|
|
case when ({$add_fld}) then 'N' else 'Y' end as cate_use
|
|
from {$this->cate_table} as cate
|
|
left join (select * from {$this->cate_table} where cate_area = '{$this->cate_area}') pa_cate
|
|
on substring(cate.cate_code, 1, len(cate.cate_code)-{$this->dmax}) = pa_cate.cate_code
|
|
where {$whereqry} order by cate.cate_code asc";
|
|
|
|
$rst = $this->DB->qry($sql, $whererow);
|
|
if( $rst ){
|
|
$rows = array();
|
|
while( $row = $this->DB->fetch_array($rst) ){
|
|
$row['level'] = $this->level_cate($row['cate_code']);
|
|
$rows[] = Array(
|
|
"id" => $row['cate_id'],
|
|
"text" => $row['cate_name'],
|
|
"parent" => $row['parent'],
|
|
"icon" => "",
|
|
"data" => $row,
|
|
);
|
|
}
|
|
return $rows;
|
|
}else{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
public function getMenuAuthList($usage="Y"){
|
|
$where = new DB_where("and");
|
|
$where->add("cate.cate_area = ?", $this->cate_area);
|
|
if( $usage ){
|
|
$where->add("cate_use = ?", "Y");
|
|
}
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
|
|
/*
|
|
$sql = "select
|
|
cate.cate_id as id,
|
|
cate.cate_code as data,
|
|
ifnull(pa_cate.cate_id, '#') as parent,
|
|
cate.cate_name as text,
|
|
case cate.cate_auth when 'Y' then '' else '' end as icon
|
|
from {$this->cate_table} as cate
|
|
left join pa_cate
|
|
on substring(cate.cate_code, 1, LENGTH(cate_code)-{$this->dmax}) = pa_cate.cate_code where {$whereqry} order by cate.cate_code asc";*/
|
|
|
|
/* 쿼리 2번 실행 */
|
|
$sql = "select cate_area, cate_id, auth_area, auth_target, auth from ".TB_auth_manage." where cate_area = '{$this->cate_area}'";
|
|
$rows = $this->DB->query($sql);
|
|
|
|
$auths = array();
|
|
foreach( (array)$rows as $auth ){
|
|
if( !isset($auths[$auth['cate_id']]) ) $auths[$auth['cate_id']] = array();
|
|
if( !isset($auths[$auth['cate_id']][$auth['auth_area']]) ) $auths[$auth['cate_id']][$auth['auth_area']] = array();
|
|
|
|
$auths[$auth['cate_id']][$auth['auth_area']][$auth['auth_target']] = $auth['auth'];
|
|
}
|
|
|
|
$sql = "select
|
|
cate.cate_area,
|
|
cate.cate_id,
|
|
cate.cate_code,
|
|
cate.cate_name,
|
|
cate.cate_data,
|
|
cate.cate_exp,
|
|
cate.cate_class,
|
|
cate.cate_auth,
|
|
cate.cate_use,
|
|
isnull(pa_cate.cate_id, '#') as parent,
|
|
pages.cate_filepath
|
|
from {$this->cate_table} as cate
|
|
left join (select cate_area, cate_id, stuff(( select char(13)+ tagg.filepath from ".TB_menu_auth_page." as tagg where tagg.cate_area = tmap.cate_area for xml path(''), type).value('.','varchar(max)'),1,1,'') as cate_filepath from ".TB_menu_auth_page." as tmap group by cate_area, cate_id) as pages
|
|
on cate.cate_area = pages.cate_area and cate.cate_id = pages.cate_id
|
|
left join (select cate_id, cate_code from {$this->cate_table} where cate_area = '{$this->cate_area}') pa_cate
|
|
on substring(cate.cate_code, 1, len(cate.cate_code)-{$this->dmax}) = pa_cate.cate_code
|
|
where {$whereqry} order by cate.cate_code asc";
|
|
|
|
//string_agg 대체
|
|
//stuff(( select char(13)+ tagg.filepath from ".TB_menu_auth_page." as tagg where tagg.cate_area = tmap.cate_area for xml path(''), type).value('.','varchar(max)'),1,1,'') as cate_filepath
|
|
//cate_filepath=stuff(( select char(13)+ tagg.filepath from ".TB_menu_auth_page." as tagg where tagg.cate_area = tmap.cate_area for xml path(''), type).value('.','varchar(max)'),1,1,'')
|
|
//
|
|
//string_agg(filepath,CHAR(13)) as cate_filepath
|
|
|
|
/* 서브쿼리 이용
|
|
$sql = "select
|
|
cate.cate_area,
|
|
cate.cate_id,
|
|
cate.cate_code,
|
|
cate.cate_name,
|
|
cate.cate_data,
|
|
cate.cate_exp,
|
|
cate.cate_class,
|
|
cate.cate_auth,
|
|
isnull(pa_cate.cate_id, '#') as parent
|
|
from {$this->cate_table} as cate
|
|
left join (select * from {$this->cate_table} where cate_area = '{$this->cate_area}') as pa_cate
|
|
on substring(cate.cate_code, 1, len(cate.cate_code)-{$this->dmax}) = pa_cate.cate_code
|
|
left join (select cate_area, cate_id, auth_area, string_agg(concat(auth_target,':',auth),',') as auths from ".TB_auth_manage." group by cate_area, cate_id, auth_area ) as auth
|
|
on cate.cate_area = auth.cate_area and cate.cate_id = auth.cate_id
|
|
where cate.cate_area = '{$this->cate_area}' group by cate.cate_area, cate.cate_id, auth_area order by cate.cate_code asc";*/
|
|
|
|
|
|
$rst = $this->DB->qry($sql, $whererow);
|
|
if( $rst ){
|
|
$rows = array();
|
|
while( $row = $this->DB->fetch_array($rst) ){
|
|
// foreach( $GLOBALS['_varsAuthArea'] as $auth_area => $name ){
|
|
// $row['cate_auth_read'][$auth_area] = $authObj->getHasAuthRow($auths[$row['cate_id']][$auth_area], "READ");
|
|
// $row['cate_auth_write'][$auth_area] = $authObj->getHasAuthRow($auths[$row['cate_id']][$auth_area], "WRITE");
|
|
// $row['cate_auth_delete'][$auth_area] = $authObj->getHasAuthRow($auths[$row['cate_id']][$auth_area], "DELETE");
|
|
// }
|
|
|
|
$row['auth'] = $auths[$row['cate_id']];
|
|
$rows[] = Array(
|
|
"id" => $row['cate_id'],
|
|
"text" => $row['cate_name'],
|
|
"parent" => $row['parent'],
|
|
"icon" => "",
|
|
"data" => $row,
|
|
);
|
|
}
|
|
return $rows;
|
|
}else{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
public function getTreeList($cate_code="", $direct=false){
|
|
$temp_ren = strlen($cate_code) + $this->dmax;
|
|
|
|
$where = $this->getAreaQry();
|
|
$where = $this->getShowQry($where);
|
|
$where->add("cate_code like ?", "{$cate_code}%");
|
|
$where->add("cate_code != ?", $cate_code);
|
|
$where->add("len(cate_code) = ?", $temp_ren);
|
|
$where->add("cate.cate_use = ?", "Y");
|
|
$subwhere = $where->sub_where("or");
|
|
$subwhere->add("auth.auth_read = ?", 1);
|
|
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
|
|
$tb_auth = "select
|
|
cate_id,
|
|
cast(sum(auth & 4) as bit) as auth_delete,
|
|
cast(sum(auth & 2) as bit) as auth_write,
|
|
cast(sum(auth & 1) as bit) as auth_read
|
|
from ".TB_auth_manage."
|
|
where (auth_area = 'G' and auth_target = '".$GLOBALS['_Umem']['member_auth']."') or (auth_area = 'M' and auth_target = '".$GLOBALS['_Umem']['member_id']."')
|
|
group by cate_id";
|
|
|
|
$sql = "select cate.cate_id, cate_code, cate_name, cate_data, cate_exp, cate_class from {$this->cate_table} as cate
|
|
left join ({$tb_auth}) as auth on cate.cate_id = auth.cate_id
|
|
where {$whereqry} order by cate_code";
|
|
$rst = $this->DB->qry($sql, $whererow);
|
|
$i = 0;
|
|
$rows = Array();
|
|
while( $row = $this->DB->fetch_array($rst) ){
|
|
if( !$direct ){
|
|
$row['child'] = $this->getTreeList($row['cate_code']);
|
|
}
|
|
$rows[] = $row;
|
|
}
|
|
return $rows;
|
|
}
|
|
|
|
public function getTreeListForTreeView($cate_code="", $now_code=""){
|
|
$temp_ren = strlen($cate_code) + $this->dmax;
|
|
|
|
$where = $this->getAreaQry();
|
|
$where = $this->getShowQry($where);
|
|
$where->add("cate.cate_code like ?", "{$cate_code}%");
|
|
$where->add("cate.cate_code != ?", $cate_code);
|
|
$where->add("len(cate.cate_code) = ?", $temp_ren);
|
|
$where->add("cate.cate_use = ?", "Y");
|
|
$subwhere = $where->sub_where("or");
|
|
$subwhere->add("auth.auth_read = ?", 1);
|
|
$subwhere->add("'SA' = ?", $GLOBALS['_Umem']['member_auth']);
|
|
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
|
|
$tb_auth = "select
|
|
cate_id,
|
|
cast(sum(auth & 4) as bit) as auth_delete,
|
|
cast(sum(auth & 2) as bit) as auth_write,
|
|
cast(sum(auth & 1) as bit) as auth_read
|
|
from ".TB_auth_manage."
|
|
where (auth_area = 'G' and auth_target = '".$GLOBALS['_Umem']['member_auth']."') or (auth_area = 'M' and auth_target = '".$GLOBALS['_Umem']['member_id']."')
|
|
group by cate_id";
|
|
|
|
$sql = "select
|
|
cate.cate_id,
|
|
cate.cate_code,
|
|
cate.cate_name,
|
|
cate.cate_data,
|
|
cate.cate_exp,
|
|
cate.cate_class
|
|
from {$this->cate_table} as cate
|
|
left join ({$tb_auth}) as auth
|
|
on cate.cate_id = auth.cate_id
|
|
where {$whereqry} order by cate.cate_code";
|
|
$rst = $this->DB->qry($sql, $whererow);
|
|
$i = 0;
|
|
$rows = Array();
|
|
while( $row = $this->DB->fetch_array($rst) ){
|
|
$children = $this->getTreeListForTreeView($row['cate_code'], $now_code);
|
|
$temp = array(
|
|
"id" => $row['cate_id'],
|
|
"key" => $row['cate_id'],//
|
|
"text" => $row['cate_name'],
|
|
"title" => $row['cate_name'],//
|
|
"href" => $row['cate_data'],
|
|
"icon" => $row['cate_class'],
|
|
"selectable" => 0,
|
|
"state" => array("expanded"=>false),
|
|
"tags" => [''],
|
|
"nodes" => $children?:"",
|
|
"children" => $children?:"",//
|
|
"folder" => $children?true:false,//
|
|
);
|
|
if( preg_match( "/^{$row['cate_code']}/", $now_code ) ){
|
|
$temp['state']['expanded'] = true;
|
|
$temp['expanded'] = true;//
|
|
}
|
|
if( $row['cate_code'] == $now_code ){
|
|
$temp['state']['selected'] = true;
|
|
$temp['active'] = true;//
|
|
}
|
|
$rows[] = $temp;
|
|
}
|
|
return $rows;
|
|
}
|
|
|
|
public function putMenu($sqldata, $auth_area){
|
|
/* 권한 추가 */
|
|
foreach( (array)$this->authDest as $grpcode => $grpname ){
|
|
$readAuth = in_array($grpcode, (array)$sqldata['cate_auth_read']);
|
|
$writeAuth = in_array($grpcode, (array)$sqldata['cate_auth_write']);
|
|
$deleteAuth = in_array($grpcode, (array)$sqldata['cate_auth_delete']);
|
|
|
|
$this->AUTH->putAuth(
|
|
$this->cate_area,
|
|
$sqldata['cate_id'],
|
|
$auth_area,
|
|
$grpcode,
|
|
$this->AUTH->getAuthToNum($readAuth, $writeAuth, $deleteAuth)
|
|
);
|
|
}
|
|
|
|
/* 메뉴 등록 */
|
|
$sql_row = Array(
|
|
"cate_area" => $this->cate_area,
|
|
"cate_id" => $sqldata['cate_id']?:"",
|
|
"cate_name" => $sqldata['cate_name']?:"",
|
|
"cate_data" => $sqldata['cate_data']?:"",
|
|
"cate_exp" => $sqldata['cate_exp']?:"",
|
|
"cate_class" => $sqldata['cate_class']?:"",
|
|
"cate_auth" => $sqldata['cate_auth']?:"",
|
|
"cate_use" => $sqldata['cate_use']?:"",
|
|
);
|
|
|
|
$pa_row = $this->cate_info_id($sqldata['parent_id']);
|
|
$cate_code = $this->new_cate($pa_row['cate_code']);
|
|
$sql_row['cate_code'] = $cate_code;
|
|
|
|
$rst = $this->DB->insert($this->cate_table, $sql_row);
|
|
if( $rst ){
|
|
$auth_filepath = explode("\n",preg_replace("\r\n","\n",$sqldata['cate_filepath']));
|
|
foreach( (array)$auth_filepath as $path ){
|
|
if( trim($path) ){
|
|
$sql_row = Array(
|
|
"cate_area" => $this->cate_area,
|
|
"cate_id" => $sqldata['cate_id']?:"",
|
|
"filepath" => $path,
|
|
);
|
|
$this->DB->insert(TB_menu_auth_page, $sql_row);
|
|
}
|
|
}
|
|
}
|
|
return $rst;
|
|
}
|
|
|
|
public function setMenu($sqldata, $auth_area){
|
|
/* 권한 수정 */
|
|
foreach( (array)$this->authDest as $grpcode => $grpname ){
|
|
$readAuth = in_array($grpcode, (array)$sqldata['cate_auth_read']);
|
|
$writeAuth = in_array($grpcode, (array)$sqldata['cate_auth_write']);
|
|
$deleteAuth = in_array($grpcode, (array)$sqldata['cate_auth_delete']);
|
|
|
|
$this->AUTH->setAuth(
|
|
$this->cate_area,
|
|
$sqldata['cate_id'],
|
|
$auth_area,
|
|
$grpcode,
|
|
$this->AUTH->getAuthToNum($readAuth, $writeAuth, $deleteAuth),
|
|
$sqldata['parent_id']
|
|
);
|
|
}
|
|
|
|
|
|
/* 메뉴 수정 */
|
|
$sql_row = Array(
|
|
"cate_area" => $this->cate_area,
|
|
"cate_id" => $sqldata['cate_id']?:"",
|
|
"cate_name" => $sqldata['cate_name']?:"",
|
|
"cate_data" => $sqldata['cate_data']?:"",
|
|
"cate_exp" => $sqldata['cate_exp']?:"",
|
|
"cate_class" => $sqldata['cate_class']?:"",
|
|
"cate_auth" => $sqldata['cate_auth']?:"",
|
|
"cate_use" => $sqldata['cate_use']?:"",
|
|
);
|
|
|
|
$where = $this->getAreaQry();
|
|
$where->add("cate_id = ?",$sqldata['parent_id']);
|
|
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
|
|
$rst = $this->DB->update($this->cate_table, $sql_row, $whereqry, $whererow);
|
|
if( $rst ){
|
|
$where = new DB_where("and");
|
|
$where->add("cate_area = ?", $this->cate_area);
|
|
$where->add("cate_id = ?", $sqldata['cate_id']?:"");
|
|
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
$this->DB->delete(TB_menu_auth_page, $whereqry, $whererow);
|
|
|
|
$auth_filepath = explode("\n",preg_replace("/\r\n/ims","\n",$sqldata['cate_filepath']));
|
|
foreach( (array)$auth_filepath as $path ){
|
|
if( trim($path) ){
|
|
$sql_row = Array(
|
|
"cate_area" => $this->cate_area,
|
|
"cate_id" => $sqldata['cate_id']?:"",
|
|
"filepath" => $path,
|
|
);
|
|
$this->DB->insert(TB_menu_auth_page, $sql_row);
|
|
}
|
|
}
|
|
}
|
|
return $rst;
|
|
}
|
|
|
|
public function delMenu($cate_id, $auth_area="", $auth_target=""){
|
|
$caterow = $this->cate_info_id($cate_id);
|
|
$rst = $this->drop_cate($caterow['cate_code']);
|
|
if( $rst ){
|
|
$rst = $rst && $this->AUTH->delAuth($this->cate_area, $cate_id, $auth_area, $auth_target);
|
|
}
|
|
return $rst;
|
|
}
|
|
|
|
public function getMenuIdFromUrl($url){
|
|
$where = new DB_where("and");
|
|
$where->add("cate_area = ?", $this->cate_area);
|
|
//$where->add("filepath like ?", "%{$url}%");
|
|
$where->add("CHARINDEX(filepath, ?) <> 0", $url);
|
|
|
|
$wqry = $where->get_where();
|
|
$whereqry = $wqry['qry'];
|
|
$whererow = $wqry['val'];
|
|
|
|
$sql = "select cate_id from ".TB_menu_auth_page." where {$whereqry}";
|
|
return $this->DB->queryFirstField($sql,$whererow);
|
|
}
|
|
|
|
public function hasMenuAuth($auth, $cate_id=""){
|
|
if( !$cate_id ){
|
|
if( $GLOBALS['_Auth_']['cate_id'] ){
|
|
$cate_id = $GLOBALS['_Auth_']['cate_id'];
|
|
}else{
|
|
$cate_id = $this->getMenuIdFromUrl($_SERVER['SCRIPT_URI']);
|
|
}
|
|
}
|
|
return $this->AUTH->hasAuth($auth, $this->cate_area, $cate_id);
|
|
}
|
|
|
|
public function getMenuBrdcom($cate_id){
|
|
$menu_info = $this->cate_info_id($cate_id);
|
|
return $this->history_cate($menu_info['cate_code']);
|
|
}
|
|
|
|
public function set_cate_area($cate_area=""){
|
|
$this->cate_area = $cate_area?:"service";
|
|
$this->authDest = $this->gsetAuthTarget("all");
|
|
}
|
|
|
|
public function gsetAuthTarget( $type="", $include_sa="" ){
|
|
switch( $this->cate_area ){
|
|
case "admin":
|
|
$authTarget = $GLOBALS['_varsAuthAdmin'];
|
|
break;
|
|
|
|
case "service":
|
|
if( $type == "all" ){
|
|
$authTarget = array_merge($GLOBALS['_varsAuthAdmin'], $GLOBALS['_varsAuthMember']);
|
|
}else{
|
|
$authTarget = $GLOBALS['_varsAuthMember'];
|
|
}
|
|
break;
|
|
}
|
|
if( !$include_sa ){
|
|
unset($authTarget['SA']); //슈퍼관리자 제외
|
|
}
|
|
return $authTarget;
|
|
}
|
|
} |