首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在模块子目录中无法通过module_hook_info找到表单钩子

在模块子目录中无法通过module_hook_info找到表单钩子
EN

Drupal用户
提问于 2015-12-18 11:18:42
回答 1查看 43关注 0票数 1

上下文:在我的Drupal 7项目中,我有一个带有几个子模块的模块。由于模块的根目录变得拥挤,我将子模块文件移到根目录中的自己的目录中。

我的模块结构如下:

代码语言:javascript
运行
复制
mymodule
├── mymodule.info
├── mymodule.module
├── mymodule1
│   ├── mymodule1.block.inc
│   ├── mymodule1.form.inc
│   ├── mymodule1.info
│   ├── mymodule1.module
│   ├── mymodule1.page.inc
│   └── pages
│       └── foo.tpl.php
└── mymodule2
    ├── classes
    │   └── foo
    │       └── Bar.php
    ├── mymodule2.form.inc
    ├── mymodule2.info
    ├── mymodule2.install
    ├── mymodule2.module
    ├── mymodule2.page.inc
    └── pages
        ├── foo.tpl.php
        └── bar.tpl.php

在“大移动”之前,现在位于子目录mymodule1mymodule2中的文件位于它们的父目录(模块的根目录)中。

问题是:自从移动文件以来,我的自定义表单就不再加载了。我在mymodule1.form.inc中有一个表单,它以前可以很好地加载和呈现。现在,当我使用drupal_get_form()加载表单时,我只得到一个包含隐藏构建ID输入的空表单。

请记住,这里唯一改变的是.inc文件已与模块文件一起移到子目录中。此外,drupal_get_path('module', 'mymodule1')返回子目录中模块的正确路径。

奇怪的是,在mymodule1.block.inc中也有块钩子,即使在清除所有缓存之后,它们也能很好地工作。

这是我第一次在模块中处理每个子模块的单独目录。我从模块i18n中得到了灵感,它使用相同的结构。我在Drupal文档和i18n代码中进行了搜索,但找不到出错的地方。

是否有人知道我可能在哪里出错,或者我是否需要将数据添加到mymodule1.modulemymodule1.info以使其工作?谢谢。

一些细节:缓存已多次通过<path to project>/admin_menu/flush-cache清除。

我使用module1_hook_info()将块和窗体的钩子定向到单独的文件。这是返回值:

代码语言:javascript
运行
复制
array (size=9)
  'block_info' => 
    array (size=1)
      'group' => string 'block' (length=5)
  'block_configure' => 
    array (size=1)
      'group' => string 'block' (length=5)
  'block_save' => 
    array (size=1)
      'group' => string 'block' (length=5)
  'block_view' => 
    array (size=1)
      'group' => string 'block' (length=5)
  'forms' => 
    array (size=1)
      'group' => string 'form' (length=4)
  'form' => 
    array (size=1)
      'group' => string 'form' (length=4)
  'form_validate' => 
    array (size=1)
      'group' => string 'form' (length=4)
  'form_submit' => 
    array (size=1)
      'group' => string 'form' (length=4)
  'form_alter' => 
    array (size=1)
      'group' => string 'form' (length=4)

我的表单函数称为:

  • mymodule1_foobar_form
  • mymodule1_foobar_form_validate
  • mymodule1_foobar_form_submit
EN

回答 1

Drupal用户

发布于 2015-12-18 11:49:12

我要尝试一下这里发生的事,我可能错了。

hook_form()不是一个普通的钩子,它只对定义节点类型的模块调用(您还没有指定任何一个节点类型)。当您任意调用drupal_get_form()时,不会调用它。hook_form_validate()hook_form_submit()也是如此。

不过,hook_hook_info()实现中的一些钩子是为所有模块调用的。例如hook_forms()hook_form_alter()

我猜想mymodule包含了hook_form_alter()hook_forms()的实现,这是碰巧在同一个页面(S)上调用的,因为您现在移动到mymodule1中的表单是显示出来的。这些钩子被隐式调用将导致包含mymodule.form.inc,并且函数是可用的。

现在您已经将代码移到mymodule1中了,我猜您还没有实现可能导致这种巧合行为的任何一个钩子。因此,Drupal现在无法找到您的表单函数,并且无声地失败。

若要修复,请手动包含该文件:

代码语言:javascript
运行
复制
module_include('inc', 'mymodule1', 'mymodule1.form');
票数 0
EN
页面原文内容由Drupal提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://drupal.stackexchange.com/questions/184370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档