小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

不使用views,如何自定義節(jié)點(diǎn)列表顯示頁面 | Drupal China

 gaofrank 2008-10-21

這篇文章針對(duì)drupal5寫的,在drupal6里,有些查詢數(shù)據(jù)庫方式改變了,現(xiàn)在做個(gè)一些修正,讓下面的方法適用于drupal5.x和drupal6.x。

基本上,views和cck是大家都建議用的兩個(gè)drupal模塊,因?yàn)檫@兩個(gè)模塊太強(qiáng)大了,一個(gè)可以自由定制字段,一個(gè)可以自由過濾數(shù)據(jù)用以顯 示, drupal的許多其它模塊都是基于這兩個(gè)的。正因其強(qiáng)大,所以也龐大,龐大耗費(fèi)資源,相對(duì)來說,配置起來也較復(fù)雜。對(duì)于一些把drupal做為個(gè)人博客 來用的朋友來說,通常不想使用這兩個(gè)模塊,但drupal默認(rèn)就只有一種排列文章的方式,按時(shí)間發(fā)表順序,而bloger們可能就需要有多一些的排列顯示 方式。

這個(gè)時(shí)候可以用查詢數(shù)據(jù)庫再配合drupal的一些核心函數(shù)來達(dá)到簡單過濾顯示的目的。舉個(gè)例子吧,用習(xí)慣了國內(nèi)cms的朋友,都喜歡在首頁上顯示一些區(qū)塊,什么最新文章、最新推薦、最新評(píng)論、熱門文章……

咱們先創(chuàng)建一個(gè)page節(jié)點(diǎn),標(biāo)題就看你的愛好了,隨便取吧。內(nèi)容呢,就隨便寫段代碼吧:

<?php
echo ‘嘿羅,世界‘;//反正一般程序測(cè)試都這個(gè)套路。
?>

然后在輸入格式里選擇php code模式,自定義路徑呢,隨便想一個(gè)吧,這兒就定義為:index.html。提交保存,這不就一個(gè)“嘿羅世界”嗎?別著急,這只是第一步。

現(xiàn)在進(jìn)入第二步,到“站點(diǎn)信息(admin/settings/site-information)”中,拉到最后面,把默認(rèn)首頁設(shè)置為咱們剛才創(chuàng) 建的頁面路徑:index.html,好,現(xiàn)在打開網(wǎng)站,發(fā)現(xiàn)默認(rèn)首頁就?!昂倭_世界”了,忽悠人啊這不是。別急,接下來做第三步。

第三步,開始往里邊添加內(nèi)容了。我想添加個(gè)最新blog文章的列表。drupal區(qū)塊里有個(gè)默認(rèn)的最新blog文章,到區(qū)塊中,查看最新blog文 章的區(qū)塊鏈接是這樣的:admin/build/block/configure/blog/0,注意最后兩層(blog/0),這很重要。這表示這個(gè)區(qū) 塊是由blog.module生成的第0個(gè)區(qū)塊(從0開始計(jì)數(shù)的)?,F(xiàn)在我們編輯那篇文章,把里邊的“嘿羅世界”可以刪除了,放這段代碼進(jìn)去:

<?php
$block
= module_invoke(‘blog‘, ‘block‘, ‘view‘, 0);
echo
$block[‘subject‘];//顯示區(qū)塊的標(biāo)題
echo $block[‘content‘];//顯示區(qū)塊的主內(nèi)容區(qū)。
?>

純粹的引用代碼讓人有些糊涂,解釋一下,module_invoke:加載模塊,blog:點(diǎn)名要加載這個(gè);block:區(qū)塊,view:顯示。后面的就 不難理解了,要顯示這個(gè)模塊的第0個(gè)區(qū)塊。就這么簡單,要直接在文章中插入其它區(qū)塊也是這個(gè)方法?,F(xiàn)在提交保存,到首頁看看,是不是出現(xiàn)了最新blog文 章的列表(當(dāng)然,你得先發(fā)表幾篇blog文章)。

我想要顯示其它類型,比如story的最新文章呢?因?yàn)槟J(rèn)沒有提供區(qū)塊,所以一般的做法呢是用views來過濾出來,但文章一開頭就說了,咱們不用views。這就進(jìn)入另一個(gè)重點(diǎn)部分,讀取數(shù)據(jù)庫來顯示。編輯文章,在后面插入這段代碼:

<?php
echo ‘<h2>最新story</h2>‘;//標(biāo)題隨意
$result = db_query_range("SELECT n.nid, n.title FROM {node} n WHERE n.type = ‘story‘ ORDER BY n.created DESC", 10);
while (
$test = db_fetch_object($result)) {
    echo
l($test->title,‘node/‘.$test->nid).‘<br>‘;
    };
?>

drupal查詢數(shù)據(jù)庫語句重新定義過,但基本上和mysql手冊(cè)上的方法差不多。完整的手冊(cè)請(qǐng)看這兒。 現(xiàn)在說我們上面的例子,文章的基本信息都存儲(chǔ)在node這個(gè)表里,因?yàn)槲覀冎灰@示標(biāo)題列表,所以查詢title和nid字段,條件呢就是限制為 story類型。你可以把條件改為特定的用戶(uid),或是否推薦(promote)、置頂(sticky),或是否有評(píng)論(comment)等等方 式。最后是排序,這個(gè)例子中我們按節(jié)點(diǎn)的創(chuàng)建時(shí)間倒序,也就是最新文章在前面,數(shù)目限制為10條。下面就是一個(gè)數(shù)組循環(huán)了,在這里邊可以自行排版,添加 css等。

保存,現(xiàn)在看看效果,最新story文章列表是不是出現(xiàn)了呢?而熱門內(nèi)容呢,statistics模塊也提供了一個(gè)按點(diǎn)擊排序的文章列表,我們可 以直接用上面插入?yún)^(qū)塊的辦法把它放到頁面里?,F(xiàn)在我們頁面里有最新文章、最新推薦、最新日志、熱門內(nèi)容、最新評(píng)論等區(qū)塊列表了,看起來像那么回事了,接下 來的事就是排版了。這個(gè)就取決于個(gè)人的審美觀了,熟悉css的就用css,不熟悉的就直接用表格套上去就行了。

可以收工了,可我還想有個(gè)more,你看大多數(shù)網(wǎng)站的列表下面,不都有個(gè)more,點(diǎn)擊進(jìn)去,顯示更多的內(nèi)容,并且這里邊的內(nèi)容還是可以分頁的。好,現(xiàn)在我們來解決這個(gè)問題。還是舉例子吧,也想不到其它更好的手段了。先在首頁的列表下面加個(gè)more鏈接:

<?php
echo ‘<h2>最新story</h2>‘;
$result = db_query_range("SELECT n.nid, n.title FROM {node} n WHERE n.type = ‘story‘ ORDER BY n.created DESC", 10);
while (
$test = db_fetch_object($result)) {
    echo
l($test->title,‘node/‘.$test->nid).‘<br>‘;
    };
echo
‘<a href="/story/all">更多</a>‘;
?>

就這么簡單?是的,就這么簡單,哈哈??稍趺匆驳眉觽€(gè)判斷吧,萬一只有一篇文章,或者只有0篇文章呢,也顯示個(gè)“更多”,那多傻。那就修改一下:
適用于5.x:
<?php
echo ‘<h2>最新story</h2>‘;
$result = db_query_range("SELECT n.nid, n.title FROM {node} n WHERE n.type = ‘story‘ ORDER BY n.created DESC", 10);
if (
db_num_rows($result) > 0) {//加入判斷,查詢結(jié)果大于0才顯示;
while ($test = db_fetch_object($result)) {
    echo
l($test->title,‘node/‘.$test->nid).‘<br>‘;
    };
}else {
//否則就顯示
echo ‘沒有文章‘;
}

if(
db_num_rows($result) > 9){//如果等于10篇,就顯示更多鏈接。
   
echo ‘<a href="/story/all">更多</a>‘;
}
?>

db_num_rows在6.x中不能使用,適用于6.x:
<?php
echo ‘<h2>最新story</h2>‘;
$result = db_query_range("SELECT n.nid, n.title FROM {node} n WHERE n.type = ‘story‘ ORDER BY n.created DESC", 10);
$i = 0;
while (
$test = db_fetch_object($result)) {
    echo
l($test->title,‘node/‘.$test->nid).‘<br>‘;
   
$i++;
    };
if(!
$i ){
echo
‘沒有文章‘;
}

if(
$i > 5){
    echo
‘<a href="/story/all">更多</a>‘;
}
?>

提交保存,有了個(gè)“更多”鏈接,可點(diǎn)擊鏈接不是“找不到頁面”嗎?別急,下一步。創(chuàng)建一個(gè)page節(jié)點(diǎn),標(biāo)題就寫個(gè)“新聞列表”吧,輸入格式還是選取為 php code,自定義路徑呢,就要和上面的一致了:story/all?,F(xiàn)在要填內(nèi)容進(jìn)來了,怎么把這個(gè)最新的story文章列表顯示出來呢?
適用于5.x:
<?php
echo ‘<h2>新聞列表</h2>‘;
$result = pager_query("SELECT n.nid, n.title FROM {node} n WHERE n.type = ‘story‘ ORDER BY n.created DESC", 15);
if (
db_num_rows($result) > 0) {//加入判斷,查詢結(jié)果大于0才顯示;
while ($test = db_fetch_object($result)) {
    echo
l($test->title,‘node/‘.$test->nid).‘<br>‘;
    };
}else {
//否則就顯示
echo ‘沒有文章‘;
}
echo
‘<p>‘.theme(‘pager‘, NULL, 15).‘</p>‘;
?>

適用于6.x:
<?php
echo ‘<h2>新聞列表</h2>‘;
$result = pager_query("SELECT n.nid, n.title FROM {node} n WHERE n.type = ‘story‘ ORDER BY n.created DESC", 15);
$i = 0
while ($test = db_fetch_object($result)) {
    echo
l($test->title,‘node/‘.$test->nid).‘<br>‘;
   
$i++;
};
if(!
$i){
echo
‘沒有文章‘;
}
echo
‘<p>‘.theme(‘pager‘, NULL, 15).‘</p>‘;
?>

請(qǐng)注意這一段代碼,和上面其它的對(duì)比,有一些變化,首先是db_query_range變成了pager_query,對(duì)于有分頁需求的,都使用這個(gè)函數(shù) 查詢。其次當(dāng)然是下面多了翻頁函數(shù):theme(‘pager‘, NULL, 15)。在查詢語句中我們定義了數(shù)目是15條,翻頁里當(dāng)然也是設(shè)置15條。現(xiàn)在保存這個(gè)節(jié)點(diǎn),看看,是不是出現(xiàn)了列表,并且有翻頁了(當(dāng)然,前提是你的 story文章得多于15條,如果不夠多,把15改成2或3試試)。

這個(gè)時(shí)候可能又會(huì)覺得一個(gè)列表就顯示個(gè)標(biāo)題,未免太單調(diào)了,我還想顯示點(diǎn)作者啊,發(fā)表時(shí)間啊,評(píng)論數(shù)目啊,點(diǎn)擊數(shù)量啊等等。好吧,咱們來完成這個(gè)需求。
適用于5.x:

<?php
echo ‘<h2>新聞列表</h2>‘;
$result = pager_query("SELECT n.nid, n.title,n.comment, n.created,u.uid, u.name,s.totalcount FROM {node} n INNER JOIN {node_counter} s ON n.nid = s.nid INNER JOIN {users} u ON n.uid = u.uid WHERE n.type = ‘story‘ ORDER BY n.created DESC", 15);
if (
db_num_rows($result) > 0) {//加入判斷,查詢結(jié)果大于0才顯示;
while ($test = db_fetch_object($result)) {
echo
‘標(biāo)題:‘.l($test->title,‘node/‘.$test->nid).
       
‘  作者:‘.l($test->name,‘user/‘.$test->uid).
       
‘  評(píng)論:‘.$test->comment.
       
‘  點(diǎn)擊:‘.$test->totalcount.
       
‘  發(fā)表時(shí)間:‘.format_date($test->created).‘<br>‘;
    };
}else {
//否則就顯示
echo ‘沒有文章‘;
}
echo
‘<p>‘.theme(‘pager‘, NULL, 15).‘</p>‘;
?>

適用于6.x:
<?php
echo ‘<h2>新聞列表</h2>‘;
$result = pager_query("SELECT n.nid, n.title,n.comment, n.created,u.uid, u.name,s.totalcount FROM {node} n INNER JOIN {node_counter} s ON n.nid = s.nid INNER JOIN {users} u ON n.uid = u.uid WHERE n.type = ‘story‘ ORDER BY n.created DESC", 15);
$i = 0;
while (
$test = db_fetch_object($result)) {
echo
‘標(biāo)題:‘.l($test->title,‘node/‘.$test->nid).
       
‘  作者:‘.l($test->name,‘user/‘.$test->uid).
       
‘  評(píng)論:‘.$test->comment.
       
‘  點(diǎn)擊:‘.$test->totalcount.
       
‘  發(fā)表時(shí)間:‘.format_date($test->created).‘<br>‘;
              
$i++;
};
if(!
$i) {
echo
‘沒有文章‘;
}
echo
‘<p>‘.theme(‘pager‘, NULL, 15).‘</p>‘;
?>

細(xì)心的你肯定發(fā)現(xiàn)了,這里使用了多表查詢,因?yàn)楣?jié)點(diǎn)的點(diǎn)擊量是存放在另外一個(gè)表里的,而作者的信息又存在users表里。老套路,提交保存,現(xiàn)在看看列 表,是不是多了作者、評(píng)論這些信息。只是排版未免太難看了。那就用css自己調(diào)整吧,可我又不想使用css,而且這種列表式的顯示,使用表格更有優(yōu)勢(shì),方 便又快捷。那就用表格吧。這樣改一改:
適用于5.x:
<?php
echo ‘<h2>新聞列表</h2>‘;

$header = array(//這里增加了,先定義個(gè)表格頭部
   
array(‘data‘ => ‘標(biāo)題‘),
    array(
‘data‘ => ‘作者‘),
    array(
‘data‘ => ‘評(píng)論‘),
    array(
‘data‘ => ‘點(diǎn)擊‘),
    array(
‘data‘ => ‘發(fā)表時(shí)間‘)
  );
$tablesort = tablesort_sql($header);
$result = pager_query("SELECT n.nid, n.title,n.comment, n.created,u.uid, u.name,s.totalcount FROM {node} n INNER JOIN {node_counter} s ON n.nid = s.nid INNER JOIN {users} u ON n.uid = u.uid WHERE n.type = ‘story‘ ORDER BY n.created DESC".$tablesort, 15);
if (
db_num_rows($result) > 0) {//加入判斷,查詢結(jié)果大于0才顯示;
while ($test = db_fetch_object($result)) {
   
//這兒不直接打印,而是定義成一個(gè)數(shù)組了。
$rows[] = array( ‘data‘ =>
            array(
               
l($test->title,‘node/‘.$test->nid),
               
l($test->name,‘user/‘.$test->uid),
               
$test->comment,
               
$test->totalcount,
               
format_date($test->created),
            ),
        );
    };
}else {
//否則就顯示
echo ‘沒有文章‘;
}
echo
theme(‘table‘, $header, $rows);//這兒打印出表格。
echo ‘<p>‘.theme(‘pager‘, NULL, 15).‘</p>‘;
?>

適用于6.x:
<?php
echo ‘<h2>新聞列表</h2>‘;

$header = array(//這里增加了,先定義個(gè)表格頭部
   
array(‘data‘ => ‘標(biāo)題‘),
    array(
‘data‘ => ‘作者‘),
    array(
‘data‘ => ‘評(píng)論‘),
    array(
‘data‘ => ‘點(diǎn)擊‘),
    array(
‘data‘ => ‘發(fā)表時(shí)間‘)
  );
$tablesort = tablesort_sql($header);
$result = pager_query("SELECT n.nid, n.title,n.comment, n.created,u.uid, u.name,s.totalcount FROM {node} n INNER JOIN {node_counter} s ON n.nid = s.nid INNER JOIN {users} u ON n.uid = u.uid WHERE n.type = ‘story‘ ORDER BY n.created DESC".$tablesort, 15);
$i = 0;
while (
$test = db_fetch_object($result)) {
   
//這兒不直接打印,而是定義成一個(gè)數(shù)組了。
$rows[] = array( ‘data‘ =>
            array(
               
l($test->title,‘node/‘.$test->nid),
               
l($test->name,‘user/‘.$test->uid),
               
$test->comment,
               
$test->totalcount,
               
format_date($test->created),
            ),
        );
   
$i++;
    };
if(!
$i) {
echo
‘沒有文章‘;
}
echo
theme(‘table‘, $header, $rows);//這兒打印出表格。
echo ‘<p>‘.theme(‘pager‘, NULL, 15).‘</p>‘;
?>

提交保存,現(xiàn)在看一看頁面,是不是都在一個(gè)表格里,排版都省了,整整齊齊。這樣就差不多了吧,又有了區(qū)塊,又有了列表頁。不過,也許你突然又覺得全是標(biāo)題 列表有也點(diǎn)單調(diào),還想看看摘要顯示是什么效果。咱們就來把標(biāo)題列表改為摘要模式,這個(gè)更簡單一點(diǎn),直接使用node_view和node_load,這兩 個(gè)函數(shù),只要你告訴它節(jié)點(diǎn)nid,它就能加載節(jié)點(diǎn)的摘要或全文視圖了。省得麻煩,就直接還是用這個(gè)新聞列表頁來做試驗(yàn)吧。編輯節(jié)點(diǎn),放入這段代碼:
適用于5.x:
<?php
echo ‘<h2>新聞列表</h2>‘;
$result = pager_query("SELECT n.nid FROM {node} n INNER JOIN {node_counter} s ON n.nid = s.nid INNER JOIN {users} u ON n.uid = u.uid WHERE n.type = ‘story‘ ORDER BY n.created DESC", 15);
if (
db_num_rows($result) > 0) {//加入判斷,查詢結(jié)果大于0才顯示;
   
while ($test = db_fetch_object($result)) {
       
$output .= node_view(node_load(array(‘nid‘ => $test->nid)), 1);//這兒的1或0是全文或摘要。
  
};
}else {
//否則就顯示
   
echo ‘沒有文章‘;
}
echo
‘<p>‘.theme(‘pager‘, NULL, 15).‘</p>‘;
?>

適用于6.x:
<?php
echo ‘<h2>新聞列表</h2>‘;
$result = pager_query("SELECT n.nid FROM {node} n INNER JOIN {node_counter} s ON n.nid = s.nid INNER JOIN {users} u ON n.uid = u.uid WHERE n.type = ‘story‘ ORDER BY n.created DESC", 15);
$i = 0;
    while (
$test = db_fetch_object($result)) {
       
$output .= node_view(node_load(array(‘nid‘ => $test->nid)), 1);//這兒的1或0是全文或摘要。
               
$i++;
   };
if(!
$i) {
    echo
‘沒有文章‘;
}
echo
‘<p>‘.theme(‘pager‘, NULL, 15).‘</p>‘;
?>

注意幾個(gè)變化,首先要查詢數(shù)據(jù)庫的時(shí)候,只需要節(jié)點(diǎn)nid就行了。其次是在數(shù)組循環(huán)時(shí),直接用node_view和node_load來顯示出文章。這兒就用不著排版了,全部是按照你在node.tpl.php中定義的樣式來顯示。

現(xiàn)在終于可以結(jié)束了,好像在節(jié)點(diǎn)組織顯示方面,也沒其它的需求了。上面的內(nèi)容我是一邊試驗(yàn)一邊寫下來的,在5.x版本上,應(yīng)該不會(huì)有錯(cuò)誤。本來準(zhǔn)備 截圖,嫌上傳麻煩,就沒截了。如果測(cè)試過程中有什么問題,請(qǐng)?zhí)岢鰜?。希望這篇文章對(duì)于喜歡drupal,但又不想使用views的朋友有一定的幫助。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多