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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

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

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

GMT+8, 11-11-2025 17:16 , Processed in 0.275023 second(s), 82 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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