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 = ;
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");
...
這個主題我實做了一
這個主題我實做了一個研究,也參考了官網所討論的做法如下,當然你也可以根據需求稍微調整一下。
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 if ($links) { ?>
<?php }; ?>
上例是以相簿為範例說明,在傳入next_prev的 "image" 也可以改成你自己的 type.
多謝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
第一,next_prev在teaser
第一,next_prev在teaser列表之中也會出現,頗怪。怎麼樣讓它在full node全文模式中出現就好?
Re: 這個要想辦法在 node.tpl.php 中,用程式判斷來避開 teaser 的顯示. 我還不知道要用那個變數去判斷哩~
第二,當一個node沒有前一筆或下一筆記錄時,就會出現「回到某類分類」的連結。這個其實不需要,因為已經有中間的gallery連結了,不是嗎?要怎麼讓「回到某類分類」不再顯示呢?
Re: 偷懶的話直接把 "回到 $name 分類" 改成空字串.
Re: 第三點就如同你的想法.
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 應該會大大減少才對 ;)
Re: 上一主題\下一主題與up的連結怎麼做?
TKY很贊成DrakeGuan的說法!只是,TKY不清楚實現的方法!
就第一點來說,DrakeGuan說「一開始就做檢查,這樣連資料庫的 query 都省了。」但TKY就不曉得要怎樣「一開始就做檢查」,能否請DrakeGuan提出詳細的code?
另外TKY也不熟悉PHPtemplate的判斷式語法,所以也不知道要怎麼加入DrakeGuan所謂的判斷式。
至於第三點,TKY真覺得是好主意,不過同樣也不清楚可行性多少。
如果DrakeGuan能夠提供上述的code,就太好啦!
TKY
Re: 上一主題\下一主題與up的連結怎麼做?
建立相關性,都有同步的問題
Re: 上一主題\下一主題與up的連結怎麼做?
我說的作法,比較像是要弄一個新的 module 來的作法,並非在 phptemplate 這個 theme engine 層作的。
然後呢,我並沒有去實作啦,只是提出一個更有效率的實作方案而已 :)
Re: 雙語版問題
這個問題應該要問Hipfox。
TKY最近開始用i18n製作雙語版的網站,在各個node中當然也會套用上一主題\下一主題與up的連結。
不過後來發覺,不管在中文版還是在英文版,跳上一主題\下一主題時仍會出現不同語言的內容。這個...要怎麼辦呢?
請不要叫TKY選取i18n的only current language選項,因為這樣的話,不支持雙語的內容(TKY網站不是全面的雙語化、英文版的內容比較少)就不會出現在中文版中。
希望老手們可以朝這個方面給TKY一些建議
TKY
Re: 雙語版問題
mmmmmm, 這個可能要針對需求來調整或修改一些東東.
Re: 雙語版問題
目前這必須改到code來做。
Re: 上一主題\下一主題與up的連結怎麼做?
那...有code嗎?
另,TKY發現不管在i18n的進階選項做什麼樣的修改,跳上\下一主題時都會出現兩個語言版本的node。看來i18n管的地方有限。
TKY
Re: 上一主題\下一主題與up的連結怎麼做?
當然..沒有囉 :p
搞不好官網找找可能會有code~
各位好: 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
Re: 上一主題\下一主題與up的連結怎麼做?
那個 Bug 我後來也有發現,看起來像是該 node 沒有指定分類造成的,我再找個時間 trace 看看 ;P
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
果然消失了! 謝謝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
果然消失了! 謝謝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
Re: 上一主題\下一主題與up的連結怎麼做?
請文一下有針對斷頁pagebreak做索引的嗎?
例如一篇文章裡面有五頁,一般為
1 2 3 4 5 下一頁 › 最後一頁 »
想要在這上頭加入分頁索引,該怎麼做?
例如
1. 前言
2. 這是內文二頁
3. 這是內文三頁
4. 這是內文四頁
5. 結語