你可能知道在drupal的模板中(比如node.tpl.php)隐藏了很多信息,比如:0 L$ [$ J* z/ B# L
<div><?php print $links; ?></div> 如果你是个设计人员或者drupal的使用者,你可能不知道$links中都包含了哪些信息,deve模块提供一个函数dsm()可以很轻松的查看$links的详细信息,用法如下:+ f% J4 g3 e% \
<?php dsm('$links'); ?> 这是一个不错的办法,可是虽然知道了$links的信息,如果要修改$links又要怎么做呢?
7 T4 z3 k/ t7 T
) P: t9 ^$ e0 N. f( u# f5 `
. P' Z$ O' E ?
比如有一个文章,后面跟了一些链接($links),包括评论数、全部阅读和阅读次数。如果你想修改链接的格式或样子,只要重写theme_links()这个函数就可以了,但是如果你想改变评论数的位置,比如: a; B9 C' F8 }4 a$ \% {
' Y# r# l6 a, b
1 L& r& B, b5 f
要把评论数的链接放到日期后面然后删除全部阅读的链接,那我们又要怎么做呢?先来看看node.tpl.php的代码:/ C. O! q( v# w, p y
<h1><?php print $title; ?></h1>2 e+ F& f& V. Q; ~; ]
<div class="meta"><?php print $name ." | " . $date; ?> </div>
" }- ^, u6 `4 Z5 f) y. B2 _ <p><?php print $content ?></p>
5 D6 ^6 g# C" F <div><?php print $links; ?></div> 如果要做到我们想要的必须要拆分$links,应该是这样的:( | i: h$ X7 S2 W5 n
<h1><?php print $title; ?></h1>
# r. I/ \) B1 o3 j4 s" r6 q <div class="meta"><?php print $name ." | " . $date . " | " . $number_of_comments; ?></div>
( B5 s2 I( t" o1 j( X <p><?php print $content ?></p>% y2 q4 v# C5 j0 g' `
<div><?php print $read_more; ?></div> //这行代码将被删除,因为需求是删除全部阅读的链接。 但是目前我们还没有$read_more和$number_of_comments变量,所以先看看$links的结构:; v; {7 |, v6 F7 Y5 [8 h9 x
- |8 j& T6 M3 i; l0 h <?php dsm($node->links); ?> 0 L6 E C3 I# Q
) r' f& E* U5 `! _
可以看出comment_comments就是评论数的链接,所以我们直接将comment_comments放到日期的后面
5 U0 r* b+ f7 o0 r& _( Q2 c) P) i, m <h1><?php print $title; ?></h1>- p0 {0 }6 ~+ y' `3 W7 s
<div class="meta"><?php print $name ." | " . $date . " | " . $vars['node']->links['comment_comments']['title']; ?> </div>$ g+ C. p1 s1 V7 q8 Z! C! _; `
<p><?php print $content ?></p> 但是这种写法是错误的,我们需要的是链接,所以就要l()函数。, a. r& J. U5 i6 s: l. r1 W3 G
<?php l(2 [2 M# a) i" p6 @6 u$ n/ `9 e
$vars['node']->links['comment_comments']['title'], * g' W0 [! p; P; l) w& h
$vars['node']->links['comment_comments']['href'],
& @; | w6 i% y+ Y/ m( z array('attributes' => array('class' => 'comment','title' => $vars['node']->links['comment_comments']['attributes']['title'] )) 9 e* a2 f& U. C/ x0 @3 A/ f4 r2 x
);
y' H+ Z9 p* y, p; a ?> 所以我们的node.tpl.php就是:, w3 x# o& O% c& [
<?php ' d: c2 U" l: W$ f7 I, Y
//link comment
) V+ N$ R$ t* e- \0 q+ D $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
' M9 s: K; c, Q: {9 s- C9 x $link_read_more = l($vars['node']->links['node_read_more']['title'], $vars['node']->links['node_read_more']['href'],
, N9 C7 M: p2 Marray('attributes' => array('class' => 'read-more','title' => $vars['node']->links['node_read_more']['attributes']['title'] )));
) d# M0 O3 f! K7 j0 o7 O ?> <h1><?php print $title; ?></h1>
6 C$ r, [ v3 ^/ Z& ] <div class="meta"><?php print $name ." | " . $date . " | " . $link_comment; ?> </div>
) p2 U% p t; Z; J( P8 c' S <p><?php print $content ?></p>
5 k, v: p4 M* v# M <div><?php print $link_read_more; ?></div> 虽然实现了我们想要的功能,但是代码看起来很丑陋。如果我们有很多的node.tpl.php(node-blog.tpl.php, node-page.tpl.php, node-news.tpl.php)我们还需要每一个页面都手动修改,这是编程的大忌。 o8 y6 r N/ E
而template.php可以很好的解决这个问题,你可以把所有的逻辑代码都放到这个文件里,从而保证了node.tpl.php干净。如果没有template.php可以在主题(theme)文件夹下新建这个文件,更多信息请参考http://drupal.org/node/118117 ?! n; H W7 g6 [4 V$ v
<?php
3 z4 T8 l) v5 Y c# d& N; {" P1 m//----------------------------
9 K( X# y9 s' ^4 U7 P, E+ M//file template.php
, P9 |: }0 A: n+ F: \//----------------------------
) f: W- N) f) {& yfunction THEMENAME_preprocess_node(&$vars) {
- d2 a* d/ N2 F0 c/ z //comments4 B* p' n3 n: t8 X9 G. A
if($vars['node']->links['comment_comments']){
" Y" ]9 c6 F" u! f* L1 b/ q $vars['link_comment'] = l($vars['node']->links['comment_comments']['title'], $vars['node']->links['comment_comments']['href'],
$ j9 J+ q, M4 l array(
3 G; F/ b5 l4 K9 ?$ s 'attributes' => array('class' => 'comment', 'title' => $vars['node']->links['comment_comments']['attributes']['title']),0 y; V- V8 i& ]3 Q# k, g4 d/ L
'fragment' => $vars['node']->links['comment_comments']['fragment']
0 N2 t5 | y" h C )
+ A! }8 r9 q% P! ?2 O' c% t );
4 o# m) d5 Q2 ^! {$ X7 h3 [ }
+ O# M( w1 Z8 |/ E) j0 C0 ^if($vars['node']->links['node_read_more']){
6 h+ C' { |' U4 K) p $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'] ))); 1 q% a1 s# O% s5 E# [% ?
} ?> THEMENAME_preprocess_node是会在node.tpl.php之前运行的函数,类似的还有THEMENAME_preprocess_page、THEMENAME_preprocess_block等等。1 `0 f6 i m9 G" w! A' R9 B5 Z: i& i
node.tpl.php不变:
U0 B0 `9 C9 M+ l4 d+ [# U<h1><?php print $title; ?></h1>
! o* { }2 @9 c6 _* O<div class="meta"><?php print $name ." | " . $date . " | " . $link_comment; ?> </div>
' ]0 V/ [) a0 ?; N7 m<p><?php print $content ?></p>
) s3 w( }8 |4 s; P# L; {( w7 R+ p B<div><?php print $link_read_more; ?></div> 这样看起来是不是更好一些呢。+ K: x+ R; {/ E2 N( ~! ~6 m1 t
“转自《开源黄页网》,http://yp.oss.org.cn”。
( _# T) k! ^2 Y {# x6 L. d
( u8 C1 t# E6 K4 u3 L0 K
( _4 q% d. Y$ X4 e2 I5 n! @; J& a
7 z) I% a G: w; S0 e0 _
' e ]; `" d: c3 O* R
' J. a9 j7 c2 I. I* P% h `0 ]
" f. X* W, w b9 c! l1 L+ R6 H% i- Y# D1 S. G8 E8 f! S
|