2010-06-24 126 views
0

我想重定向陈词后我的状态,我试图用一个钩子,宣布但这是我所得到的:Drupal的:致命错误:不能重新声明> node_form_submit()(以前>在

function node_form_submit(&$form, $form_state) { 
    $form_state['redirect'] = 'contentManager/'; 
} 

Fatal error: Cannot redeclare node_form_submit() (previously declared in drupal/modules/node/node.pages.inc:451) in drupal/sites/all/themes/bluemarine/template.php on line 31

我使用的模块名称“节点”为我钩我想这是错误的,但我不明白为什么

更新: 好吧,我不是开发一个新的模块。我在Bluemarine模板中添加了template.php函数。

function bluemarine_form_alter(&$form, $form_state) { 
    $form_state['redirect'] = 'contentManager/'; 
} 

Bluemarine是我主题的名称..“contentManager”是我在后端创建的一个页面,其中包含所有节点的View。

该功能完全被忽略。

UPDATE2 好了,现在,这是我目前的template.php文件(我敢肯定,phptemplate_node_form调用)

function phptemplate_node_form($form) { 
    $form['#submit'][] = 'myFormSubmit'; 
} 

function myFormSubmit() { 
    echo "hello"; 
    die(); 
} 

,则不会调用该函数myFormSubmit。

谢谢

回答

1

“我使用的模块名称‘节点’我的钩子。我想这是错误的,但我不明白为什么”

你不能这样做,因为节点已经是一个模块,因此,node_函数已经被定义。

要使用钩子,您需要创建自己的模块,命名约定是mymodule_hookname()。

在具有自己的钩子的模块中,Drupal有一个名为module_invoke_all的函数,它在执行期间根据钩子名称调用所有模块上的特定钩子。

您不能将编程转储到template.php中,因为这不是它的目的。这一切都需要在模块中,并且可以通过hook_form_alter轻松实现,更改表单提交以及具有mymodule_form_submit()函数。

+0

所以,我有两个问题:(1)对于每个我想修改的模块,我都应该创建一个新模块。假设我想在3个不同的模块中更改3个小东西,我必须创建3个新模块。它是否正确 ? (2)如果我只想在提交表单后将用户转发到另一个页面,我应该创建一个新模块吗?我通常会对我的template.php文件(例如更改权重,默认折叠)做一些小的更改,但我想更改转发,我应该创建一个新模块? – aneuryzm 2010-06-24 13:18:45

+0

如果您想要做的是更改表单,您可以使用一个hook_form_alter并根据$ form_id提供更改集。它会根据字段名称改变你想要的任何形式,例如你可以限制它包裹在if($ form_id =='node_form')中。 – Kevin 2010-06-24 13:24:11

+0

所以换句话说,我想这个答案问题1,我可以改变不同模块的形式,从1个新的模块,提供不同的$ form_ids。如果我想更改表单转发,我没有其他选项,如果我只能创建一个新模块? – aneuryzm 2010-06-24 13:32:33

2

PHP不允许重复的函数名称。 node_form_submit这实际上不是一个钩子,而是一个表单提交处理程序,它在节点模块中实现。这就是你遇到错误的原因。

所有钩子都应该始终以您的模块/主题名称开头。这样做是为了避免重复函数名称的确切问题。

如果您想要将表单提交处理程序添加到表单中,您需要在表单上使用hook_form_alter并将您的提交处理程序添加到$form['submit']

模块:
当开发一个模块,你需要使用一个module_name.module文件。这是您的代码的核心应该去的地方,以及每个钩子实现。

主题:
当开发一个主题,你应该使用template.php文件的所有预处理功能,主题覆盖,钩实现等

有什么不对:
你说你们俩有一个蓝色海洋模块和主题。如果你真的有两个,你应该重命名他们。

当使用hook_form_alter时,您应该指定$form_id,因此您不会覆盖所有表单。

如果您希望$form_state上的效果能够通过,则需要使用&表示法作为参考来传递它。

更新2:
除非你使用Drupal 7的,你不能在一个主题的template.php文件中使用hook_form_alter。你将不得不创建一个自定义模块来实现任何钩子。

+0

好的,我更新了我的问题。 – aneuryzm 2010-06-24 12:14:41

+0

对不起,我的意思是模板。我根本没有创建一个新模块。我只是想从我的template.php文件中更改我的表单转发。而已。我已经更新了我的问题。 – aneuryzm 2010-06-24 13:04:29

0

你不能在主题中声明hook_form_alter。你必须在模块中做到这一点。请注意声明mymodule_form_alter requires three arguments,您应该在应用更改之前检查$ form_id =='form_name'(否则您将在drupal中更改每个表单)。

如果您不知道要更改的表单的form_id,可以将print_r($ form_id。'');在你的钩子中,它将打印页面中每个表单的form_id。然后可以使用form_id声明a more specific hook,并在其中添加更改。

最后,如果你想要做的是改变提交表单中的重定向,你需要添加一个函数名称$ form ['#submit'](添加,不能替代,见the forms api docs),并在该函数中,它应该在node_form_submit之后运行,将$ form ['#redirect']更改为任何你喜欢的。

+0

好吧我已经更新了我的问题(Update2) – aneuryzm 2010-06-24 13:02:45

相关问题