您在這裡

創建一個內容分類Block遇到的問題

whany's 的頭像
whany 在 2009-06-25 (四) 15:56 發表

前提:
每篇文章同時需要2個term
目的:
創建一個文章分類的block,有根trem和子trem,以樹型的形式顯示

嘗試過方法:
1,用view創建一個block,Style: HTML List 以根trem做Group,問題是子trem會重複出現

2,找了很多關於Taxonomy的模組,都找不到這種關聯2個taxonomy顯示的,只能個管個的以樹型方式顯示。
後來我想到在一個Vocabulary裡使用根和子trem的方式,模組終於可以以樹型顯示了,但是出現的一個新問題是在創建內容的時候Taxonomy顯示了所有的trems,如果選擇根trem等于等于只選了有一個trem,必須選擇子trem。

想問的問題是,view裡有什麼方法可以不出現重複的trem,或者有什麼方法可以在創建內容時不不能選擇根trem,或者可以將一個Vocabulary裡的根和子trem分開選擇?

當然如果有更好的解決方法也可以。

這個問題已經困擾了我快1個月了至今找不到好的解決辦法,要崩潰了。

順便問一句,drupal主站的modules和themes裡這樣的幾個block關聯的分類篩選是怎麼做的?

1.做 A 分類的 VIEW Page ,Filter A 分類
2.做 B 分類的 VIEW Page ,Filter B 分類
3.利用 B 的 View Page 的 Argument 的 Argument Handling Code 來達到你要的結果
4.利用 View theme 把 A 的 View Page 的 欄位 連結,換成連到 B 的 View Page

先寫個概念,因為裡面有太多的技術 know how ,我不曉得你了解到哪?

不是那個程式的問題啦~ 是對 drupal 的了解程度~
view 是什麼東東 ? 其實不就是一句 SQL 而已~
view field 就是 sql 要撈出的欄位
view filter 不就是 where 條件
view arg 就是 sql 需要額外傳入的參數
Argument Handling Code 算進階的 view arg ,類似 SQL 的子查詢
所以你要用 SQL 的層次去思考啦~
就 分類 A 的 View 來說 SQL 是如下
Select *
From node
Where type = 'MyForm'
And term='A';
分類 B 的 View 來說就是
Select *
From node
Where type = 'MyForm'
And term='B';
而 arg 是要從哪介入 ??
當然就是類似 SQL 的子查詢呀~
Select *
From node
Where type = 'MyForm'
And term='B'
And nid in (Select nid from node where type = 'MyForm' And term='A其中的一個分類');
這樣 的結果不就是你要的了~
至於實際上這要如何弄在 View 上的設定,你先試試,不會再問。

view的使用還在研究,意思我明白了,我自己研究試試。
view能做一個sort by的block嗎?field只能顯示sql查詢結果,sort的內容應該不屬於sql結果,如果要再和term分類block結合在一起是不是更複雜

研究了好久還是沒有辦法解決
創建2個block列出terms,再創建一個page接收url里的termID作為過濾條件,但是這樣始終只能處理一個termID
如何才能讓url里出現2個termID,如果用link重寫功能,但是不支持PHP code。
是不是我思考的方向錯了?

還有一個問題 termID1,termID2 和 termID1+termID2出來的結果都是 termID1所有和所有 termID2 的結果呢?
如果才能顯示 同時有termID1和termID2的內容?

進步囉~ 這樣就能教你了~
再 term b 的 view page 的 arguments 增加一個 node:id
然後再 Argument Handling Code 填入

$result = db_query("SELECT nid FROM node Where tid = %d And nid in (Select nid From node tid = %d)",arg(0),arg(1));
while($row = db_fetch_array($result)) $nodes_id .= $row['nid']."+";
$nodes_id = substr($nodes_id,0,-1);
return array($nodes_id);

而 arg(0) 應該就是你的分類 B , arg(1) 就是你的分類 A 囉,

其他的就是用 view theme 去做手腳傳入 arg(0) , arg(1) 了

$result = db_query("SELECT nid FROM node Where tid = %d And nid in (Select nid From node tid = %d)",arg(0),arg(1));
while($row = db_fetch_array($result)) $nodes_id .= $row['nid']."+";
$nodes_id = substr($nodes_id,0,-1);
return array($nodes_id);

這段功能是通過 arg(0)和arg(1)來查詢出node結果,但是怎么同時獲得arg(0)和arg(1)呢?
block里的terms list的link都是只包含本身ID的鏈接,查詢的結果是所有termID1的nodes,然后點擊termID2再進行一次篩選,這時候的其實是要保留上一個termID,這個時候才會有2個arg,這個是我一直沒想通怎么做的你說要用view theme傳遞 arg,這個沒接觸過,不知道怎么處理。
如果我創建一個Global Variable保存上一次的termID是不是可取?

variable_set($last_termID)
if ($last_termID =="" || is_numeric($last_termID) ){
$termsID = $last_termID ."+"arg(0);
}
else {
$last_termID = arg(0);
$termsID = arg(0);
}
return $termsID

看官網的連結
http://drupal.org/project/modules?filters=drupal_core:78 tid:75&solrsort=sort_title asc
不曉得他是不是有特殊的模組能做到,
不過就是要想辦法把網址弄成
http://www.xxx.com/q?=viewb/term_b_id/term_a_id
能這樣做~ 一定得在 view theme 動手腳了

view theme 是什麼~ 這又是另一堂課了~
view page a 的 term url 應該是
http://www.xxx.com/q?=viewb/term_a_id
則 term_a_id 就是 arg(0)
view page b 的 view theme 裡,把 arg(0) 給吃下來
將url 弄成 http://www.xxx.com/q?=viewb/term_b_id."/".arg(0)

view theme 給你個範例
function phptemplate_views_view_table_allideas_fail($view, $nodes, $type) {
$fields = _views_get_fields();

foreach ($nodes as $node) {
$row = array();
foreach ($view->field as $field) {
if ($fields[$field['id']]['visible'] !== FALSE) {
if($field['queryname']=='term_data_name') {
$title = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);
$title = "term_data_tid.">".$title."";
$cell['data'] = $title;
} else {
$cell['data'] = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);
}
$cell['class'] = "view-field ". views_css_safe('view-field-'. $field['queryname']);
$row[] = $cell;
}
}
$rows[] = $row;
}
return theme('table', $view->table_header, $rows, array('cellspacing'=>'0', 'border'=>'0'));
}

官網用的就是solr的形式,不過要架設apache solr才能使用,這個東西沒用過,如果我實在搞不定這個功能,只能考慮架一個solr了,不過難度也不會低的,最后實在不行我就只能用傻辦法了,分N個content type + 一個term + N個views page ……