老葛的Drupal培训班 Think in Drupal
你需要清除主题注册表的缓存,这样Drupal就能找到你的主题钩子了。清除缓存有多种方式,一种是使用devel.module,还有一种是简单的访问“管理➤站点构建 ➤模块”页面。现在你的笑话输入和查看系统,应该可以完整工作了。继续前进,输入一些笑话来测试一下。现在你应该可以看到你的笑话了,它看起来外观有点朴素,如图7-4和7-5所示:

图7-4 笑话节点的简单主题

图 7-5.节点以摘要形式显示时,没有添加笑话妙语
尽管这也可以工作,但还存在一个更好的方式,让用户可以在查看完整节点页面时能够立即看到笑话妙语。我们想要的是,使用一个可伸缩的字段集,当用户点击时再展示笑话妙语。在Drupa中,可伸缩字段集的功能已经存在了,所以你只需要使用现有的就可以了,而不需要创建你自己的Javascript文件了。把这个交互放到你站点主题的模板文件中,比放到主题函数中更好一些,因为它依赖于标识字体和CSS类。你的设计者很乐意看到你这样做,因为如果要修改笑话节点的外观的话,只需要简单的编辑模板文件就可以了。
你需要创建一个名为node-joke.tpl.php的模板文件,并将其放到你当前使用的主题的目录下面,下面是该文件中的内容。如果你使用的主题为bluemarine,那么node-joke.tpl.php将被放到themes/bluemarine下面。由于我们将会使用一个模板文件,那么就不再需要实现钩子hook_theme()和函数theme_joke_punchline()了,所以我们就可以把它们注释掉了。记住,要像前面所讲的一样,再次清除主题注册表缓存,这样Drupal就不再查找函数theme_joke_punchline()了。由于模板文件将负责笑话妙语的输出,所以在joke_view()中,我们还可以将笑话妙语指定到$node->content中的那段代码注释掉(否则,笑话妙语会被显示两次)。
注意:访问“管理➤站点构建 ➤模块”页面以后(将会自动重构主题注册表),主题系统将会自动发现node-joke.tpl.php,Drupal将使用该模板文件来修改笑话的外观,而不是默认的节点模板文件node.tpl.php。更多关于主题系统方面的知识,请参看第8章。
<div class="node<?php if ($sticky) { print " sticky"; } ?>
<?php if (!$status) { print " node-unpublished"; } ?>">
<?php if ($picture) {
print $picture;
}?>
<?php if ($page == 0) { ?><h2 class="title"><a href="<?php
print $node_url?>"><?php print $title?></a></h2><?php }; ?>
<span class="submitted"><?php print $submitted?></span>
<span class="taxonomy"><?php print $terms?></span>
<div class="content">
<?php print $content?>
<fieldset class="collapsible collapsed">
<legend>Punchline</legend>
<div class="form-item">
<label><?php if (isset($node->punchline)) print check_markup($node->punchline)?></label>
<label><?php if (isset($node->guffaw)) print $node->guffaw?></label>
</div>
</legend>
</fieldset>
</div>
<?php if ($links) { ?><div class="links">» <?php print $links?></div>
<?php }; ?>
</div>
Drupal将会自动地包含进来启用可伸缩功能的JavaScript文件。misc/collapsible.js中的JavaScript将为字段集查找可伸缩的CSS选择器,并且在找到以后知道如何处理它,如图7-6所示。这样,在node-joke.tpl.php中它将找到下面代码并激活它自己:
<fieldset class="collapsible collapsed">
这就可以得到我们想要的笑话交互体验了:

图7-6 使用Drupal内置的可伸缩CSS支持,来隐藏笑话妙语
评论
<fieldset class="collapsible
<fieldset class="collapsible collapsed">
而且经过实际操作后发现在D6中是不会自动载入collaps
而且经过实际操作后发现在D6中是不会自动载入collapsible.js档案。因此我们需要在joke_load()下,更改为:
function joke_load($node) {
drupal_add_js('misc/collapse.js');
return db_fetch_object(db_query('SELECT punchline FROM {joke} WHERE vid = %d',$node->vid));
}
如此fieldset才会起作用。
</legend> 这个是不是多出来的???这个是
</legend> 这个是不是多出来的???
这个是 多出来的,笔误。
Drupal将会自动地包含进来启用可伸缩功能的JavaScript文件。这个我不确定,或许Drupal在某些主题下能够自动加载对应的js文件,或许在别的主题下不能加载。
Drupal本身提供了一些默认的JS文件,默认的CSS文件,这些对于初学者来说很不友好,比较好的办法就是明确的对所有的文件进行声明,对需要加载的文件进行明确的声明。 drupal_add_js('misc/collapse.js');
就是这样的。这是推荐的做法。
官方勘误:
官方勘误:http://www.drupalbook.com/errata2?page=3 Page 154