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

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

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

hom 的照片

Re:

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

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

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

hom 的照片

Re:

或是直接用模組寫

<?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的功能

say2sky 的照片

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

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

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

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

say2sky 的照片

Re:

我又一次嘗試了,發現可能是自建模組(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標題"文學" 變成了 “我的文章”

hom 的照片

Re:

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;
}
?>

say2sky 的照片

Re:

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

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

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

playts 的照片

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

我的问题say2sky相似,不需要tab,只是想添加一个类似“我的blog”这样的菜单在Navigation中,其URL:photos/Uid

hom 的照片

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

在 views 的頁面設定裡的 header 那一欄輸入 php 格式的 code

<?php
GLOBAL $user;
if(
$user->uid) print l('我的blog', 'photos/'.$user->uid);
?>

playts 的照片

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

感谢hom的热心帮助,代码我试过了,这段代码是在内容页显示一个标题

我的意思是在导航菜单(Navigation)增加这样的菜单

hom 的照片

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

所以你是希望在開啟那個 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);
}
?>

playts 的照片

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

是不是建一个如:test.module的文件,到模块中启用就可以了,抱歉!我对drupal了解不深刻。

我的问题不是你说的打开views 的页面时才出现那种,如果是未登陆用户url为photos/all,如果是登陆用户url为photos/Uid

再次感谢你的解答。

hom 的照片

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

一個模組最基本必須建立 .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';
}
?>

playts 的照片

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

$may_cache 好象有问题,我总是收到错误

warning: Missing argument 1 for test_menu() in D:\root\htdocs\playts\sites\all\modules\test\test.module on line 2.

还有
'page callback' =>

'callback' =>

有区别吗

hom 的照片

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

page callback 是 6.x 的格式
callback 是 5.x 的格式