店铺网 | Pianorock | 店铺网杭州站 | 店铺网社区 | 站长百科 | 手机点评网 | 股票 | 国际招标网
基本上,views和cck是大家都建议用的两个drupal模块,因为这两个模块太强大了,一个可以自由定制字段,一个可以自由过滤数据用以显示, drupal的许多其它模块都是基于这两个的。正因其强大,所以也庞大,庞大耗费资源,相对来说,配置起来也较复杂。对于一些把drupal做为个人博客来用的朋友来说,通常不想使用这两个模块,但drupal默认就只有一种排列文章的方式,按时间发表顺序,而bloger们可能就需要有多一些的排列显示方式。
这个时候可以用查询数据库再配合drupal的一些核心函数来达到简单过滤显示的目的。举个例子吧,用习惯了国内cms的朋友,都喜欢在首页上显示一些区块,什么最新文章、最新推荐、最新评论、热门文章……
咱们先创建一个page节点,标题就看你的爱好了,随便取吧。内容呢,就随便写段代码吧:
<?php
echo '嘿罗,世界';//反正一般程序测试都这个套路。
?>现在进入第二步,到“站点信息(admin/settings/site-information)”中,拉到最后面,把默认首页设置为咱们刚才创建的页面路径:index.html,好,现在打开网站,发现默认首页就剩“嘿罗世界”了,忽悠人啊这不是。别急,接下来做第三步。
第三步,开始往里边添加内容了。我想添加个最新blog文章的列表。drupal区块里有个默认的最新blog文章,到区块中,查看最新blog文章的区块链接是这样的:admin/build/block/configure/blog/0,注意最后两层(blog/0),这很重要。这表示这个区块是由blog.module生成的第0个区块(从0开始计数的)。现在我们编辑那篇文章,把里边的“嘿罗世界”可以删除了,放这段代码进去:
<?php
$block = module_invoke('blog', 'block', 'view', 0);
echo $block['subject'];//显示区块的标题
echo $block['content'];//显示区块的主内容区。
?>我想要显示其它类型,比如story的最新文章呢?因为默认没有提供区块,所以一般的做法呢是用views来过滤出来,但文章一开头就说了,咱们不用views。这就进入另一个重点部分,读取数据库来显示。编辑文章,在后面插入这段代码:
<?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>';
};
?>保存,现在看看效果,最新story文章列表是不是出现了呢?而热门内容呢,statistics模块也提供了一个按点击排序的文章列表,我们可以直接用上面插入区块的办法把它放到页面里。现在我们页面里有最新文章、最新推荐、最新日志、热门内容、最新评论等区块列表了,看起来像那么回事了,接下来的事就是排版了。这个就取决于个人的审美观了,熟悉css的就用css,不熟悉的就直接用表格套上去就行了。
可以收工了,可我还想有个more,你看大多数网站的列表下面,不都有个more,点击进去,显示更多的内容,并且这里边的内容还是可以分页的。好,现在我们来解决这个问题。还是举例子吧,也想不到其它更好的手段了。先在首页的列表下面加个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>';
?><?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) {//加入判断,查询结果大于0才显示;
while ($test = db_fetch_object($result)) {
echo l($test->title,'node/'.$test->nid).'<br>';
};
}else {//否则就显示
echo '没有文章';
}
if(db_num_rows($result) > 10){//如果大于10篇,就显示更多链接。
echo '<a href="/story/all">更多</a>';
}
?><?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) {//加入判断,查询结果大于0才显示;
while ($test = db_fetch_object($result)) {
echo l($test->title,'node/'.$test->nid).'<br>';
};
}else {//否则就显示
echo '没有文章';
}
echo '<p>'.theme('pager', NULL, 15).'</p>';
?>这个时候可能又会觉得一个列表就显示个标题,未免太单调了,我还想显示点作者啊,发表时间啊,评论数目啊,点击数量啊等等。好吧,咱们来完成这个需求。
<?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) {//加入判断,查询结果大于0才显示;
while ($test = db_fetch_object($result)) {
echo '标题:'.l($test->title,'node/'.$test->nid).
' 作者:'.l($test->name,'user/'.$test->uid).
' 评论:'.$test->comment.
' 点击:'.$test->totalcount.
' 发表时间:'.format_date($test->created).'<br>';
};
}else {//否则就显示
echo '没有文章';
}
echo '<p>'.theme('pager', NULL, 15).'</p>';
?>细心的你肯定发现了,这里使用了多表查询,因为节点的点击量是存放在另外一个表里的,而作者的信息又存在users表里。老套路,提交保存,现在看看列表,是不是多了作者、评论这些信息。只是排版未免太难看了。那就用css自己调整吧,可我又不想使用css,而且这种列表式的显示,使用表格更有优势,方便又快捷。那就用列表吧。这样改一改:
<?php
echo '<h2>新闻列表</h2>';
$header = array(//这里增加了,先定义个表格头部
array('data' => '标题'),
array('data' => '作者'),
array('data' => '评论'),
array('data' => '点击'),
array('data' => '发表时间')
);
$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) {//加入判断,查询结果大于0才显示;
while ($test = db_fetch_object($result)) {
//这儿不直接打印,而是定义成一个数组了。
$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>';
?>提交保存,现在看一看页面,是不是都在一个表格里,排版都省了,整整齐齐。这样就差不多了吧,又有了区块,又有了列表页。不过,也许你突然又觉得全是标题列表有也点单调,还想看看摘要显示是什么效果。咱们就来把标题列表改为摘要模式,这个更简单一点,直接使用node_view和node_load,这两个函数,只要你告诉它节点nid,它就能加载节点的摘要或全文视图了。省得麻烦,就直接还是用这个新闻列表页来做试验吧。编辑节点,放入这段代码:
<?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) {//加入判断,查询结果大于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>';
?>注意几个变化,首先要查询数据库的时候,只需要节点nid就行了。其次是在数组循环时,直接用node_view和node_load来显示出文章。这儿就用不着排版了,全部是按照你在node.tpl.php中定义的样式来显示。
现在终于可以结束了,好像在节点组织显示方面,也没其它的需求了。上面的内容我是一边试验一边写下来的,在5.x版本上,应该不会有错误。本来准备截图,嫌上传麻烦,就没截了。如果测试过程中有什么问题,请提出来。显示需求不是很多,可以使用这种查询数据库的方式,如果有许多自定义的显示需求,建议还是用views,毕竟它内置了缓存,而且和其它模块的互动也更好,当然,用起来也更方便。希望这篇文章对于喜欢drupal,但又不想使用views的朋友有一定的帮助。
评论 添加新评论
发表评论