您在這裡

[ node reference] 如何限制某內容只能被referenced一次?

hanamizuki's 的頭像
hanamizuki 在 2009-10-01 (四) 20:18 發表

最近想在我做的比賽資訊網站新增「得獎名單」的功能,讓網友轉貼得獎名單。

初步構想是:另外新增一個content type,使用node reference功能關連比賽。
在比賽頁面會可以自動新增得獎名單。

不過現在有個問題就是,一個比賽應該只有一個得獎名單,但不知如何限制某比賽只能被referenced一次。
不知有沒有人有線索?

感謝,我昨天後來也有想到用這個。

不過後來這功能還是卡在我希望「得獎名單」是依附在「比賽」底下的,所以變得有點複雜。
也就是說我希望能在「比賽」頁面的 local menu task (tabs)顯示
[比賽資訊] | 得獎名單 | Dev load,
點「得獎名單」進去之後進入得獎名單node。

然後「得獎名單」node頁面的tabs是
比賽資訊 | [得獎名單] | Dev load

總之就是希望該node是依附在另一node的tabs裡面。

似乎有點複雜。

(用views可做到在比賽頁面多一個「得獎名單」tab,但會變成不只「比賽」這個內容類型有「得獎名單」,不知如何限制...)

用views做的話,tky是不曉得要怎麼在單一node的tab上頭顯示你要的tab(改寫網址過濾嗎?)

不過tky建議說,可以用viewfield或viewreference去做「以nodereference id撈出關聯node並顯示」(取決你的關聯方式是一對多或者多對一),然後可以用cck_fieldgroup_tabs,作到tab切換的效果。

這樣如何呢?

tky

tky

嗯...但cck_fieldgroup_tabs的tabs並非加在local menu task這個tabs,而且會把我正在使用的node form column破壞掉,

我可能要再想清楚一點究竟要怎麼做。因為node之間的相關好像有點複雜,我需要
1.能夠讓「比賽」和「得獎名單」有關連,彼此的頁面都有彼此
2.能夠讓「比賽」和「得獎名單」分開編輯,分別計算userpoint
3.能夠讓偵測比賽「截止日期」,截止之後才出現「得獎名單」提交按鈕或內容

頭快爆了

TKY想了一下,建議是這樣:
1.彼此關聯的部份,只要在「得獎名單」中放個「比賽」的nodereference欄位,關聯到「比賽」類型即可。然後在「比賽」中放個viewsfield,濾出屬於這個比賽的「得獎名單。如果一定要作成node tab,可能得用上Penal + views才能搞定你的需求。
2.這個部份只要1.作到了,自然不成問題。
3.這個部份沒有什麼具體的想法,可能需要Penal的進階應用。

tky

tky

謝謝tky的腦力激盪。
viewsfield的話,好像還是dev版本(for D6),而且....要怎樣過濾,想起來就好難噢!

所以我就自己寫了hook menu來新增tab了,以下是我的作法以及問題。

1.在「得獎名單」內容弄一個nodereference來指定是哪個比賽的得獎名單
2.應用一些模組達成要求
使用module.backreference使「比賽」自動對應到「得獎名單」
使用module.unique_field來限制一個比賽只有一個得獎名單
使用module.nodereference_url來很便利的在比賽頁面新增得獎名單

3.新增一個模組,寫hook_menu


<?php
function bhuntr_match_menu() {

$items['node/%node/winner'] = array(
'title' => t("得獎名單"),
'description' => t("這個比賽的得獎名單"),
'access callback' => "bhuntr_match_check_local_tasks",
'access arguments' => array(1),
'page callback' => "bhuntr_match_winner",
'page arguments' => array(1),
'type' => MENU_LOCAL_TASK
);

return $items;
}

function bhuntr_match_winner($node) {
if($node->field_match_winner['0']['nid']){
$win = node_load($node->field_match_winner['0']['nid']);
return $win->body;
}
if(!$node->field_match_winner['0']['nid']){
return '沒有得獎名單情報,若你有的話請按這邊輸入';
}
}

function bhuntr_match_check_local_tasks($node) {
return ($node->type == 'match');
}
?>

這樣一來有成功新增一個tab,會連到winner,像是這樣:
http://bhuntr.com/match/detail/802

-----------

不過有個問題:
點進去這個tab「得獎名單」之後,顯示的是$node->body。
但我希望能顯示整個完整的node+links+comment,也就是希望是顯示的像整個node一樣,不知要如何做?

最後我的作法是,

1.「得獎名單」這個content type有node reference,會指向「比賽」
2. 在比賽頁面寫一個local menu task,使用views api直接輸出view

實驗起來是OK,但還沒完成,等完成再放上原始碼。