您在這裡

views模塊建立的屬于個人的view的菜單鏈接問題(有趣又有點複雜)

say2sky's 的頭像
say2sky 在 2008-06-24 (二) 08:44 發表

問題的出現:
1)用views建立了每個用戶的node列表,各個用戶的node列表view是公共可見/可訪問的,但是需要在每個用戶登入後能顯示一個鏈接到自己的 node列表的菜單項,以方便在用戶登入的情形下訪問自己的node列表,而不是從所有用戶列表中尋找自己的node列表鏈接
2)現在menu系統是沒有權限和頁面可見性設置的,所以通過menu系統或views 頁面菜單設定的菜單項(menu item)都是不能根據用戶是否登入來決定是否顯示的

我的問題是:
1)如何能解決這個view是屬于個人的而菜單項是沒有用戶權限的矛盾
2)如何能讓菜單在用戶登入時才顯示,並能鏈接到自己的view頁面

建一個 page 的頁面
內容部分輸入


<?php
GLOBAL $user;
if($user->uid){
//已登入
drupal_goto('view/'.$user->name);
}else{
//未登入
drupal_goto(''); //回首頁 可以自行改成其他路徑
}
?>

輸入格式記得改成 php
然後在 menu 裡把路徑設成該 page
之後使用者點選該連結的開啟該頁面的時候 會被轉至他自己的 view

或是直接用模組寫

<?php
function my_nodes_perm(){
return array('view own nodes views');
}

function my_nodes_menu($may_cache){
$items = array();
if(!$may_cache){
$items[] = array(
'path' => 'view/mynodes',
'title' => '我的文章',
'callback' => 'my_nodes_list',
'access' => user_access('view own nodes views')
);
}
return $items;
}

function my_nodes_list(){
GLOBAL $user;
drupal_goto('view/'.$user->name);
}
?>

之後到權限管理裡把 authenticated user 的 view own nodes views 權限打開就行了
可以完整達成1&2的功能

很感激 hom 的及時回應, 我有按你的第二個方案去嘗試,也就是完全不用menu 系統,自己建立menu item.

現在結果是這樣:
1)頁面的 visibility 是對的, 就是用戶登入都有一個自己的菜單項鏈接到自己的 view 頁面
2)但是用戶登入的情況下,用這個鏈接訪問自己的 view 頁面後 會出現將菜單項的名稱覆蓋了view 裏的 tab 上的標題(我的view中有四個tab)

不知這是為什麽,有沒有好的解決。

我又一次嘗試了,發現可能是自建模組(module)來産生菜單項時, 原來views模組的菜單部分很可能有沖突,因為要在view裏面有多個 tab, views模組的菜單部分就不能完全禁用,下面是我的設定


=menu部分= tab1/tab2/tab3/tab4
Provide Menu: y/y/y/y
Provide Menu as Tab: y/y/y/y
Tab Weight: 0/1/2/3
Menu Title: 文學/電影/遊戲/IT

=Default Menu Tab部分=
Make Default Menu Tab y/n/n/n 必有一個設為默認
Parent Menu Item Type: tab/tab/tab/tab ???
Tab Weight: 0/0/0/0
Parent Menu Item Title: 我的文章/n/n/n

現在問題好像是在Parent Menu Item Type這裏:

1) 如果我的選項是tab/tab/tab/tab在用menu item“我的文章”鏈接訪問時, view上會出現兩個標題 “我的文章” “我的文章”

2) 如果我的選項是normal menu item/tab/tab/tab在用menu item“我的文章”鏈接訪問時, secornary menu上會出現兩個菜單項“我的文章” “我的文章”

也就是views的page設置中的menu也還在起作用。

3)以上兩種情況也都會發生menu item “我的文章” 覆蓋 tab 標題的問題 也就是第一個tab標題"文學" 變成了 “我的文章”

views 下作的 tabl menu 設定我並不是很熟
下面的做法不確定一定可行 你可以試試看

你可以修改一下模組
把menu 的設定
加上 'type' => MENU_NORMAL_ITEM

然後 path 的部分
不要設為和 tab 的連結相同開頭的路徑

例如 tab 的部分為
views/tab1
views/tab2
views/tab3

那 path 的部分就不要用 views/開頭
改成 mynodes/list 之類的
避免因為和 views/tab 同樣格式而被判斷為 tab menu 之一


<?php
function my_nodes_menu($may_cache){
$items = array();
if(!$may_cache){
$items[] = array(
'path' => 'mynodes/list',
'title' => '我的文章',
'callback' => 'my_nodes_list',
'type' => MENU_NORMAL_ITEM,
'access' => user_access('view own nodes views')
);
}
return $items;
}
?>

很高興按照你的這個方法,問題解決了。應該說這是通過自建菜單module的完整的解決了不同用戶個人view的菜單訪問問題。

有幾點確實是關鍵
1)用callback來訪問用戶頁面
2)避免使用 views/tab 同樣格式的路徑
3)用戶菜單的出現由view own nodes views 權限的給予來控制。
4)Parent Menu Item Type要設置成tab,因為實際菜單項已經由定義的module設置。

非常的感謝 hom 給予的指導和完整的解決方案, 對遇到相似問題的用戶也是很好的參考。

所以你是希望在開啟那個 views 的頁面的時候
才在導覽選單裡面出現'我的blog'的連結嗎
那就跟上面一樣自己寫個小模組來 hook_menu


<?php
function my_blog_menu($may_cache){
$items = array();
if(!$may_cache){
if(arg(0) == 'views' && arg(1) == 'xxx'){ //判斷你的 views 顯示的路徑 這裡的例子是 views/xxx
$items[] = array(
'path' => 'photos',
'title' => '我的blog',
'callback' => 'my_blog_link',
);
}
}
return $items;
}

function my_blog_link(){
GLOBAL $user;
drupal_goto('photos/'.$user->uid);
}
?>

一個模組最基本必須建立 .info 與 .module 這兩個文件
所以如果你的模組名稱是 test
就應該要有 test.info 以及 test.module 兩個文件

方法一

<?php
function test_menu($may_cache){
$items = array();
if(!$may_cache){
$items[] = array(
'path' => 'photos',
'title' => '我的blog',
'callback' => 'test_blog_link',
);
}
return $items;
}

function test_blog_link(){
GLOBAL $user;
if($user->uid){
drupal_goto('photos/'.$user->uid);
} else {
drupal_goto('photos/all');
}
}
?>

這種方式只會提供一個連結 photos
依據使用者是否登入來將畫面轉向至不同的路徑

方法二

<?php
function test_blog_menu($may_cache){
$items = array();
if(!$may_cache){
GLOBAL $user;
if($user->uid){
$items[] = array(
'path' => 'photos/'.$user->uid,
'title' => '我的blog',
'callback' => 'test_blog_user',
);
}else{
$items[] = array(
'path' => 'photos/all',
'title' => '我的blog',
'callback' => 'test_blog_all',
);
}
}
return $items;
}

function test_blog_all(){
return 'my_blog_all';
}

function my_blog_user(){
return 'test_blog_user';
}
?>