国外设计欣赏网站 - DOOOOR.com

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

[Drupal问题] Drupal:关于template.php的分析

[复制链接]
发表于 2-6-2012 21:09 | 显示全部楼层 |阅读模式
你可能知道在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

|2011-2026-版权声明|平台(网站)公约|DOOOOR 设计网 ( 吉ICP备2022003869号 )

GMT+8, 6-16-2025 01:20 , Processed in 0.619200 second(s), 83 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表