上下文:在我的Drupal 7项目中,我有一个带有几个子模块的模块。由于模块的根目录变得拥挤,我将子模块文件移到根目录中的自己的目录中。
我的模块结构如下:
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在“大移动”之前,现在位于子目录mymodule1和mymodule2中的文件位于它们的父目录(模块的根目录)中。
问题是:自从移动文件以来,我的自定义表单就不再加载了。我在mymodule1.form.inc中有一个表单,它以前可以很好地加载和呈现。现在,当我使用drupal_get_form()加载表单时,我只得到一个包含隐藏构建ID输入的空表单。
请记住,这里唯一改变的是.inc文件已与模块文件一起移到子目录中。此外,drupal_get_path('module', 'mymodule1')返回子目录中模块的正确路径。
奇怪的是,在mymodule1.block.inc中也有块钩子,即使在清除所有缓存之后,它们也能很好地工作。
这是我第一次在模块中处理每个子模块的单独目录。我从模块i18n中得到了灵感,它使用相同的结构。我在Drupal文档和i18n代码中进行了搜索,但找不到出错的地方。
是否有人知道我可能在哪里出错,或者我是否需要将数据添加到mymodule1.module或mymodule1.info以使其工作?谢谢。
一些细节:缓存已多次通过<path to project>/admin_menu/flush-cache清除。
我使用module1_hook_info()将块和窗体的钩子定向到单独的文件。这是返回值:
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_formmymodule1_foobar_form_validatemymodule1_foobar_form_submit发布于 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现在无法找到您的表单函数,并且无声地失败。
若要修复,请手动包含该文件:
module_include('inc', 'mymodule1', 'mymodule1.form');https://drupal.stackexchange.com/questions/184370
复制相似问题