你可能知道在drupal的模板中(比如node.tpl.php)隐藏了很多信息,比如:& I. p" X r) \9 N; j l) I9 v
<div><?php print $links; ?></div> 如果你是个设计人员或者drupal的使用者,你可能不知道$links中都包含了哪些信息,deve模块提供一个函数dsm()可以很轻松的查看$links的详细信息,用法如下:
/ l, Z# I# b# u! e7 V# z8 i: |6 S <?php dsm('$links'); ?> 这是一个不错的办法,可是虽然知道了$links的信息,如果要修改$links又要怎么做呢?" G+ ?+ A$ }: L9 K- A
! ?& m5 W5 j& M3 h
$ f5 q8 ]# L2 E/ G$ a* o
比如有一个文章,后面跟了一些链接($links),包括评论数、全部阅读和阅读次数。如果你想修改链接的格式或样子,只要重写theme_links()这个函数就可以了,但是如果你想改变评论数的位置,比如:
# N" D" w% p. a. |
2 [% W* N/ R6 K5 y9 _. t0 L+ X( C6 _/ } 4 m* @1 T' Z: ]& V
要把评论数的链接放到日期后面然后删除全部阅读的链接,那我们又要怎么做呢?先来看看node.tpl.php的代码:
) c9 ^! j% J3 @ P% y <h1><?php print $title; ?></h1>- y' n$ q+ W9 h, H
<div class="meta"><?php print $name ." | " . $date; ?> </div>
' E, i6 y/ u/ n0 U4 h1 t |2 o4 ^ <p><?php print $content ?></p>
. [5 }' P I7 z8 l% \5 W <div><?php print $links; ?></div> 如果要做到我们想要的必须要拆分$links,应该是这样的:
0 G. \7 H* R' ]* ~ Z2 b+ u7 w, B <h1><?php print $title; ?></h1>* x5 C- h) M) v( y2 P# S
<div class="meta"><?php print $name ." | " . $date . " | " . $number_of_comments; ?></div>
, P4 {7 `( w& W2 q% z <p><?php print $content ?></p>
' M# g( a: j, k; a <div><?php print $read_more; ?></div> //这行代码将被删除,因为需求是删除全部阅读的链接。 但是目前我们还没有$read_more和$number_of_comments变量,所以先看看$links的结构:
5 [' I7 k n% O. X: |3 @4 S. C# d$ H0 A( L* p2 U
<?php dsm($node->links); ?> 7 }0 @2 m2 l6 O# |3 E2 } f$ y
6 X" }* U9 g, H0 W6 C 可以看出comment_comments就是评论数的链接,所以我们直接将comment_comments放到日期的后面
' z8 L+ e; m: u <h1><?php print $title; ?></h1>) ^! r* ^: J: ^. B
<div class="meta"><?php print $name ." | " . $date . " | " . $vars['node']->links['comment_comments']['title']; ?> </div>
' N d. x8 e( W3 [ <p><?php print $content ?></p> 但是这种写法是错误的,我们需要的是链接,所以就要l()函数。
5 J2 n7 I+ R6 f9 u <?php l(! L, K5 u/ c$ g, G; [
$vars['node']->links['comment_comments']['title'],
& |1 g4 B) V4 x% q3 ]6 T $vars['node']->links['comment_comments']['href'],
* G- j5 W _/ a. ^ array('attributes' => array('class' => 'comment','title' => $vars['node']->links['comment_comments']['attributes']['title'] ))
3 q: N$ Y2 g: v# I9 H a0 }1 ` ); 3 J# Y' l6 f5 U6 e# v$ j% Z
?> 所以我们的node.tpl.php就是:
+ O- k5 N: h3 K- b2 Y <?php 3 p* E6 F4 S. i# z3 `1 W' G
//link comment. x- h! P% B# ^( C5 @; N8 m z
$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 links6 {- R7 t/ V# t! ^4 q
$link_read_more = l($vars['node']->links['node_read_more']['title'], $vars['node']->links['node_read_more']['href'], 1 G. j4 A9 \2 F' ~! v
array('attributes' => array('class' => 'read-more','title' => $vars['node']->links['node_read_more']['attributes']['title'] )));
1 P. m7 j1 q0 B2 {, r ?> <h1><?php print $title; ?></h1>. h6 r' v. V4 h2 E7 d7 F* u1 s# r/ T/ {3 W
<div class="meta"><?php print $name ." | " . $date . " | " . $link_comment; ?> </div>
6 k& E9 E, d/ z9 [' u8 w! v <p><?php print $content ?></p>
! O) L2 W c4 G- i e+ k6 G <div><?php print $link_read_more; ?></div> 虽然实现了我们想要的功能,但是代码看起来很丑陋。如果我们有很多的node.tpl.php(node-blog.tpl.php, node-page.tpl.php, node-news.tpl.php)我们还需要每一个页面都手动修改,这是编程的大忌。
* @9 Y, v( z: f+ |- v( ]而template.php可以很好的解决这个问题,你可以把所有的逻辑代码都放到这个文件里,从而保证了node.tpl.php干净。如果没有template.php可以在主题(theme)文件夹下新建这个文件,更多信息请参考http://drupal.org/node/11811
6 a+ t. e! g- M2 d3 B7 w<?php
& P( @* V. V" P4 l! P//----------------------------& N( ~! n' Q' C% j* o0 Z: {' _1 D
//file template.php! K" g. I" k& m4 T6 Q
//----------------------------+ s; t) a; Q/ r3 {
function THEMENAME_preprocess_node(&$vars) {
t( ]% k, |- f //comments, m# P3 e. m" m
if($vars['node']->links['comment_comments']){- v0 l4 F6 b8 I$ B" q2 q1 B, i4 k
$vars['link_comment'] = l($vars['node']->links['comment_comments']['title'], $vars['node']->links['comment_comments']['href'], , a7 f: M# {) x* K3 X
array(
2 x* L) {/ ?" Q) H0 l. T* [ 'attributes' => array('class' => 'comment', 'title' => $vars['node']->links['comment_comments']['attributes']['title']),
6 n9 P3 [5 k+ _. S3 R% u |* [( ^ 'fragment' => $vars['node']->links['comment_comments']['fragment']
, v: w8 ?: S6 ^! Q: l E! _ )
+ ]) o5 t9 o2 X+ t ); 7 V" d! |, R0 f! p
}
, D0 D/ ^ w# I& ~, Z( Aif($vars['node']->links['node_read_more']){
8 ^" h" n" H% ~1 {: R; Z* ` $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'] )));
E! i d! s( J* Z7 p } ?> THEMENAME_preprocess_node是会在node.tpl.php之前运行的函数,类似的还有THEMENAME_preprocess_page、THEMENAME_preprocess_block等等。
9 J* h9 Z) w3 S3 }node.tpl.php不变:
: n; U1 q; ^7 d8 M5 \<h1><?php print $title; ?></h1># @0 X& s# b; \$ w' {, a
<div class="meta"><?php print $name ." | " . $date . " | " . $link_comment; ?> </div>
9 {7 C+ U. P; L- I9 P, b<p><?php print $content ?></p>
0 ]& s2 p- y- }% e$ w# s<div><?php print $link_read_more; ?></div> 这样看起来是不是更好一些呢。
; W7 R, f1 F m2 w& N“转自《开源黄页网》,http://yp.oss.org.cn”。3 Z# }" E- z" l1 M
. U/ l. x* @ N. A0 g" H/ s5 B9 k8 K1 x
6 z& M8 ]/ c% d, r# J% _0 P
2 k# K3 s+ A9 w; E |6 h1 Z
7 b6 n/ I2 J3 ?! i! w& s( W$ O) A) M V3 T7 y( O
. n% ^7 L0 I4 I$ _# ?: y
|