您在這裡

如何遞迴追溯用node reference關聯起來的node列表?

bobju's 的頭像
bobju 在 2010-05-18 (二) 18:25 發表

想請教如何解決標題所描述的問題.

1 問題描述:
1.1 自訂一種 content type 叫做 "CT", 它有一個 node reference 可以關聯到同樣是 CT 的 node.
1.2 假設現在有 C1, C2, C3, C4, C5 五個 node. 它們的關聯是:
C2 - node reference to -> C1
C3 - node reference to -> C1
C4 - node reference to -> C2
C5 - node reference to -> C3

1.3 以下以樹狀圖表示:
C1
 +C2
  +C4
 +C3
  +C5

1.4 就像是討論區的文章與回應的列表那樣.

2 想請教是否有既有模組可以處理這種case? :
2.1 假設將 C1 的 nid 當做參數傳進去的話, 就能夠展示如同上述的 1.3 的列表?
2.1.1 原理就是以 C1 為起點, 遞迴回溯(back trace by recursive) node reference 所聯結起來的所有 node.
2.2 或是可透過 Views 的支援模組, 經設定後可以做出這樣的列表?

3 打算應用在哪些方面:
3.1 可以一眼看出歷史事件的關聯性.
3.2 可以用來建立名單的階層關係, 一眼看出彼此之間的階層關聯.

呵呵, 多謝看完. 8D

1 花了一個多小時反覆try, 還是不行. 設定上都照指示來, 應該都沒錯, 但畫面一片空白.
2 這個模組太新了, 以致於好像極少相關討論. 決定再等一陣子看看好了. =_=
3 3Q very much :)

「當時沒 try 出預期效果」當時一樣是空白畫面?我一開始用會出現


warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'theme_views_tree' was given in /PATH/drupal/includes/theme.inc on line 656.

錯誤訊息,最後把那行註解拿掉才正常。(cache要清)

你把Style換成別的一樣是空白嗎。如果改成Tree (Adjacency model)才空白,附檔views.txt是views export,下面是sql query,參考看看:


SELECT node.nid AS nid,
node.title AS node_title,
node_node_data_field_nr.nid AS node_node_data_field_nr_nid
FROM node node LEFT JOIN content_type_ct node_data_field_nr ON node.vid = node_data_field_nr.vid
LEFT JOIN node node_node_data_field_nr ON node_data_field_nr.field_nr_nid = node_node_data_field_nr.nid
WHERE node.type in ('ct')

或用Features,附檔node_reference_tree_test_work_please.zip。當一般模組安裝,然後Content Type: CT跟Views設定都傳便便。

嗨嗨~
draebb 大, 感謝您慷慨贊助的模組. 8)
drupal程式的部份, 我才剛要開始探索而已,
這得再花一段時間去消化.

關於這個 views tree 的設定, 後來我終於找到之前不能正常顯示的原因:
就是在 Views 的 fields 區塊下所新增的 node reference 欄位的細節設定"跳"掉了:
跟 group by 有關的選項竟然被打勾(之前應該完全沒動到才對), 重新設定好後總算有東西顯示出來:

(這張圖可能太長而有點大, 原本還算是清楚, 上傳後可能被減肥, 所以有點糊掉了. 重試過還是一樣.)

從畫面上來看, 會發現除了紅色框所圍起來的區段已充份顯示出事件的完整關聯性了, 後面的部份則是子事件不斷地遞迴顯示, 其實是多餘的.

我試過在 views tree 的設定上給 arguments 指定node id, 或是限定 items per page 的數量, 但是都無法讓輸出結果僅限定在如畫面中的紅色框線範圍內.

我猜應該是 views tree 把所有符合條件:"專案.cal" 的事件全部撈出來後, 再由php處理, 根據所指定的關聯鍵, 將所有撈出來的事件轉為php的資料關聯陣列, 再以遞迴方式顯示. 但由於 views tree 這個模組在設計上, 並沒有給 user 指定"根"節點條件的設定機制, 它在展示階段所採用的作業邏輯就是對於每一個node, 只要有parent的就通通列出來, 因此才會有畫面上所呈現的不斷重複的事件關聯區段.

實際上的作業邏輯還是要看過程式碼後才能確認.

總之, 目前能夠做到這樣已經很好了. 有助於了解時間都花在哪方面, 也有助於建立事件關聯, 安排後續要加強的方向.

draebb 大, 謝謝您的回應, 希望這討論串後續會有交流的機會. :)