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

各位好:

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

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

謝謝大家

TKY

Hipfox 的照片

這個主題我實做了一

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

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樣版, 寫入下列片段程式碼

  <div class="node <?php print ($sticky && $page==0) ? " sticky" : ""; ?> ">
    <?php if ($page == 0) { ?><h2 class="title"><a href="<?php print $node_url?>"><?php print $title?></a></h2><?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
"<div id=\"navbar\">";
          echo
$first."&nbsp;&nbsp;&nbsp;";
          if (
$previous){ echo $previous."  ";}
          echo
"&nbsp;&nbsp;[".$gallery."]&nbsp;&nbsp;";
          if (
$next){ echo "  ".$next;}
          echo
"&nbsp;&nbsp;&nbsp;".$last."</div>";
       
?>

    <div class="content"><?php print $content?></div>
    <?php if ($links) { ?><div class="links">&raquo; <?php print $links?></div><?php }; ?>
  </div>

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

tky 的照片

多謝Hipfox提供的code。T

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

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

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

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

TKY

Hipfox 的照片

第一,next_prev在teaser

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

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

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

DrakeGuan 的照片

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

只要在 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 的照片

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

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

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

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

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

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

TKY

jimmy 的照片

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

建立相關性,都有同步的問題

DrakeGuan 的照片

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

我說的作法,比較像是要弄一個新的 module 來的作法,並非在 phptemplate 這個 theme engine 層作的。

然後呢,我並沒有去實作啦,只是提出一個更有效率的實作方案而已 :)

tky 的照片

Re: 雙語版問題

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

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

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

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

TKY

Hipfox 的照片

Re: 雙語版問題

mmmmmm, 這個可能要針對需求來調整或修改一些東東.

jimmy 的照片

Re: 雙語版問題

目前這必須改到code來做。

tky 的照片

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

那...有code嗎?

另,TKY發現不管在i18n的進階選項做什麼樣的修改,跳上\下一主題時都會出現兩個語言版本的node。看來i18n管的地方有限。

TKY

jimmy 的照片

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

當然..沒有囉 :p
搞不好官網找找可能會有code~

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

Hipfox 的照片

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

那個 Bug 我後來也有發現,看起來像是該 node 沒有指定分類造成的,我再找個時間 trace 看看 ;P

Hipfox 的照片

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

避免出錯,再對 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

tky 的照片

果然消失了! 謝謝Hipf

果然消失了!
謝謝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 的照片

果然消失了! 謝謝Hipf

果然消失了!
謝謝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

soothepain 的照片

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

請文一下有針對斷頁pagebreak做索引的嗎?

例如一篇文章裡面有五頁,一般為
1 2 3 4 5 下一頁 › 最後一頁 »

想要在這上頭加入分頁索引,該怎麼做?
例如

1. 前言
2. 這是內文二頁
3. 這是內文三頁
4. 這是內文四頁
5. 結語