当 drupal_get_form() 这次被调用时,它取出缓存的表单并把它交给提交处理函数。遵循表单API回调例程,我们的处理函数名为:philosopherbios_theme_form_submit()。
此函数如下:
/** * Form submission callback. */ function philosopherbios_theme_form_submit($form, &$form_state) { // Save our state: variable_set('philosopherbios_theme', TRUE); if ($form_state['values']['choose_theme'] == 0) { // Enable Descartes theme $sql = "UPDATE {system} SET status = 1 " ."WHERE type = 'theme' AND name = 'descartes'"; db_query($sql); // Initialize theme system: system_theme_data(); system_initialize_theme_blocks('descartes'); // Set theme as default variable_set('theme_default', 'descartes'); } // Otherwise, leave it at Garland. }
这个提交处理函数做的第一件事是在数据库中存储一个变量:
variable_set('philosopherbios_theme', TRUE);
此处,我们在数据库中存储一个标记表明我们的状态。存储了这个变量,我们以后可以(在大纲任务函数中)确认表单的确已经被提交了。
这种与状态有关的安装变量,当安装完成时总是应该从数据库中删除。我们稍后做这一工作。
设置了这个状态标记后,我们开始处理表单。
我们让用户可以在两个主题间做选择。在回头看一眼那个表单,两个主题分别是Descartes 和 Garland,每个主题都对应数组中的一个索引:
$form['choose_theme'] = array( '#type' => 'radios', '#title' => st('Default Theme'), '#default_value' => 0, '#options' => array(0 => st('Descartes'), 1 => st('Garland')), '#description' => st('Set the default site theme.'), '#weight' => 0, );
因此当我们取回这一表单时,我们可以检查单选按钮的值是 0 (Descartes) 还是 1 (Garland)。
实际上,准确地说,我们只关心它是否为0。如果用户选择 Garland 主题,我们不需要做任何事,因为 Garland 已经被配置为默认主题了。如果用户选择把Descartes 设置为默认主题的话,却有些工作要做。因此,我们的条件语句结尾是这样的:
if ($form_state['values']['choose_theme'] == 0) { // Enable Descartes theme $sql = "UPDATE {system} SET status = 1 " ."WHERE type = 'theme' AND name = 'descartes'"; db_query($sql); // Initialize theme system: system_theme_data(); system_initialize_theme_blocks('descartes'); // Set theme as default variable_set('theme_default', 'descartes'); }
如果 $form_state['values']['choose_theme'] 为 0,我们有些工作要做。实际上,我们有三项特别任务要完成:
启用这一主题
初始化这一主题
把它设置为默认主题
首先,我们需要启用名为 descartes 的主题。因为没有方便的函数可以完成这一工作,因此我们用 SQL 来完成:
$sql = "UPDATE {system} SET status = 1 " ."WHERE type = 'theme' AND name = 'descartes'"; db_query($sql);
此处,我们修改了 {system} 表。system 表是个很大的存储系统,用于跟踪主题和模块设置。幸运地是,模块代码很少直接操作这个表。不过,此处我们需要直接修改这个表。
基本上,我们需要修改的是名为 descartes 的主题的状态标志。如果状态为0,主题就是不可用的,我们把它设置为 1 启用这个主题。
现在已经启用了主题,我们需要初始化它。
默认情况下,一个主题中没有设置block。不过这不太好。因为管理员无法直接访问主菜单。他们看到的屏幕如下图所示:

图 9-7
注意到了吗?左边的菜单不见了。
通常,Administer | Site building | Themes 页面的主题选择系统处理新主题的初始化工作并添加默认的菜单。不过,此处我们需要在安装程序中进行初始化。
Drupal 让这项工作很容易完成。它有一个内建的函数用于首次设置主题。不过,首先我们需要初始化主题的数据,因为安装程序还没有完成这一步。因此我们调用了两个函数:
system_theme_data(); system_initialize_theme_blocks('descartes');
第一个函数初始化主题数据(基本上就是处理主题的 .info 文件)。第二个函数进行必要的主题初始化工作,包括在左侧区块处添加标准菜单。
完成这两步以后。第三步是把 descartes 设置为默认主题。
Drupal 使用主变量表中的 theme_default 变量确定哪个主题是默认的。正如我们在本章的前面和最后一章中看到的,variable 表中的内容可以用variable_set(), variable_get(), 和 variable_del() 操纵。
把 descartes 设置为默认很容易:
variable_set('theme_default','descartes');
现在我们已经启用了主题并完成了主题的初始化,而且把它设为默认。当用户离开安装程序,看到的第一个画面如下图所示:

图 9-8
但是我们不要一次跳那么远,我们的安装程序还有些工作要做。我们需要返回大纲任务函数 philosopherbios_profile_tasks(),做些收尾的工作。
评论
发表新评论