你可能知道在drupal的模板中(比如node.tpl.php)隐藏了很多信息,比如:
: v/ l0 O" h2 {/ D <div><?php print $links; ?></div> 如果你是个设计人员或者drupal的使用者,你可能不知道$links中都包含了哪些信息,deve模块提供一个函数dsm()可以很轻松的查看$links的详细信息,用法如下:
) { [ o* N! @, Z <?php dsm('$links'); ?> 这是一个不错的办法,可是虽然知道了$links的信息,如果要修改$links又要怎么做呢?+ d* Q! c% o) l7 t r

" P' j* c" v* L5 r$ X- v$ ^' V( l/ ~- o% r" J% @2 l; X u: q( \0 \
比如有一个文章,后面跟了一些链接($links),包括评论数、全部阅读和阅读次数。如果你想修改链接的格式或样子,只要重写theme_links()这个函数就可以了,但是如果你想改变评论数的位置,比如:* l0 R% l! j# B4 u
8 a2 @5 R. z$ t& d; J * G& q# K- h. F! [! B* h
要把评论数的链接放到日期后面然后删除全部阅读的链接,那我们又要怎么做呢?先来看看node.tpl.php的代码:
4 K/ n6 e9 ?; |% l5 b <h1><?php print $title; ?></h1>
7 ^8 |7 j: R; R% f L <div class="meta"><?php print $name ." | " . $date; ?> </div>! j0 B+ z: O5 e$ u
<p><?php print $content ?></p>) A6 Q- q% G0 K t
<div><?php print $links; ?></div> 如果要做到我们想要的必须要拆分$links,应该是这样的:( m7 t2 ^. {" E" t% U& U
<h1><?php print $title; ?></h1>; _9 q! {# Y( i4 ?$ x; g
<div class="meta"><?php print $name ." | " . $date . " | " . $number_of_comments; ?></div>
6 H5 f& [. W h/ o/ s* e. i <p><?php print $content ?></p>. i2 C0 X6 Q9 h
<div><?php print $read_more; ?></div> //这行代码将被删除,因为需求是删除全部阅读的链接。 但是目前我们还没有$read_more和$number_of_comments变量,所以先看看$links的结构:9 W u/ [6 R" L
: K8 {8 `) R0 J. Y <?php dsm($node->links); ?> 6 q& a" q4 f+ Y! g2 w, f$ G; o+ `

( }7 A" T# Q) M; I' K% } 可以看出comment_comments就是评论数的链接,所以我们直接将comment_comments放到日期的后面- r2 t3 O6 x+ J- V% w
<h1><?php print $title; ?></h1>
+ Y- Q. e% j. W+ `/ O <div class="meta"><?php print $name ." | " . $date . " | " . $vars['node']->links['comment_comments']['title']; ?> </div>; i* t2 Z/ w& L+ ^7 l
<p><?php print $content ?></p> 但是这种写法是错误的,我们需要的是链接,所以就要l()函数。 Q% J+ I# C- Q6 `
<?php l(8 d" e/ L3 ~7 H* ~% z ~6 C* }
$vars['node']->links['comment_comments']['title'],
/ q9 d9 L- E- n ~+ n0 Y $vars['node']->links['comment_comments']['href'], ! ?: x' G. L I# O
array('attributes' => array('class' => 'comment','title' => $vars['node']->links['comment_comments']['attributes']['title'] )) + t7 n0 Z& u8 z1 T( h2 N5 w+ `
); 8 ?; c2 P; n' T+ y. ?# e2 Q$ W/ Q" j
?> 所以我们的node.tpl.php就是:0 G4 v6 O8 r7 }. a2 b
<?php
$ t% Y7 r' I0 V- u+ D8 l5 S //link comment
2 K8 Y% D' |2 W7 Y1 q $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 links5 o- Q3 d$ M. R* g0 N! f
$link_read_more = l($vars['node']->links['node_read_more']['title'], $vars['node']->links['node_read_more']['href'],
$ u C3 A6 |/ T# }0 @ j3 H4 zarray('attributes' => array('class' => 'read-more','title' => $vars['node']->links['node_read_more']['attributes']['title'] ))); : v" x. R# j) D: y% P
?> <h1><?php print $title; ?></h1>% s& u* P+ u) C. U
<div class="meta"><?php print $name ." | " . $date . " | " . $link_comment; ?> </div>
& L( ]& g" j) w; C! B <p><?php print $content ?></p>4 F' A0 H1 g+ |( T: u5 X
<div><?php print $link_read_more; ?></div> 虽然实现了我们想要的功能,但是代码看起来很丑陋。如果我们有很多的node.tpl.php(node-blog.tpl.php, node-page.tpl.php, node-news.tpl.php)我们还需要每一个页面都手动修改,这是编程的大忌。4 k6 y* j- p' i A
而template.php可以很好的解决这个问题,你可以把所有的逻辑代码都放到这个文件里,从而保证了node.tpl.php干净。如果没有template.php可以在主题(theme)文件夹下新建这个文件,更多信息请参考http://drupal.org/node/11811) x" C+ ]1 ]+ t5 h- Q( _# ]. p8 ^
<?php
8 N2 m4 P; K' h//----------------------------& e& A+ y3 n- L' i$ H
//file template.php
& z5 K" q% b: Z) [! V//----------------------------2 D) e5 `- v3 K2 \3 U9 Y8 B( c
function THEMENAME_preprocess_node(&$vars) {5 _# D/ o( O8 x5 X5 P' ]
//comments) e9 p- S j3 ]2 [/ o* A( @
if($vars['node']->links['comment_comments']){; P1 z) O6 p1 ~$ K
$vars['link_comment'] = l($vars['node']->links['comment_comments']['title'], $vars['node']->links['comment_comments']['href'], 9 C& o: _9 j* W( `
array(* s0 u; z1 h2 F, G: k+ ?
'attributes' => array('class' => 'comment', 'title' => $vars['node']->links['comment_comments']['attributes']['title']), v2 w" E' j6 n3 a' g+ E2 H
'fragment' => $vars['node']->links['comment_comments']['fragment']
) H2 n" ^! e; L" [1 V8 t; z6 f: T* i )
% t4 K" r- u0 Y );
( }0 R1 _$ K( ~! l1 ~ }
& u4 [8 |+ ]( y) U" \if($vars['node']->links['node_read_more']){
* I/ Y$ D t' I; p$ D $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'] ))); / i) Z v- t& I# y Y
} ?> THEMENAME_preprocess_node是会在node.tpl.php之前运行的函数,类似的还有THEMENAME_preprocess_page、THEMENAME_preprocess_block等等。
& [6 P: s1 c; Wnode.tpl.php不变:
1 g ], t& G6 o9 n8 C<h1><?php print $title; ?></h1>
2 h! _- A2 I9 E( R<div class="meta"><?php print $name ." | " . $date . " | " . $link_comment; ?> </div>
* A* V- z9 N0 W8 m' F<p><?php print $content ?></p>; s# T0 C$ R0 [) s" n
<div><?php print $link_read_more; ?></div> 这样看起来是不是更好一些呢。+ o# e7 K3 t+ X; g! l" M( N3 i8 M R
“转自《开源黄页网》,http://yp.oss.org.cn”。, T3 `1 C3 D0 n. @. q" ?
5 D2 d! P" M: T6 M: A
% V8 X6 v$ D: H2 E; j% R& |; |+ T% O5 h' p, z" k# T P! U' o
6 A0 y5 m' I) X$ `( x2 S0 g) |6 N
5 n! d6 w9 R2 g' g/ K1 c7 E# f, s' S
5 u" J# t9 E8 Q3 j5 q5 v8 n4 ?
|