跳转到主要内容

4.5 Page和region模版文件

http://www.drupaltutorials.de/2013/07/03/drupal-themes-teil-6/

现在你已经认识html.tpl.php文件了。但是在模板文件夹中还有很多其它的文件。我们将在这一节和下一节中详细讲述。只要你掌握了模板的规则并认识各种模板文件,你就可以非常轻易的套用模板,甚至可以自己从零开发一套主题。在这一节中我将重点讲述page.tpl.php和region.tpl.php。这两个文件都是非常重要的。

Page.tpl.php是最重要的模板文件之一。在前一节的学习中,你已经从genesis基主题拷贝了它的templates 文件夹到你新建的子主题文件夹中。因此你可以在自己的主题文件夹的templates 文件夹中找到这个文件。

Page.tpl.php文件中的内容会通过html.tpl.php文件中的$page变量渲染出来。

仔细的研究page.tpl.php对于初学者学习主题是非常有必要的。首先来看看这个文件的第一段:

在这里你会发现,Drupal模板文件中经常会出现的一个语法元素,也就是这段中的IF语句。它的意思是在判断$secondary_menu_links变量是否存在,换句话说,是在判断是否为页面设置了二级菜单。如果存在二级菜单,前端页面代码中才会出现相应的用来显示二级菜单的内容。每一个在模板文件中出现的元素都有着自己的ID或者Class(类)名,正因为如此才使得他们可以用css文件定义样式及外观。

Page.tpl.php.文件中接下来的语句是这样的:

你们会发现类似的很多情况都是用IF语句判断的。比如这里就是否在后台设置了页面logo、标题、广告语进行了判断。

如果在后台的主题设置界面中你没有指定Logo图片,并且也没有选择使用默认的Logo,那么在前端页面中不会显示出相应的Logo。相对应的语句请读者自己多读两遍,其判断逻辑是非常简单,一看就会的。下面我们只对一些稍微复杂的细节进行分析。

这条语句和运算符有关。意思是:当后台设置了$site_logo或者$site_name或者$site_slogan的时候,执行如下语句。

接下来你会看到很多和区域有关的语句,其中第三行的代码输出的内容即是3.4节中我们提到的Content区块。

在这段代码中你又可以看到很多IF语句。下面是其中的一部分列子:

IF语句判断sidebar_first区域是否被分配了内容(也就是区块)。如果有内容,则向前端页面代码流中写入语句中间的<div>内容。

我的经验是,在讲解区域的时候最好是引用一个例子。所以,请打开你的psdtutorials.info文件。

你需要注意的是info文件中用来设置区域的代码。并在这段代码中插入一行如下高亮代码。

regions[secondary_content]  = Secondary

regions[tertiary_content]   = Tertiary

regions[psd]             = Eine PSD-Region

regions[footer]             = Footer

regions[help]               = Help

regions[page_top]           = Page top

regions[page_bottom]        = Page bottom

保存你做的修改,并在page.tpl.php文件的相应位置插入如下高亮代码:

保存后请清空你的缓存。

进入区块管理页面,你可以看到在区域的下拉选框中出现了一个新的区域:Eine PSD-Region。

这个新建的区域和其他原有的区域一样,都可以在其中放入区块。保存之后,就可以看到网页的变化了。

最后你可以在前台通过Firebug看到页面代码中出现了应有的段落,如下:

<div id="psd" class="psd_region">

  <div class="region region-psd">

  ...

  </div>

</div>

通过上述的方式你可以根据自己的需求定义主题中的区域。负责渲染区域的模板文件是region.tpl.php文件。首先你应该确认在你自己创建的主题中是否有这个文件。在Genesis主题中就没有这个文件。Drupal主题系统是直接使用了modules/system路径下的同名文件来进行区域的渲染。可以想象得到的是,在这个文件中,代码非常的少。

<?php if ($content): ?>

  <div class="<?php print $classes; ?>">

    <?php print $content; ?>

  </div>

<?php endif; ?>

这段代码中最重要的是变量$content,因为Drupal主题系统就是通过这个变量在前端页面上渲染每一个区域的。你可以查看region.tpl.php文件中的注释部分来查看有哪些变量是可以使用的,同时你可以在https://api.drupal.org/api/drupal/modules%21system%21region.tpl.php/7页面上找到同样的说明(link is external)。比如如果访问者在网站上登录了,那么$logged_in变量将会返回true。

同样的,如果你想覆写region.tpl.php 这个模板文件,你依然需要将他拷贝到你自己的主题的templates文件夹中。

这样的话,你对这个文件进行的改动只有在这个主题下才会生效。