【问题标题】:Drupal: Fatal error: Cannot redeclare > node_form_submit() (previously > declared inDrupal:致命错误:无法重新声明 > node_form_submit() (以前 > 在
【发布时间】:2023-03-26 11:35:01
【问题描述】:

我想在提交后重定向我的表单,我正在尝试使用钩子,但这就是我得到的:

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

致命错误:无法重新声明 node_form_submit() (以前 宣布于 drupal/modules/node/node.pages.inc:451) 在 drupal/sites/all/themes/bluemarine/template.php 第 31 行

我正在为我的钩子使用模块名称“node”。我想这是错误的,但我不明白为什么

更新: 好的,我不是在开发新模块。我已将该函数添加到 Bluemarine 模板中的 template.php。

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

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

这个函数完全被忽略了。

更新2 好的,现在,这是我当前的 template.php 文件(我确定调用了 phptemplate_node_form)

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

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

函数 myFormSubmit 未被调用。

谢谢

【问题讨论】:

    标签: drupal drupal-6


    【解决方案1】:

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

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

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

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

    主题:
    开发主题时,您应该使用 template.php 文件来处理所有预处理函数、主题覆盖、挂钩实现等。

    怎么了:
    你说你们都有一个 bluemarine 模块和主题。如果你真的两者都有,你应该重命名它们。

    使用hook_form_alter 时,应指定$form_id,这样就不会覆盖所有表单。

    如果您希望对$form_state 产生影响,您需要使用& 表示法通过引用传递它。

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

    【讨论】:

    • 对不起,我的意思是模板。我根本没有创建一个新模块。我只想从我的 template.php 文件中更改我的表单转发。就是这样。我已经更新了我的问题。
    【解决方案2】:

    “我使用模块名称“node”作为我的钩子。我猜这是错误的,但我不明白为什么”

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

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

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

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

    【讨论】:

    • 所以,我有两个问题:(1)对于我要修改的每个模块,我应该创建一个新模块。假设我想在 3 个不同的模块中更改 3 个小东西,我必须创建 3 个新模块。它是否正确 ? (2) 如果我只想在表单提交后将用户转发到另一个页面,我应该创建一个新模块吗?我通常会从我的 template.php 文件中对表单进行一些小的更改(例如更改权重、默认折叠),但我想更改转发,我应该创建一个新模块?
    • 如果您想要更改表单,您可以使用一个 hook_form_alter 并根据 $form_id 提供一组更改。它将根据字段名称更改您想要的任何形式,例如,您可以将其限制在 if($form_id == 'node_form') 中。
    • 所以换句话说,我猜这个答案问题1,我可以改变不同模块的形式,从1个新模块,提供不同的$form_ids。如果我想更改表单转发我没有其他选择,如果我只能创建一个新模块?
    • 是的。像这样的东西需要进入一个模块。这将有助于drupal.org/node/204270
    【解决方案3】:

    您不能在主题中声明 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'] 更改为您喜欢的任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2010-12-29
      • 2015-08-29
      • 2012-06-18
      相关资源
      最近更新 更多