問題的出現:
1)用views建立了每個用戶的node列表,各個用戶的node列表view是公共可見/可訪問的,但是需要在每個用戶登入後能顯示一個鏈接到自己的 node列表的菜單項,以方便在用戶登入的情形下訪問自己的node列表,而不是從所有用戶列表中尋找自己的node列表鏈接
2)現在menu系統是沒有權限和頁面可見性設置的,所以通過menu系統或views 頁面菜單設定的菜單項(menu item)都是不能根據用戶是否登入來決定是否顯示的
我的問題是:
1)如何能解決這個view是屬于個人的而菜單項是沒有用戶權限的矛盾
2)如何能讓菜單在用戶登入時才顯示,並能鏈接到自己的view頁面
Re:
建一個 page 的頁面
內容部分輸入
<?php
GLOBAL $user;
if($user->uid){
//已登入
drupal_goto('view/'.$user->name);
}else{
//未登入
drupal_goto(''); //回首頁 可以自行改成其他路徑
}
?>
輸入格式記得改成 php
然後在 menu 裡把路徑設成該 page
之後使用者點選該連結的開啟該頁面的時候 會被轉至他自己的 view
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的功能
Re: views模塊建立的屬于個人的view的菜單鏈接問題(有趣又有點複雜)
很感激 hom 的及時回應, 我有按你的第二個方案去嘗試,也就是完全不用menu 系統,自己建立menu item.
現在結果是這樣:
1)頁面的 visibility 是對的, 就是用戶登入都有一個自己的菜單項鏈接到自己的 view 頁面
2)但是用戶登入的情況下,用這個鏈接訪問自己的 view 頁面後 會出現將菜單項的名稱覆蓋了view 裏的 tab 上的標題(我的view中有四個tab)
不知這是為什麽,有沒有好的解決。
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標題"文學" 變成了 “我的文章”
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;
}
?>
Re:
很高興按照你的這個方法,問題解決了。應該說這是通過自建菜單module的完整的解決了不同用戶個人view的菜單訪問問題。
有幾點確實是關鍵
1)用callback來訪問用戶頁面
2)避免使用 views/tab 同樣格式的路徑
3)用戶菜單的出現由view own nodes views 權限的給予來控制。
4)Parent Menu Item Type要設置成tab,因為實際菜單項已經由定義的module設置。
非常的感謝 hom 給予的指導和完整的解決方案, 對遇到相似問題的用戶也是很好的參考。
Re: views模塊建立的屬于個人的view的菜單鏈接問題(有趣又有點複雜)
我的问题say2sky相似,不需要tab,只是想添加一个类似“我的blog”这样的菜单在Navigation中,其URL:photos/Uid
Re: views模塊建立的屬于個人的view的菜單鏈接問題(有趣又有點複雜)
在 views 的頁面設定裡的 header 那一欄輸入 php 格式的 code
<?php
GLOBAL $user;
if($user->uid) print l('我的blog', 'photos/'.$user->uid);
?>
Re: views模塊建立的屬于個人的view的菜單鏈接問題(有趣又有點複雜)
感谢hom的热心帮助,代码我试过了,这段代码是在内容页显示一个标题
我的意思是在导航菜单(Navigation)增加这样的菜单
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);
}
?>
Re: views模塊建立的屬于個人的view的菜單鏈接問題(有趣又有點複雜)
是不是建一个如:test.module的文件,到模块中启用就可以了,抱歉!我对drupal了解不深刻。
我的问题不是你说的打开views 的页面时才出现那种,如果是未登陆用户url为photos/all,如果是登陆用户url为photos/Uid
再次感谢你的解答。
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';
}
?>
Re: views模塊建立的屬于個人的view的菜單鏈接問題(有趣又有點複雜)
$may_cache 好象有问题,我总是收到错误
还有
'page callback' =>
和
'callback' =>
有区别吗
Re: views模塊建立的屬于個人的view的菜單鏈接問題(有趣又有點複雜)
page callback 是 6.x 的格式
callback 是 5.x 的格式