hook_form用于由同一模块定义的多种内容类型

时间:2010-05-05 18:27:27

标签: drupal

新模块'foo'实现foo_node_info(),其中可以定义一个或多个新内容类型。

如果foo_node_info()定义了两种内容类型,即内容类型“footypea”和内容类型“footypeb”,那么如何实现hook_form()(“钩子”的名称应该是什么?是?)配置每个节点的编辑表单?

drupal example中,新内容类型的名称与模块名称相同。在上述示例中会发生什么,其中模块定义了两种新的内容类型?

实现的hook_form()函数应该是以下形式:footypea_form()和footypeb_form()? (这似乎不起作用)

或者你应该实现一个foo_form()函数,并在其中创建并返回一个数组$ form,其元素为$ form ['footypea']和$ form ['footypeb'],这些元素又是各个表单字段的数组定义

2 个答案:

答案 0 :(得分:3)

在模块的hook_node_info()中,添加'module'属性(参见http://api.drupal.org/api/function/hook_node_info/6)。

例如:

/**
 * Implementation of hook_node_info().
 */
function foo_node_info() {
  return array(
    'footypea' => array(
      'name' => t('Foo Type A'),
      'description' => t('This is Foo Type A'),
      'module' => 'footypea',  //This will be used for hook_form()
    ),
    'footypeb' => array(
      'name' => t('Foo Type B'),
      'description' => t('This is Foo Type B'),
      'module' => 'footypeb',  //This will be used for hook_form()
    ),
  );
}

现在,您可以为每种类型添加以下hook_form()实现(请参阅http://api.drupal.org/api/function/hook_form/6)。

/**
 * Implementation of hook_form().
 */
function footypea_form(&$node, $form_state) {
  // Define the form for Foo Type A
}

/**
 * Implementation of hook_form().
 */
function footypeb_form(&$node, $form_state) {
  // Define the form for Foo Type B
}

这里的技巧是hook_node_info()中每个元素的module属性不必与实现hook_node_info()的模块相同。定义的每个类型都可以具有唯一的模块属性,用于实现特定于类型的挂钩。

答案 1 :(得分:0)

调用节点类型无关紧要,在Drupal中实现挂钩时,第一部分是创建它们的模块的名称。所以在这里,你的foo模块在foo_form()中实现了hook_form()。

顺便说一下,因为它更容易,因为它是在Drupal 7中出现的,所以你也应该查看CCK来制作内容类型。