Files
BESCMS/dayrui/App/Cms/Controllers/Admin/Auth.php
T

982 lines
38 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php namespace Phpcmf\Controllers\Admin;
/**
* 内容权限设置(模块 / 栏目)
* 用户侧权限仍在 Member 插件 member/auth
*/
class Auth extends \Phpcmf\Common
{
public function __construct() {
parent::__construct();
if (!IS_USE_MEMBER) {
$this->_admin_msg(0, dr_lang('未安装用户系统,无法设置内容权限'));
}
}
// 当前可配置的内容模块
protected function _content_modules() {
$module = \Phpcmf\Service::L('cache')->get('module-'.SITE_ID.'-content');
if (!$module) {
return [];
}
foreach ($module as $dir => $t) {
if ($t['hlist'] == 1) {
unset($module[$dir]);
}
}
return $module;
}
// 构建用户组 / 等级列
protected function _auth_columns($auth_type) {
$group = [
0 => [
'id' => 0,
'name' => dr_lang('游客'),
'use' => 1,
]
];
foreach ($this->member_cache['group'] as $t) {
$group[$t['id']] = [
'id' => $t['id'],
'name' => dr_lang($t['name']),
'use' => 1,
];
}
$level = [
0 => [
'id' => 0,
'name' => dr_lang('游客'),
'group_name' => '',
'level_name' => dr_lang('游客'),
'use' => 1,
]
];
foreach ($this->member_cache['group'] as $t) {
$gname = dr_lang($t['name']);
$level[$t['id']] = [
'id' => $t['id'],
'name' => $gname,
'group_name' => '',
'level_name' => $gname,
'use' => 1,
];
if ($t['level']) {
foreach ($t['level'] as $lv) {
$lname = dr_lang($lv['name']);
$level[$t['id'].'-'.$lv['id']] = [
'id' => $t['id'].'-'.$lv['id'],
'name' => $gname.' / '.$lname,
'group_name' => $gname,
'level_name' => $lname,
'use' => 1,
];
$level[$t['id']]['use'] = 0;
}
}
}
if ($auth_type == 1) {
return $group;
}
if ($auth_type == 2) {
$columns = [];
foreach ($level as $i => $t) {
if ($t['use']) {
$columns[$i] = $t;
}
}
return $columns;
}
return [
'public' => [
'id' => 'public',
'name' => dr_lang('全局'),
'use' => 1,
]
];
}
protected function _get_auth_row($auth_data, $aid) {
$key = (string)$aid;
if (isset($auth_data[$aid]) && is_array($auth_data[$aid])) {
return $auth_data[$aid];
}
if (isset($auth_data[$key]) && is_array($auth_data[$key])) {
return $auth_data[$key];
}
return [];
}
protected function _get_post_row($post, $aid) {
$key = (string)$aid;
if (isset($post[$aid]) && is_array($post[$aid])) {
return $post[$aid];
}
if (isset($post[$key]) && is_array($post[$key])) {
return $post[$key];
}
return [];
}
// 未勾选的 checkbox 不会出现在 POST 中,显式写成 0,避免关闭验证码等无效
protected function _normalize_category_auth_flags($auth) {
if (!is_array($auth)) {
$auth = [];
}
foreach (['show', 'add', 'edit', 'del', 'code'] as $f) {
$auth[$f] = empty($auth[$f]) ? 0 : 1;
}
return $auth;
}
// 表头:用户组 / 等级列
protected function _auth_thead_html($columns) {
$html = '<th class="fc-auth-name">'.dr_lang('权限项').'</th>';
foreach ($columns as $aid => $col) {
$key = (string)$aid;
if ($key === '0') {
$title = '<span class="font-red">'.htmlspecialchars((string)$col['name']).'</span>';
} elseif (!empty($col['group_name'])) {
$title = '<span class="fc-auth-gname">'.htmlspecialchars((string)$col['group_name']).'</span>'
.'<span class="fc-auth-lname">'.htmlspecialchars((string)$col['level_name']).'</span>';
} else {
$title = htmlspecialchars((string)$col['name']);
}
$html .= '<th class="fc-auth-col">'.$title.'</th>';
}
return $html;
}
protected function _auth_form_switch($label, $input_name, $checked, $help = '') {
$html = '<div class="form-group">'
.'<label class="col-md-2 control-label">'.$label.'</label>'
.'<div class="col-md-9">'
.'<input type="checkbox" name="'.$input_name.'" value="1"'
.($checked ? ' checked' : '')
.' data-on-text="'.dr_lang('禁止').'" data-off-text="'.dr_lang('开放').'"'
.' data-on-color="danger" data-off-color="success" class="make-switch" data-size="small">';
if ($help) {
$html .= '<span class="help-block">'.$help.'</span>';
}
$html .= '</div></div>';
return $html;
}
protected function _auth_matrix_wrap($thead, $tbody) {
return '<div class="table-scrollable fc-auth-wrap">'
.'<table class="table table-striped table-bordered table-hover fc-auth-table">'
.'<thead><tr class="heading">'.$thead.'</tr></thead>'
.'<tbody>'.$tbody.'</tbody>'
.'</table></div>';
}
// 栏目权限弹窗按钮
protected function _auth_category_btn($aid, $page, $title, $btn_class = 'btn blue btn-xs', $btn_text = '') {
$url = dr_url('cms/auth/add', ['aid' => $aid, 'page' => $page]);
$js_title = str_replace(["\\", "'"], ["\\\\", "\\'"], (string)$title);
if ($btn_text === '') {
$btn_text = dr_lang('设置');
}
return '<button type="button" class="'.$btn_class.'" onclick="dr_iframe_show(\''.$js_title.'\', \''.$url.'\', \'85%\', \'90%\')">'
.'<i class="fa fa-cog"></i> '.$btn_text
.'</button>';
}
// 栏目权限入口(全局表单)
protected function _auth_category_form($columns, $page = 'cms') {
$aid = 'public';
$name = dr_lang('全局');
foreach ($columns as $k => $col) {
$aid = (string)$k;
$name = (string)$col['name'];
break;
}
return '<div class="form-group">'
.'<label class="col-md-2 control-label">'.dr_lang('栏目权限').'</label>'
.'<div class="col-md-9">'
.$this->_auth_category_btn($aid, $page, dr_lang('[%s]栏目权限', $name), 'btn blue btn-sm', dr_lang('设置栏目发布/审核等权限'))
.'<span class="help-block">'.dr_lang('访问、发布、修改、删除及投稿限制等').'</span>'
.'</div></div>';
}
// 栏目权限矩阵行
protected function _auth_category_row($columns, $page = 'cms') {
$html = '<tr><td class="fc-auth-name">'.dr_lang('栏目权限').'</td>';
foreach ($columns as $aid => $col) {
$key = (string)$aid;
$html .= '<td class="fc-auth-col">'
.$this->_auth_category_btn($key, $page, dr_lang('[%s]栏目权限', $col['name']))
.'</td>';
}
$html .= '</tr>';
return $html;
}
public function index() {
$v = \Phpcmf\Service::M()->db->table('member_setting')->where('name', 'auth_type')->get()->getRowArray();
$auth_type = intval($v['value']);
$columns = $this->_auth_columns($auth_type);
$modules = $this->_content_modules();
$row = \Phpcmf\Service::M()->db->table('member_setting')->where('name', 'auth2')->get()->getRowArray();
$value = $row ? dr_string2array($row['value']) : [];
if (!is_array($value)) {
$value = [];
}
$auth_data = isset($value[SITE_ID]) && is_array($value[SITE_ID]) ? $value[SITE_ID] : [];
if (IS_AJAX_POST) {
$post = \Phpcmf\Service::L('input')->post('data');
if (!is_array($post)) {
$post = [];
}
foreach ($columns as $aid => $col) {
$old = $this->_get_auth_row($auth_data, $aid);
$post_row = $this->_get_post_row($post, $aid);
$home = isset($old['home']) && is_array($old['home']) ? $old['home'] : [];
$home['show'] = empty($post_row['home']['show']) ? 0 : 1;
$old['home'] = $home;
$mod = isset($old['module']) && is_array($old['module']) ? $old['module'] : [];
foreach ($modules as $mid => $m) {
if (!isset($mod[$mid]) || !is_array($mod[$mid])) {
$mod[$mid] = [];
}
$mod[$mid]['show'] = empty($post_row['module'][$mid]['show']) ? 0 : 1;
$mod[$mid]['search'] = empty($post_row['module'][$mid]['search']) ? 0 : 1;
}
$old['module'] = $mod;
$auth_data[$aid] = $old;
}
$value[SITE_ID] = $auth_data;
\Phpcmf\Service::M()->db->table('member_setting')->replace([
'name' => 'auth2',
'value' => dr_array2string($value)
]);
\Phpcmf\Service::M('cache')->sync_cache('member');
$this->_json(1, dr_lang('操作成功'));
}
$is_single = dr_count($columns) <= 1;
$page = \Phpcmf\Service::L('input')->get('page');
if (!$page) {
$page = 'site';
}
if ($page !== 'site' && !isset($modules[$page])) {
$page = 'site';
}
$tabs = [];
// —— 整站 ——
$site_html = '';
if ($is_single) {
$aid = 'public';
foreach ($columns as $k => $col) {
$aid = (string)$k;
break;
}
$data = $this->_get_auth_row($auth_data, $aid);
$aid_attr = htmlspecialchars($aid);
$site_html .= $this->_auth_form_switch(
dr_lang('禁止整站访问'),
'data['.$aid_attr.'][home][show]',
!empty($data['home']['show']),
dr_lang('针对整个网站的前端界面访问权限')
);
$site_html .= $this->_auth_category_form($columns, 'cms');
} else {
$tbody = '<tr><td class="fc-auth-name">'.dr_lang('禁止整站访问').'</td>';
foreach ($columns as $aid => $col) {
$key = (string)$aid;
$data = $this->_get_auth_row($auth_data, $aid);
$checked = !empty($data['home']['show']) ? ' checked' : '';
$tbody .= '<td class="fc-auth-col">'
.'<input type="checkbox" class="fc-auth-check" name="data['.htmlspecialchars($key).'][home][show]" value="1"'.$checked.' />'
.'</td>';
}
$tbody .= '</tr>';
$tbody .= $this->_auth_category_row($columns, 'cms');
$site_html .= $this->_auth_matrix_wrap($this->_auth_thead_html($columns), $tbody);
}
$tabs['site'] = [
'id' => 'site',
'name' => dr_lang('整站'),
'dirname' => '',
'icon' => 'fa fa-globe',
'html' => $site_html,
];
// —— 各内容模块 ——
foreach ($modules as $mid => $m) {
$mname = dr_lang($m['name']);
$icon = !empty($m['icon']) ? $m['icon'] : 'fa fa-folder';
$mod_html = '';
if ($is_single) {
$aid = 'public';
foreach ($columns as $k => $col) {
$aid = (string)$k;
break;
}
$data = $this->_get_auth_row($auth_data, $aid);
$aid_attr = htmlspecialchars($aid);
$mid_attr = htmlspecialchars($mid);
$mod_html .= $this->_auth_form_switch(
dr_lang('禁止访问'),
'data['.$aid_attr.'][module]['.$mid_attr.'][show]',
!empty($data['module'][$mid]['show']),
dr_lang('禁止后无法访问本模块前台')
);
$mod_html .= $this->_auth_form_switch(
dr_lang('禁止搜索'),
'data['.$aid_attr.'][module]['.$mid_attr.'][search]',
!empty($data['module'][$mid]['search']),
dr_lang('禁止后无法使用本模块搜索')
);
if (empty($m['share'])) {
$mod_html .= $this->_auth_category_form($columns, $mid);
} else {
$mod_html .= '<div class="form-group"><label class="col-md-2 control-label">'.dr_lang('栏目权限').'</label>'
.'<div class="col-md-9"><span class="help-block" style="margin-top:8px;">'
.dr_lang('本模块使用共享栏目,请到「整站」中设置栏目权限')
.'</span></div></div>';
}
} else {
$tbody = '';
$tbody .= '<tr><td class="fc-auth-name">'.dr_lang('禁止访问').'</td>';
foreach ($columns as $aid => $col) {
$key = (string)$aid;
$data = $this->_get_auth_row($auth_data, $aid);
$checked = !empty($data['module'][$mid]['show']) ? ' checked' : '';
$tbody .= '<td class="fc-auth-col">'
.'<input type="checkbox" class="fc-auth-check" name="data['.htmlspecialchars($key).'][module]['.htmlspecialchars($mid).'][show]" value="1"'.$checked.' />'
.'</td>';
}
$tbody .= '</tr>';
$tbody .= '<tr><td class="fc-auth-name">'.dr_lang('禁止搜索').'</td>';
foreach ($columns as $aid => $col) {
$key = (string)$aid;
$data = $this->_get_auth_row($auth_data, $aid);
$checked = !empty($data['module'][$mid]['search']) ? ' checked' : '';
$tbody .= '<td class="fc-auth-col">'
.'<input type="checkbox" class="fc-auth-check" name="data['.htmlspecialchars($key).'][module]['.htmlspecialchars($mid).'][search]" value="1"'.$checked.' />'
.'</td>';
}
$tbody .= '</tr>';
if (empty($m['share'])) {
$tbody .= $this->_auth_category_row($columns, $mid);
}
$mod_html .= $this->_auth_matrix_wrap($this->_auth_thead_html($columns), $tbody);
if (!empty($m['share'])) {
$mod_html .= '<p class="help-block" style="margin-top:12px;">'
.dr_lang('本模块使用共享栏目,请到「整站」中设置栏目权限')
.'</p>';
}
}
$tabs[$mid] = [
'id' => $mid,
'name' => $mname,
'dirname' => $mid,
'icon' => $icon,
'html' => $mod_html,
];
}
\Phpcmf\Service::V()->assign([
'menu' => \Phpcmf\Service::M('auth')->_admin_menu(
[
'内容权限' => ['cms/auth/index', 'fa fa-table'],
'help' => [801],
]
),
'auth_type' => $auth_type,
'page' => $page,
'tabs' => $tabs,
]);
\Phpcmf\Service::V()->display('auth_index.html');
}
// 存储模式值
public function save_edit() {
$value = intval(\Phpcmf\Service::L('input')->get('value'));
if (!$value) {
$msg = dr_lang('已切换至按全局配置模式');
} elseif ($value == 1) {
$msg = dr_lang('已切换至按用户组配置模式');
} elseif ($value == 2) {
$msg = dr_lang('已切换至按用户组等级配置模式');
} else {
$this->_json(0, dr_lang('未知模式'));
}
\Phpcmf\Service::M()->db->table('member_setting')->replace([
'name' => 'auth_type',
'value' => $value
]);
\Phpcmf\Service::M('cache')->sync_cache('member');
$this->_json(1, $msg);
}
// 初始化组权限(仅清空内容相关配置,保留用户权限)
public function init_edit() {
$v = \Phpcmf\Service::M()->db->table('member_setting')->where('name', 'auth2')->get()->getRowArray();
$aid = \Phpcmf\Service::L('input')->get('aid');
if ($aid === null || $aid === false || $aid === '') {
$this->_json(0, dr_lang('参数错误'));
}
if ($aid !== 'public' && $aid !== '0' && $aid !== 0
&& !preg_match('/^\d+(-\d+)?$/', (string)$aid)) {
$this->_json(0, dr_lang('参数错误'));
}
$value = $v ? dr_string2array($v['value']) : [];
if (!is_array($value)) {
$value = [];
}
$old = isset($value[SITE_ID][$aid]) && is_array($value[SITE_ID][$aid]) ? $value[SITE_ID][$aid] : [];
if (!$old && is_numeric($aid) && isset($value[SITE_ID][intval($aid)]) && is_array($value[SITE_ID][intval($aid)])) {
$old = $value[SITE_ID][intval($aid)];
}
$keep = [];
if (isset($old['member'])) {
$keep['member'] = $old['member'];
}
if (isset($old['app'])) {
$keep['app'] = $old['app'];
}
$value[SITE_ID][$aid] = $keep;
\Phpcmf\Service::M()->db->table('member_setting')->replace([
'name' => 'auth2',
'value' => dr_array2string($value)
]);
\Phpcmf\Service::M('cache')->sync_cache('member');
$this->_json(1, dr_lang('本组内容权限初始化完成'));
}
// 栏目等详细权限设置
public function add() {
$aid = \Phpcmf\Service::L('input')->get('aid');
if ($aid == 'public') {
$name = dr_lang('全局');
} elseif (!$aid && $aid !== '0' && $aid !== 0) {
$aid = 0;
$name = dr_lang('游客');
} elseif (strpos((string)$aid, '-') !== false) {
list($gid, $lid) = explode('-', $aid);
if (!$this->member_cache['group'][$gid]) {
$this->_admin_msg(0, dr_lang('此用户组不存在'));
} elseif (!$this->member_cache['group'][$gid]['level'][$lid]) {
$this->_admin_msg(0, dr_lang('此用户组等级不存在'));
}
$name = $this->member_cache['group'][$gid]['name'].'-'.$this->member_cache['group'][$gid]['level'][$lid]['name'];
} else {
if ($aid !== '0' && $aid !== 0 && !$this->member_cache['group'][$aid]) {
$this->_admin_msg(0, dr_lang('此用户组不存在'));
}
$name = ($aid === '0' || $aid === 0) ? dr_lang('游客') : $this->member_cache['group'][$aid]['name'];
}
// 共享栏目
$share_module = \Phpcmf\Service::L('cache')->get('module-'.SITE_ID.'-share');
$share_categroy = [];
if (is_file(dr_get_app_dir('module').'Libraries/Category.php')) {
$share_module['category'] = \Phpcmf\Service::L('category', 'module')->get_category('share');
}
if ($share_module['category']) {
foreach ($share_module['category'] as $t) {
if ($t['tid'] != 2) {
$t['is_post'] = 0;
if (!$t['child'] && $t['tid'] == 1) {
$t['is_post'] = 1;
}
$share_categroy[$t['id']] = $t;
}
}
}
// 模块部分
$module = $this->_content_modules();
if ($module) {
foreach ($module as $dir => $t) {
if (is_file(dr_get_app_dir('module').'Libraries/Category.php')) {
$module[$dir]['category'] = \Phpcmf\Service::L('tree', 'module')
->init(\Phpcmf\Service::L('category', 'module')->get_category($dir))
->html_icon()->get_tree_array(0);
} else {
$module[$dir]['category'] = \Phpcmf\Service::L('cache')->get('module-'.SITE_ID.'-'.$dir, 'category');
}
}
}
$v = \Phpcmf\Service::M()->db->table('member_setting')->where('name', 'auth2')->get()->getRowArray();
$value = $v ? dr_string2array($v['value']) : [];
if (!is_array($value)) {
$value = [];
}
$data = isset($value[SITE_ID][$aid]) && is_array($value[SITE_ID][$aid]) ? $value[SITE_ID][$aid] : [];
$auth = [
'share_category' => is_array($data['share_category_public'] ?? null) ? $data['share_category_public'] : [],
'category' => is_array($data['category_public'] ?? null) ? $data['category_public'] : [],
];
if (IS_AJAX_POST) {
$post = \Phpcmf\Service::L('input')->post('data');
if (!is_array($post)) {
$post = [];
}
$save = $data;
// 栏目模式与统一栏目权限
if (isset($post['home']['is_category'])) {
if (!isset($save['home']) || !is_array($save['home'])) {
$save['home'] = [];
}
$save['home']['is_category'] = empty($post['home']['is_category']) ? 0 : 1;
}
$share_public = \Phpcmf\Service::L('input')->post('share_category');
if (is_array($share_public)) {
$save['share_category_public'] = $this->_normalize_category_auth_flags($share_public);
}
$cat_public = \Phpcmf\Service::L('input')->post('category');
if (is_array($cat_public)) {
if (!isset($save['category_public']) || !is_array($save['category_public'])) {
$save['category_public'] = [];
}
foreach ($cat_public as $cmid => $crow) {
// 模板里的 hidden test 字段不算权限配置
if (!is_array($crow) || (dr_count($crow) === 1 && isset($crow['test']))) {
continue;
}
$save['category_public'][$cmid] = $this->_normalize_category_auth_flags($crow);
}
}
if (isset($post['module']) && is_array($post['module'])) {
if (!isset($save['module']) || !is_array($save['module'])) {
$save['module'] = [];
}
foreach ($post['module'] as $mid => $row) {
if (!isset($save['module'][$mid]) || !is_array($save['module'][$mid])) {
$save['module'][$mid] = [];
}
if (isset($row['is_category'])) {
$save['module'][$mid]['is_category'] = empty($row['is_category']) ? 0 : 1;
}
}
}
// 保留用户权限 / 应用权限 / 访问禁止项 / 按栏目独立设置
if (isset($data['member'])) {
$save['member'] = $data['member'];
}
if (isset($data['app'])) {
$save['app'] = $data['app'];
}
if (isset($data['home']['show'])) {
if (!isset($save['home']) || !is_array($save['home'])) {
$save['home'] = [];
}
$save['home']['show'] = $data['home']['show'];
}
if (isset($data['module']) && is_array($data['module'])) {
foreach ($data['module'] as $mid => $row) {
if (!isset($save['module'][$mid]) || !is_array($save['module'][$mid])) {
$save['module'][$mid] = [];
}
if (isset($row['show'])) {
$save['module'][$mid]['show'] = $row['show'];
}
if (isset($row['search'])) {
$save['module'][$mid]['search'] = $row['search'];
}
}
}
if (isset($data['share_category'])) {
$save['share_category'] = $data['share_category'];
}
if (isset($data['category'])) {
$save['category'] = $data['category'];
}
$value[SITE_ID][$aid] = $save;
\Phpcmf\Service::M()->db->table('member_setting')->replace([
'name' => 'auth2',
'value' => dr_array2string($value)
]);
\Phpcmf\Service::M('cache')->sync_cache('member');
$this->_json(1, dr_lang('操作成功'));
}
$page = trim(\Phpcmf\Service::L('input')->get('page'));
if (!$page) {
$page = 'cms';
}
// 弹窗只展示当前入口对应的栏目(共享 / 单个模块)
$is_share_page = ($page === 'cms' || $page === 'site');
$mid = '';
$m = [];
if ($is_share_page) {
$page = 'cms';
$page_name = dr_lang('共享栏目');
} elseif (isset($module[$page])) {
$mid = $page;
$m = $module[$page];
$page_name = dr_lang($m['name']);
// 共享型模块无独立栏目,回退到共享栏目
if (!empty($m['share'])) {
$is_share_page = true;
$page = 'cms';
$mid = '';
$m = [];
$page_name = dr_lang('共享栏目');
}
} else {
$this->_admin_msg(0, dr_lang('模块不存在'));
}
$verify = [];
if (\Phpcmf\Service::M()->is_table_exists('admin_verify')) {
$verify = \Phpcmf\Service::M()->table('admin_verify')->getAll();
}
$diy = $this->_get_diy();
if ($is_share_page) {
$diy['module'] = [];
}
\Phpcmf\Service::V()->assign([
'aid' => $aid,
'diy' => $diy,
'menu' => \Phpcmf\Service::M('auth')->_admin_menu(
[
dr_lang('%s%s栏目权限', $name, $page_name) => ['cms/auth/add{aid='.$aid.'&page='.$page.'}', 'fa fa-table'],
'help' => [801],
]
),
'page' => $page,
'page_name' => $page_name,
'is_share_page' => $is_share_page,
'mid' => $mid,
'm' => $m,
'data' => $data,
'auth' => $auth,
'verify' => $verify,
'is_ajax_edit' => 0,
'share_categroy' => \Phpcmf\Service::L('tree')->init($share_categroy)->html_icon()->get_tree_array(0),
]);
\Phpcmf\Service::V()->display('auth_setting.html');
}
// 弹出设置单独权限
public function edit() {
$at = dr_safe_filename(\Phpcmf\Service::L('input')->get('at'));
if (!$at || !in_array($at, ['share_category', 'category'])) {
$this->_json(0, dr_lang('at参数错误'));
}
$v = \Phpcmf\Service::M()->db->table('member_setting')->where('name', 'auth2')->get()->getRowArray();
$aid = \Phpcmf\Service::L('input')->get('aid');
!$aid && $aid !== '0' && $aid = 0;
$value = $v ? dr_string2array($v['value']) : [];
if (!is_array($value)) {
$value = [];
}
$id = intval(\Phpcmf\Service::L('input')->get('id'));
if (!$id) {
$this->_json(0, dr_lang('id参数错误'));
}
$mid = dr_safe_filename(\Phpcmf\Service::L('input')->get('mid'));
if (IS_AJAX_POST) {
if ($at == 'category') {
$post = \Phpcmf\Service::L('input')->post($at);
$row = is_array($post[$mid] ?? null) ? $post[$mid] : [];
$value[SITE_ID][$aid][$at][$mid][$id] = $this->_normalize_category_auth_flags($row);
} else {
$row = \Phpcmf\Service::L('input')->post($at);
$value[SITE_ID][$aid][$at][$id] = $this->_normalize_category_auth_flags($row);
}
\Phpcmf\Service::M()->db->table('member_setting')->replace([
'name' => 'auth2',
'value' => dr_array2string($value)
]);
\Phpcmf\Service::M('cache')->sync_cache('member');
$this->_json(1, dr_lang('操作成功'));
}
if ($at == 'category') {
$auth = [$at => [$mid => $value[SITE_ID][$aid][$at][$mid][$id]]];
} else {
$auth = [$at => $value[SITE_ID][$aid][$at][$id]];
}
$verify = [];
if (\Phpcmf\Service::M()->is_table_exists('admin_verify')) {
$verify = \Phpcmf\Service::M()->table('admin_verify')->getAll();
}
\Phpcmf\Service::V()->assign([
'mid' => $mid,
'diy' => $this->_get_diy(),
'auth' => $auth,
'verify' => $verify,
'is_ajax_edit' => 1,
]);
\Phpcmf\Service::V()->display('auth_'.$at.'.html');
}
// 复制动作
public function copy_edit() {
$id = intval(\Phpcmf\Service::L('input')->get('id'));
$at = dr_safe_filename(\Phpcmf\Service::L('input')->get('at'));
if (!$at) {
$this->_json(0, dr_lang('at参数错误'));
}
$v = \Phpcmf\Service::M()->db->table('member_setting')->where('name', 'auth2')->get()->getRowArray();
$aid = \Phpcmf\Service::L('input')->get('aid');
!$aid && $aid !== '0' && $aid = 0;
$value = $v ? dr_string2array($v['value']) : [];
if (!is_array($value)) {
$value = [];
}
switch ($at) {
case 'level':
case 'group':
$group = [
0 => [
'id' => 0,
'name' => dr_lang('游客'),
],
];
foreach ($this->member_cache['group'] as $t) {
if ($at == 'level') {
$group[$t['id']] = [
'id' => $t['id'],
'name' => dr_lang($t['name']),
];
if ($t['level']) {
foreach ($t['level'] as $lv) {
$group[$t['id'].'-'.$lv['id']] = [
'id' => $t['id'].'-'.$lv['id'],
'name' => ' └ '.dr_lang($lv['name']),
];
}
}
} else {
$group[$t['id']] = $t;
}
}
if (IS_AJAX_POST) {
$auth = $value[SITE_ID][$aid];
if (!$auth) {
$this->_json(0, dr_lang('当前用户组没有配置权限规则'));
}
$catids = \Phpcmf\Service::L('input')->post('catid');
if (!$catids) {
$this->_json(0, dr_lang('你还没有选择用户组呢'));
}
$c = 0;
if (isset($catids[0]) && $catids[0] == 0) {
foreach ($group as $gid => $t) {
$c++;
$value[SITE_ID][$gid] = $auth;
}
} else {
foreach ($catids as $gid) {
$c++;
$value[SITE_ID][$gid] = $auth;
}
}
\Phpcmf\Service::M()->db->table('member_setting')->replace([
'name' => 'auth2',
'value' => dr_array2string($value)
]);
\Phpcmf\Service::M('cache')->sync_cache('member');
$this->_json(1, dr_lang('共复制%s个用户组', $c));
}
\Phpcmf\Service::V()->assign([
'form' => dr_form_hidden(),
'select' => \Phpcmf\Service::L('tree')->select_category(
$group,
0,
'id=\'dr_catid\' name=\'catid[]\' multiple="multiple" style="height:200px"',
'',
0,
0
),
]);
\Phpcmf\Service::V()->display('auth_copy_group.html');exit;
case 'share_category':
$share_module = \Phpcmf\Service::L('cache')->get('module-'.SITE_ID.'-share');
if (is_file(dr_get_app_dir('module').'Libraries/Category.php')) {
$share_module['category'] = \Phpcmf\Service::L('category', 'module')->get_category('share');
}
if (IS_AJAX_POST) {
$auth = $value[SITE_ID][$aid]['share_category'][$id];
if (!$auth) {
$this->_json(0, dr_lang('当前栏目没有配置权限规则'));
}
$catids = \Phpcmf\Service::L('input')->post('catid');
if (!$catids) {
$this->_json(0, dr_lang('你还没有选择栏目呢'));
}
$c = 0;
if (isset($catids[0]) && $catids[0] == 0) {
foreach ($share_module['category'] as $cid => $t) {
$c++;
$value[SITE_ID][$aid]['share_category'][$cid] = $auth;
}
} else {
foreach ($catids as $cid) {
$c++;
$value[SITE_ID][$aid]['share_category'][$cid] = $auth;
}
}
\Phpcmf\Service::M()->db->table('member_setting')->replace([
'name' => 'auth2',
'value' => dr_array2string($value)
]);
\Phpcmf\Service::M('cache')->sync_cache('member');
$this->_json(1, dr_lang('共复制%s个栏目', $c));
}
\Phpcmf\Service::V()->assign([
'form' => dr_form_hidden(),
'select' => \Phpcmf\Service::L('tree')->select_category(
$share_module['category'],
0,
'id=\'dr_catid\' name=\'catid[]\' multiple="multiple" style="height:200px"',
dr_lang('全部栏目'),
0,
0
),
]);
\Phpcmf\Service::V()->display('auth_copy_category.html');exit;
case 'category':
$mid = dr_safe_filename(\Phpcmf\Service::L('input')->get('mid'));
$module = \Phpcmf\Service::L('cache')->get('module-'.SITE_ID.'-'.$mid);
if (is_file(dr_get_app_dir('module').'Libraries/Category.php')) {
$module['category'] = \Phpcmf\Service::L('category', 'module')->get_category($mid);
}
if (IS_AJAX_POST) {
$auth = $value[SITE_ID][$aid]['category'][$mid][$id];
if (!$auth) {
$this->_json(0, dr_lang('当前栏目没有配置权限规则'));
}
$catids = \Phpcmf\Service::L('input')->post('catid');
if (!$catids) {
$this->_json(0, dr_lang('你还没有选择栏目呢'));
}
$c = 0;
if (isset($catids[0]) && $catids[0] == 0) {
foreach ($module['category'] as $cid => $t) {
$c++;
$value[SITE_ID][$aid]['category'][$mid][$cid] = $auth;
}
} else {
foreach ($catids as $cid) {
$c++;
$value[SITE_ID][$aid]['category'][$mid][$cid] = $auth;
}
}
\Phpcmf\Service::M()->db->table('member_setting')->replace([
'name' => 'auth2',
'value' => dr_array2string($value)
]);
\Phpcmf\Service::M('cache')->sync_cache('member');
$this->_json(1, dr_lang('共复制%s个栏目', $c));
}
\Phpcmf\Service::V()->assign([
'form' => dr_form_hidden(),
'select' => \Phpcmf\Service::L('category', 'module')->select(
$module['mid'],
0,
'id=\'dr_catid\' name=\'catid[]\' multiple="multiple" style="height:200px"',
dr_lang('全部栏目'),
0,
0
),
]);
\Phpcmf\Service::V()->display('auth_copy_category.html');exit;
}
$this->_json(0, dr_lang('未知类型'));
}
private function _get_diy() {
$diy = [
'module' => [],
'category' => [],
];
$local = \Phpcmf\Service::Apps(1);
foreach ($local as $dir => $path) {
if (is_file($path.'Config/Auth.php')) {
$_data = require $path.'Config/Auth.php';
if ($_data) {
foreach ($_data as $key => $val) {
if ($val && isset($diy[$key])) {
foreach ($val as $file) {
if (is_file($path.'Views/auth/'.$file)) {
$diy[$key][] = [
'app' => $dir,
'file' => $path.'Views/auth/'.$file,
];
} else {
log_message('error', '应用插件['.$dir.']权限模板文件不存在:'.$path.'Views/auth/'.$file);
}
}
}
}
}
}
}
return $diy;
}
}