問題:普通管理員沒有權限修改欄目,只有超級管理員才有權限修改,凡是非超級管理員,設置欄目權限后只能添加欄目,不能對欄目進行修改和刪除操作,提示您沒有權限操作該項這使系統的一個BUG.
一、對于普通欄目的權限:
PHPCMS v9在判斷權限的時候只判斷admin_role_priv表中所記錄的權限,也就是我們在設置角色的時候所進行的“權限設置”,而不考慮我們所設置的“欄目權限”,由admin:check_priv()在可以看出,該方法沒有對欄目權限作任何考慮,所以當我們使用非超管登錄時,修改欄目或刪除欄目就會提示“您沒有權限操作該項”.
地址:phpcms/modules/admin/classes/admin.class.php
解決辦法:
1.找到/phpcms/modules/admin/classes/admin.class.php ,在里面找到如下代碼:
$r =$privdb->get_one(array('m'=>ROUTE_M,'c'=>ROUTE_C,'a'=>$action,'roleid'=>$_SESSION['roleid'],'siteid'=>$siteid));
大概在171行上,然后在該句下面加上:
- //修改2012-08-06
- if(ROUTE_C == 'category'){
- $catid = $_GET['catid'] ? $_GET['catid'] : $_POST['catid'];
- //獲取角色當前權限設置
- pc_base::load_app_class('role_cat', '', 0);
- $priv = role_cat::get_roleid($_SESSION['roleid'], $siteid);
- if($priv[$catid][$action]) $r = true;
- }
- //修改完畢
2.在 /phpcms/modules/admin/category.php中找到如下代碼:
- foreach ($arrchildid_arr as $arr_v) {
- $this->update_priv($arr_v, $_POST['priv_groupid'], 0);
- }
- //改為:
- foreach ($arrchildid_arr as $arr_v) {
- $this->update_priv($arr_v, $_POST['priv_roleid']);
- $this->update_priv($arr_v, $_POST['priv_groupid'], 0);
- } //Vevb.com
二、對于單頁的權限:
上面的方法可能只能解決欄目權限問題,并不能解決單頁權限問題,這是因為后臺并沒有保存到我們的設置的單頁權限.
解決辦法:我們找到后臺的:【設置】-【管理員設置】-【角色管理】-【欄目權限】,選擇我們要修改的站點,然后右邊出現如下:
這是因為在后臺的代碼中(phpcms/modules/admin/role.php 175行)設置欄目權限setting_cat_priv()這個方法里面定義了如果是類型為 1 即單頁,禁用除了查看之外所有權限,其他權限呈現灰色不可選,事實上欄目和單頁在系統看來都是作為欄目來處理的.
所以我們把if這個判斷去除,把foreach循環里面的內容修改為以下即可:
- $v['disabled'] = '';
- $v['add_check'] = isset($priv[$v['catid']]['add']) ? 'checked' : '';
- $v['delete_check'] = isset($priv[$v['catid']]['delete']) ? 'checked' : '';
- $v['listorder_check'] = isset($priv[$v['catid']]['listorder']) ? 'checked' : '';
- $v['push_check'] = isset($priv[$v['catid']]['push']) ? 'checked' : '';
- $v['move_check'] = isset($priv[$v['catid']]['remove']) ? 'checked' : '';
- $v['edit_check'] = isset($priv[$v['catid']]['edit']) ? 'checked' : '';
- $v['init_check'] = isset($priv[$v['catid']]['init']) ? 'checked' : '';
- $category[$k] = $v;
這個時候你去后臺即可看到所有的單頁和欄目都可以選擇所有權限了.
4.但是我們用普通帳號去管理欄目的時候,修改單頁保存之后,再點擊編輯的時候提示沒有權限了。
修改欄目方法地址:phpcms/modules/admin/category.php 找到edit()方法,發現默認方法中會根據欄目類型調用不同管理模版,單頁模版的是:phpcms/modules/admin/templates/category_page_edit.tpl.php,打開文件
ctrl+F 查找id="div_setting_5" ,定位到第五個TAB標簽,看表頭中寫的是[role_name]和[edit],正確應該是[view]的,兩項.
原因:到這里我們應該清楚為什么修改一次就沒權限了,因為每次修改之前會把默認值放到頁面,然后提交的時候只提交了查看權限,其他的權限沒有表單來提交過去,而更新權限是把所有先清空一遍,然后保存表單提交的數據,所以其他權限都沒了。
我們把欄目模版:phpcms/modules/admin/templates/category_edit.tpl.php (ctrl+F id="div_setting_5")對應的表格內容復制替換這里即可,復制完之后把move改成remove 就是最后一項[移動]的權限的值.
保存之后,我們再點開發現后臺現在已經可以選擇權限了,選中保存并測試,完成.
說明:1.在上面修改的操作中,請習慣寫上注釋,這是我們自己修改的,等到官方升級之后看看是否需要修改覆蓋.
2.操作做完之后,默認新增的欄目只能是當前管理員才有效,這個時候我們可以在新增欄目的時候選擇,在 權限設置 一欄選擇哪些管理員有權限.
3.對于新增欄目權限,大家可以自己按上面的方法去檢查并修復.
新聞熱點
疑難解答