2010-05-05 57 views
4

新模块'foo'实现了可以定义一个或多个新内容类型的foo_node_info()由同一模块定义的多种内容类型的hook_form

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

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

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

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

回答

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()模块属性不必是相同的实施hook_node_info()模块。定义的每个类型都可以具有唯一的模块属性,用于实现类型特定的钩子。

+0

+1:是的,这是绝对正确的,对于其他内容类型特定的钩子也是如此:例如, 'footypea_access($ op,$ node,$ account)','footypeb_access($ op,$ node,$ account)','footypea_validate($ node,&$ form)','footypeb_validate($ node,&$ form) ($ node)','footypea_insert($ node)','footypea_update($ node)','footypeb_update($ node)','footypea_delete($ node)','footypeb_delete($ node)',等等 – Sk8erPeter 2012-01-04 15:51:22

0

在Drupal中实现钩子时,调用节点类型并不重要,第一部分是创建它们的模块的名称。所以在这里,你的foo模块在foo_form()中实现了hook_form()。顺便说一句,因为它更容易,并且因为它是在Drupal 7中发布的,所以您还应该查看CCK制作内容类型。

相关问题