你可能知道在drupal的模板中(比如node.tpl.php)隐藏了很多信息,比如:
: b# P4 @" `3 ~) N <div><?php print $links; ?></div> 如果你是个设计人员或者drupal的使用者,你可能不知道$links中都包含了哪些信息,deve模块提供一个函数dsm()可以很轻松的查看$links的详细信息,用法如下:
- {! F( J+ i0 H+ O <?php dsm('$links'); ?> 这是一个不错的办法,可是虽然知道了$links的信息,如果要修改$links又要怎么做呢?5 i9 T7 f+ o6 w

# [2 {5 z$ D0 |" O2 h$ [0 e0 x3 f- S
( q3 T; L* U9 J3 q( d. m
比如有一个文章,后面跟了一些链接($links),包括评论数、全部阅读和阅读次数。如果你想修改链接的格式或样子,只要重写theme_links()这个函数就可以了,但是如果你想改变评论数的位置,比如:
, k' z! `& I( l# X( | ~! R4 d. \" ?: \4 N6 L. L. P3 s
`2 O, T }/ Y% |0 R% c
要把评论数的链接放到日期后面然后删除全部阅读的链接,那我们又要怎么做呢?先来看看node.tpl.php的代码:+ w y9 B# T- v8 ] w
<h1><?php print $title; ?></h1>! `9 s |6 C* b$ @! E
<div class="meta"><?php print $name ." | " . $date; ?> </div>
l/ e) L4 R+ q3 m% Z- {) i <p><?php print $content ?></p>
, t& ^4 r6 W1 x: q <div><?php print $links; ?></div> 如果要做到我们想要的必须要拆分$links,应该是这样的:
% v& @# V& x: l* ^* |/ e' ]/ G; j <h1><?php print $title; ?></h1>
' Z3 [! [. D3 B' N <div class="meta"><?php print $name ." | " . $date . " | " . $number_of_comments; ?></div>' ~& s' \8 ~( Q
<p><?php print $content ?></p>2 w. g8 K. y# F9 r- r3 d$ [# _
<div><?php print $read_more; ?></div> //这行代码将被删除,因为需求是删除全部阅读的链接。 但是目前我们还没有$read_more和$number_of_comments变量,所以先看看$links的结构:
9 p& y) x& R% ?( O' J
1 e B& T6 @8 Z s! P <?php dsm($node->links); ?> ! N* u/ w8 [2 M* M2 s/ U

. s% h( e9 t0 s. Z5 C% E% L 可以看出comment_comments就是评论数的链接,所以我们直接将comment_comments放到日期的后面, Q& X7 {. T: R
<h1><?php print $title; ?></h1>( I) |8 O$ @! O3 W! ?
<div class="meta"><?php print $name ." | " . $date . " | " . $vars['node']->links['comment_comments']['title']; ?> </div>& K6 u) ]- |- ^; v5 h/ E5 ^
<p><?php print $content ?></p> 但是这种写法是错误的,我们需要的是链接,所以就要l()函数。
) E" _9 i: G; M1 Z; ? <?php l(. ~) M3 N, S. M/ x0 W
$vars['node']->links['comment_comments']['title'],
' E) k6 G. y# r+ ?2 x $vars['node']->links['comment_comments']['href'], , r: C( S: F+ y0 i1 \
array('attributes' => array('class' => 'comment','title' => $vars['node']->links['comment_comments']['attributes']['title'] )) ' z2 j q3 r& }/ \# _2 `
); 0 m+ X& r1 _+ \. f; D
?> 所以我们的node.tpl.php就是:
( ~) K2 X# w; j0 N$ c <?php 2 N. a+ Z/ H6 N
//link comment- z9 P2 C& q# b# y- f0 y) f+ a
$link_comment = l($vars['node']->links['comment_comments']['title'], $vars['node']->links['comment_comments']['href'], array('attributes' => array('class' => 'comment','title' => $vars['node']->links['comment_comments']['attributes']['title'] ))); //and lets create the read more links, j( s: u8 _3 Y" W2 T0 \
$link_read_more = l($vars['node']->links['node_read_more']['title'], $vars['node']->links['node_read_more']['href'],
; i" w( c, K8 E8 e, \array('attributes' => array('class' => 'read-more','title' => $vars['node']->links['node_read_more']['attributes']['title'] )));
4 X# Z# b$ B' g1 G ?> <h1><?php print $title; ?></h1>2 q) Z" V% L4 V4 M
<div class="meta"><?php print $name ." | " . $date . " | " . $link_comment; ?> </div>
9 X4 k9 c, F {9 o0 D5 j <p><?php print $content ?></p>) K" S6 j& d0 }$ U
<div><?php print $link_read_more; ?></div> 虽然实现了我们想要的功能,但是代码看起来很丑陋。如果我们有很多的node.tpl.php(node-blog.tpl.php, node-page.tpl.php, node-news.tpl.php)我们还需要每一个页面都手动修改,这是编程的大忌。' o! D! y% _ t. y! m
而template.php可以很好的解决这个问题,你可以把所有的逻辑代码都放到这个文件里,从而保证了node.tpl.php干净。如果没有template.php可以在主题(theme)文件夹下新建这个文件,更多信息请参考http://drupal.org/node/11811/ } M2 S7 K7 l6 Z
<?php3 S5 k) j6 B& ]3 K* {/ t' ?
//----------------------------+ l" b9 H3 y& S: s5 y. m7 b
//file template.php1 D; a& `& { Z5 i' b
//----------------------------
/ ]9 G8 V7 B$ _/ \function THEMENAME_preprocess_node(&$vars) {( s$ Z1 M/ k* N2 l/ w) @& `
//comments$ L& L0 B! V q! Q
if($vars['node']->links['comment_comments']){! h$ _/ @3 n6 r' _0 @5 z J# }
$vars['link_comment'] = l($vars['node']->links['comment_comments']['title'], $vars['node']->links['comment_comments']['href'],
7 y: k* s% K' E2 m! A array(
# q) o1 K* n/ O 'attributes' => array('class' => 'comment', 'title' => $vars['node']->links['comment_comments']['attributes']['title']),
! h4 N' [7 ]7 `7 n! r: A 'fragment' => $vars['node']->links['comment_comments']['fragment']
+ r# Q3 J* v2 H- y- |: Q )
8 V, j8 W; T8 L8 _" ? ); 5 g( j+ R+ V6 O
}
1 `( Q6 E% i7 w7 dif($vars['node']->links['node_read_more']){
! D, z0 h2 V. ~* j* u1 R* m $vars['link_read_more'] = l($vars['node']->links['node_read_more']['title'], $vars['node']->links['node_read_more']['href'], array('attributes' => array('class' => 'read-more','title' => $vars['node']->links['node_read_more']['attributes']['title'] )));
. q, J6 y# r0 L% [7 M* u; S$ W } ?> THEMENAME_preprocess_node是会在node.tpl.php之前运行的函数,类似的还有THEMENAME_preprocess_page、THEMENAME_preprocess_block等等。9 p& a j R2 |
node.tpl.php不变:
6 G2 a7 @/ l; R7 G% d+ L. U9 I& s<h1><?php print $title; ?></h1>
. e* Y5 J9 q* O: s/ E9 U3 D<div class="meta"><?php print $name ." | " . $date . " | " . $link_comment; ?> </div>' i u0 B5 i/ z! z0 R" v
<p><?php print $content ?></p>% x- J/ _6 I: a& [# c7 N
<div><?php print $link_read_more; ?></div> 这样看起来是不是更好一些呢。
1 O. y. r ]. Y: F“转自《开源黄页网》,http://yp.oss.org.cn”。
# A- m1 j% g% l7 y& T4 S' U! F
3 q C X7 `( P* L) ]. [
( w U; j9 P$ n" \! }6 g& K
" e' L8 `! J: u+ j% ^& { z6 ^" r' V: G0 g. I' J3 r
9 _ _! D( ^4 Y
7 L8 M. E% v8 K& e/ w0 N+ J
3 D! Z7 O" R+ ]8 S- y# A8 G& V |