理解drupal主题的工作机制(template文件,主题函数)

最近一直在折腾drupal,积累了一些经验,有空了将在此与大家分享一下。今天先说下drupal的主题模版工作机制。
drupal主题的核心文件是theme.inc,位于includes下面,通过研读这个文件里的代码和官方的文档,我算是大致明白了drupal生成HTML的流程。主要由主题函数(theme function),主题模版文件(template files)和drupal_render来完成。

进入任何一个主题根目录,可以在templates目录下找到常见的主题模版文件,如html.tpl.php,page.tpl.php,node.tple.php,commet.tpl.php,field.tpl.php等等。这些主题模版文件主要为HTML代码,但也夹杂一部分PHP代码,几乎都是实现简单的判断和HTML代码输出,按照drupal的规范,稍复杂一点代码都应该在其它地方完成。

   <?php if ($logo): ?>
      <a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>" rel="home" id="logo">
        <img src="<?php print $logo; ?>" alt="<?php print t('Home'); ?>" />
      </a>
    <?php endif; ?>

这些主题模版文件对于初接触的drupal的人来说还是有点费解。就本人来说,我接触drupal时已经有了一定的PHP基础,虽然能看懂各种IF判断加内容输出,但你要问我这里面的变量是怎么来的,我会是一脸茫然。

其实上面说到的这些模版文件都是由相应的主题钩子(theme hooks)定义的,一些主要的主题模版文件的变量,如html.tpl.php, page.tpl.php,都是在theme.inc里生成的,其中page.tpl.php中的变量最原始的出处是在template_preprocess_page这个函数里,然后经过各种预处理函数一层层传到page.tpl.php里面,而这个传递过程为我们的定制drupal的主题提供了很大的灵活性和空间,我们可以通过在模块和主题中利用drupal的模版预处理钩子(template_preprocess,template_process,template_preprocess_hook等)来改变或增加变量。

$variables['base_path']         = base_path();
  $variables['front_page']        = url();
  $variables['feed_icons']        = drupal_get_feeds();
  $variables['language']          = $GLOBALS['language'];
  $variables['language']->dir     = $GLOBALS['language']->direction ? 'rtl' : 'ltr';
  $variables['logo']              = theme_get_setting('logo');

上面的代码是template_preprocess_page函数里的,其中$variables['front_page']就是page.tpl.php中的$front_page,如果你要修改这个变量,你只需在你的drupal主题中定义一个page预处理钩子,如mytheme_preprocess_page(&$variables).最关键的部分是前面的引用传递符号,在这个函数里面对variable所做的修改都会影响最初的值,或者最终的值。

添加新评论

个人信息
此内容将保密,不会被其他人看见。
评论内容

Filter HTML

  • 允许的HTML标签:<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • 自动断行和分段。
  • 自动将网址与电子邮件地址转变为链接。

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
提交该页面即表示您接受Mollon的隐私政策