您在這裡

上一主題\下一主題與up的連結怎麼做?

tky's 的頭像
tky 在 2006-11-21 (二) 14:04 發表

各位好:

TKY之前有在討論版上問過一個問題,就是本站node頁尾都有的「上一主題\下一主題與up」的連結要怎麼做?不過好像因為插在其他的問題討論裡頭,所以沒人特別注意。

TKY這次特地另開個主題問問版上的老手們:要做哪方面的設定才能做到每個node底下都可以有上一主題\下一主題與up」的連結呢?

謝謝大家

TKY

這個主題我實做了一個研究,也參考了官網所討論的做法如下,當然你也可以根據需求稍微調整一下。

1. 打開 template.php 插入下列程式片段

function next_prev($current_nid, $type, $btn_type, $label, $class) {
$query = db_query("SELECT tid FROM {term_node} WHERE nid = $current_nid;");
$tid = db_result($query);
$query = db_query("SELECT created FROM {node} WHERE nid = $current_nid");
$current_created = db_result($query);
$sql = "SELECT n.nid, n.title FROM {node} n INNER JOIN {term_node} t ON n.nid = t.nid ";
$sql .= "INNER JOIN {term_data} r ON t.tid = r.tid WHERE n.type = '".$type."' AND n.created ";
switch ($btn_type) {
case "next":
$sql .= "< ";
$sort = "DESC";
break;
case "prev":
$sql .= "> ";
$sort = "ASC";
break;
case "parent":
$query = db_query("SELECT name FROM {term_data} WHERE tid = $tid;");
$name = db_result($query);
return l($label.$name, "$type/tid/$tid", array("title" => $name, "class" => $class));
case "last":
$sql = "SELECT n.nid, n.title FROM node n INNER JOIN term_node t ON n.nid = t.nid";
$sql .= " INNER JOIN term_data r ON t.tid = r.tid WHERE n.type = '".$type."'";
$sql .= " AND r.tid =$tid AND n.status =1 ORDER BY nid ASC LIMIT 0 , 1";
$query = db_query($sql);
$result = db_fetch_array($query);
return l($label, "node/".$result['nid'], array("title" => $label, "class" => $class));
break;
case "first":
$sql = "SELECT n.nid, n.title FROM node n INNER JOIN term_node t ON n.nid = t.nid";
$sql .= " INNER JOIN term_data r ON t.tid = r.tid WHERE n.type = '".$type."'";
$sql .= " AND r.tid =$tid AND n.status =1 ORDER BY nid DESC LIMIT 0 , 1";
$query = db_query($sql);
$result = db_fetch_array($query);
return l($label, "node/".$result['nid'], array("title" => $label, "class" => $class));
break;
default:
return NULL;
break;
}
$sql .= $current_created ." AND r.tid = ". $tid ." AND n.status = 1 ORDER BY n.created $sort;";
$query = db_query($sql);
$result = db_fetch_array($query);
if (!$result) {
$query = db_query("SELECT name FROM {term_data} WHERE tid = $tid;");
$name = db_result($query);
return l("回到 $name 分類", "$type/tid/$tid", array("title" => $name, "class" => $class));
} else {
return l($label, "node/".$result['nid'], array("title" => $label, "class" => $class));
}
}

2. 舉例來說,用於相簿導覽時,可以開啟 node-image.tpl.php theme樣版, 寫入下列片段程式碼

">
<?php if ($page == 0) { ?>

"><?php print $title?>

<?php }; ?>
<?php
$next = next_prev($node->nid, 'image', 'next', '下一張>>', 'test');
$previous = next_prev($node->nid, 'image', 'prev', '<<上一張', 'test');
$last = next_prev($node->nid, 'image', 'last', '>|', 'test');
$first = next_prev($node->nid, 'image', 'first', '|<', 'test');
$gallery = next_prev($node->nid, 'image', 'parent', '', 'test');
echo "

";
echo $first."   ";
if ($previous){ echo $previous." ";}
echo "  [".$gallery."]  ";
if ($next){ echo " ".$next;}
echo "   ".$last."

";
?>

<?php print $content?>

<?php if ($links) { ?>

<?php }; ?>

上例是以相簿為範例說明,在傳入next_prev的 "image" 也可以改成你自己的 type.

多謝Hipfox提供的code。TKY試過了,有用。
不過一些小問題比較麻煩:

第一,next_prev在teaser列表之中也會出現,頗怪。怎麼樣讓它在full node全文模式中出現就好?

第二,當一個node沒有前一筆或下一筆記錄時,就會出現「回到某類分類」的連結。這個其實不需要,因為已經有中間的gallery連結了,不是嗎?要怎麼讓「回到某類分類」不再顯示呢?

第三,一個不打緊的問題。TKY有很多不同類型的node,如果要在每種類型的node下方引用next_prev這樣的導覽連結,就必須一一新增各類型的tpl.php。不曉得有沒有簡單的方法可以一次在node.tpl.php中搞定所有的node?如果沒有,也無所謂。

TKY

tky

第一,next_prev在teaser列表之中也會出現,頗怪。怎麼樣讓它在full node全文模式中出現就好?
Re: 這個要想辦法在 node.tpl.php 中,用程式判斷來避開 teaser 的顯示. 我還不知道要用那個變數去判斷哩~

第二,當一個node沒有前一筆或下一筆記錄時,就會出現「回到某類分類」的連結。這個其實不需要,因為已經有中間的gallery連結了,不是嗎?要怎麼讓「回到某類分類」不再顯示呢?
Re: 偷懶的話直接把 "回到 $name 分類" 改成空字串.

Re: 第三點就如同你的想法.

只要在 code 裏頭,檢查一下 node->teaser 是否是空的,然後就可以判斷要不要把這個「上一主題/下一主題」的功能秀出來了 :)

稍稍有效率的作法是,一開始就做檢查,這樣連資料庫的 query 都省了。

關於第三點,我覺得可以把「上一主題」和「下一主題」的 node id,可以先行讓每個 node 的資料庫裏頭,有額外的兩個 field(ex, prev_node_id, next_node_id),然後在 node 的 creating/updating(editing)/deleting 時,直接去處理這兩個 id 的值,這樣在 display 時,就比較好處理得多了。

而且,網頁本來就是要對瀏覽者友善一些的,所以如果這樣處理,那 loading time 和 server load 應該會大大減少才對 ;)

TKY很贊成DrakeGuan的說法!只是,TKY不清楚實現的方法!

就第一點來說,DrakeGuan說「一開始就做檢查,這樣連資料庫的 query 都省了。」但TKY就不曉得要怎樣「一開始就做檢查」,能否請DrakeGuan提出詳細的code?

另外TKY也不熟悉PHPtemplate的判斷式語法,所以也不知道要怎麼加入DrakeGuan所謂的判斷式。

至於第三點,TKY真覺得是好主意,不過同樣也不清楚可行性多少。

如果DrakeGuan能夠提供上述的code,就太好啦!

TKY

tky

這個問題應該要問Hipfox。
TKY最近開始用i18n製作雙語版的網站,在各個node中當然也會套用上一主題\下一主題與up的連結。

不過後來發覺,不管在中文版還是在英文版,跳上一主題\下一主題時仍會出現不同語言的內容。這個...要怎麼辦呢?

請不要叫TKY選取i18n的only current language選項,因為這樣的話,不支持雙語的內容(TKY網站不是全面的雙語化、英文版的內容比較少)就不會出現在中文版中。

希望老手們可以朝這個方面給TKY一些建議

TKY

tky

各位好:
TKY很久之前問了這個問題,也承蒙Hipfox提供了程式碼。在自己網站使用了一陣子,老是看到很多php錯誤的log紀錄。如下:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 query: next_prev SELECT name FROM term_data WHERE tid = ;

幾乎只要有人登入首頁就會出現一次,一次出現一大串。後來仔細檢視,原來就是「上下主題跳頁」程式碼導致的。刪除之後就沒有問題了。

雖然有很多錯誤log,但基本上這段程式碼運作良好。還是希望有人能夠幫忙debug讓這段程式碼無錯誤的運作,畢竟這樣的功能很基本、很友善。TKY自己的功力不行,只能暫時取消這樣的功能。還請版上的老手們給點意見。

謝謝大家

TKY

tky

避免出錯,再對 template.php 加了一些判斷語句


function next_prev($current_nid, $type, $btn_type, $label, $class) {
$query = db_query("SELECT tid FROM {term_node} WHERE nid = $current_nid;");
$tid = db_result($query);
if ($tid == '') {
if ($btn_type == "parent") {
return l($label."未分類: 回目錄", "$type", array("title" => $name, "class" => $class));
}
return;
}
$query = db_query("SELECT created FROM {node} WHERE nid = $current_nid");
...

這樣那些紅字,應該消失了吧 ;P

果然消失了!
謝謝Hipfox的修正!log終於不會連篇都是錯誤碼了。

另外,TKY發現如果template.php中顯示分類詞term的連結,是以taxonomy/tid/00的方式顯示的話,點選都會出現「找不到往頁」的訊息。所以TKY找出下面的程式片段,把中間的「/tid/」全都改成「/term/」。這樣就不會出現錯誤了

<?php
return l($label.$name, "$type/tid/$tid", array("title" => $name, "class" => $class));
?>
<?php
return l("回到 $name 分類", "$type/tid/$tid",
?>

再者,TKY想請教的是,如何讓上一筆、下一筆、最先與最後一筆的連結,可以顯示自訂的浮動說明?就是說,滑鼠移上去時,會出現黃色小框框的說明文字。目前好像就只會顯示和連結文字同樣的說明;但由於TKY是用一些簡單符號顯示連結的,說明再出現一次同樣的符號,瀏覽者還是搞不懂那是用來幹嘛的吧?!

謝謝Hipfox!

TKY

tky

果然消失了!
謝謝Hipfox的修正!log終於不會連篇都是錯誤碼了。

另外,TKY發現如果template.php中顯示分類詞term的連結,是以taxonomy/tid/00的方式顯示的話,點選都會出現「找不到往頁」的訊息。所以TKY找出下面的程式片段,把中間的「/tid/」全都改成「/term/」。這樣就不會出現錯誤了


return l($label.$name, "$type/tid/$tid", array("title" => $name, "class" => $class));


return l("回到 $name 分類", "$type/tid/$tid",

再者,TKY想請教的是,如何讓上一筆、下一筆、最先與最後一筆的連結,可以顯示自訂的浮動說明?就是說,滑鼠移上去時,會出現黃色小框框的說明文字。目前好像就只會顯示和連結文字同樣的說明;但由於TKY是用一些簡單符號顯示連結的,說明再出現一次同樣的符號,瀏覽者還是搞不懂那是用來幹嘛的吧?!

謝謝Hipfox!

TKY

tky