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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

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

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

GMT+8, 2-15-2025 04:55 , Processed in 0.298933 second(s), 79 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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