drupal 一个基本的 profile 任务

当 Drupal 的安装程序到达 profile 任务时(运行完 configure 任务以后),它尝试执行 <profilename>_profile_tasks() 函数,传递给它两个参数:一个任务名称的引用 (&$task), 以及安装程序当前的 URL ($url)。$task 变量的初始值总是设置为 profile。

如果安装大纲不需要用户提供额外的信息,那么它可以直接进行安装并返回,不需要使用 $task 和 $url 变量。在这种情况下,我们的philosopherbios_profile_task() 函数结构类似下面这样:
 

philosopherbios_profile_task(&$task, $url) {
  variable_set('my_variable', 'my_value');
}

在这个例子中,这个函数只是在数据库中添加了一个新变量——也许某个模块或着其它地方要用到它。

 

上面的函数有个问题——这个问题可能会引起困惑。Drupal 的默认安装大纲用default_profile_task() 函数创建了一些内容类型(page和story),对节点进行默认初始化,并对节点内容的显示方式进行了几处调整。

如果我们在此处不包含那个函数,我们就会失去几个预料中的内容类型。我们该怎么办呢?

一个解决方法是从 default_profile_task() 中拷贝代码并粘贴到我们的定制函数中。这种做法很丑陋,不是Drupal的做法,而且还会导致维护梦魇。每当Drupal 代码更新的时候,大纲的维护者都不得不检查默认大纲看看我们的定制大纲中有没有需要更新的地方。

我建议采用另一种做法,虽然也不算是 Drupal 化的方法,但比较容易维护,而且可以避免不必要的代码复制。

在大纲文件的开头,我们有这样一行:
 

require_once('profiles/default/default.profile');

通过导入默认大纲,我们现在可以在自己的代码中使用那个文件中定义的default_profile_task() 函数。现在对我们原来的代码进行改写,改写后的代码如下:
 

philosopherbios_profile_task(&$task, $url) {
  default_profile_task();
  variable_set('my_variable', 'my_value');
}

现在我们设定了自己的变量,并让默认大纲处理默认的设置。

 

加入对 default_profile_task() 函数的调用是很重要的。因为它改变了节点和主题系统的行为,如果你想改变节点的默认行为或者使用page和story内容类型,就必须先执行这个函数。

这对所有的 *_profile_task() 函数都管用吗?比如,我能不能使用其它安装大纲中的 profile 任务呢?

只有非常小心才可以。前面的例子能工作的原因是 default_profile_task() 本身是个简单任务。与我们创建的那个任务一样,它不需要额外的与用户的交互。或者更精确地说,它只执行了一项任务。

但是稍后我们将看到,profile 任务可以用来构造系列事件的复杂的多任务。在那种情况下,profile 任务返回的结果可能需要安装程序的附加处理过程——我们无法简单地提供或预测的处理过程。

要点是什么呢?使用 default_profile_task() 就 OK 了。使用另一个 profile 任务可能会导致无法预料的结果。使用 profile 任务之前最好了解它的代码。

注释:default_profile_task() 的行为会不会突然变得很复杂,弄糟我们的代码呢?Drupal 6 是不会的,Drupal 7 也许也不会。大的更改一般会放在 install.php 中。

我们创建的 profile 任务是很基本的,只是告诉安装程序一些基本的操作。但实际上没什么用处。

让我们创建一个更复杂的 profile 任务——这个任务为我们的 phiosopherbios 安装大纲做些有用的事。

评论

发表新评论

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

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

Image CAPTCHA
验证码
|