drupal表单提交处理函数

当 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(),做些收尾的工作。

评论

发表新评论

此内容将保密,不会被其他人看见。
  • 允许HTML标签:<a> <img><em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><p>
  • 自动断行和分段。

更多关於格式化选项的信息

Image CAPTCHA
验证码
|