gpt4 book ai didi

drupal - 未调用 hook_load/hook_view

转载 作者:行者123 更新时间:2023-12-01 10:13:14 24 4
gpt4 key购买 nike

我有一个模块,其中声明了四种节点类型。我的问题是,从未调用 hook_load、hook_view。我使用 drupal_set_message 来确定是否正在调用某个钩子(Hook)。我发现 hook_load,hook_view 不是。只是为了给你一个清晰的画面,这是我的 hook_load 结构

这里更新了一个

function mymodule_node_info(){
return array(
'nodetype1' => array(
'name' => t('nodetype1'),
'module' => 'mymodule_nodetype1',
'description' => t('....'),
'has_title' => TRUE,
'title_label' => t('Title'),
'has_body' => TRUE,
'body_label' => t('Body'),
),
'nodetype2' => array(
......
'module' => 'mymodule_nodetype2',
......
),
'nodetype3' => array(
......
'module' => 'mymodule_nodetype3',
......
),
'nodetype4' => array(
......
'module' => 'mymodule_nodetype4',
.......
),
);

}

function mymodule_nodetype1_load($node){
$result = db_query('SELECT * from {nodetype1table} WHERE vid = %d'
$node->vid
);
drupal_set_message("hook_load is provoked.","status");
return db_fetch_object($result);
}

不知道为什么不叫。我根据 drupal 模块编写书编写了这段代码,并按照说明进行操作。我试过那本书中的示例代码,它工作正常。只有我的代码不工作。可能是因为一个模块中有多种节点类型。任何帮助将不胜感激。

最佳答案

您的代码不起作用,因为 hook_load() hook_view() 不是模块 Hook :它们是节点 Hook 。调用基于内容类型名称,而不是模块名称。

因此,首先您需要使用 hook_node_info() 声明您的内容类型:

function mymodule_node_info() {
$items = array();

$items['nodetype1'] = array(
'name' => t('Node Type 2'),
'module' => 'mymodule_nodetype1',
'description' => t("Nodetype 1 description"),
);
$items['nodetype2'] = array(
'name' => t('Node Type 2'),
'module' => 'mymodule_nodetype2',
'description' => t("Nodetype 2 description"),
);
$items['nodetype3'] = array(
'name' => t('Node Type 2'),
'module' => 'mymodule_nodetype3',
'description' => t("Nodetype 3 description"),
);

return $items;
}

然后,您需要使用您为 hook_node_info() 中声明的每个内容类型指定的模块名称。为您的节点 Hook 。即 mymodule_nodetype1_load() , mymodule_nodetype2_view()


编辑

如果您试图在查看或加载节点时触发基于非节点的模块,则需要使用 hook_nodeapi() :

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'view':
mymodule_view_function($node);
break;
case 'load':
mymodule_load_function($node);
break;
}
}

替换mymodule_load_function()mymodule_load_function()使用您自己的自定义函数,这些函数旨在作用于 $node对象。


编辑2

除了你的 hook_load() 中的语法错误实现,在你提供的代码之外有一段代码阻止了正确的调用。以下代码有效(如果您创建一个 nodetype1 节点,该节点上会出现消息“mymodule_nodetype1_load invoked”):也许您可以比较整个代码以查看您缺少什么。

function mymodule_node_info() {
return array(
'mymodule_nodetype1' => array(
'name' => t('nodetype1'),
'module' => 'mymodule_nodetype1',
'description' => t('....'),
'has_title' => TRUE,
'title_label' => t('Title'),
'has_body' => TRUE,
'body_label' => t('Body'),
),
'mymodule_nodetype2' => array(
'name' => t('nodetype2'),
'module' => 'mymodule_nodetype2',
'description' => t('....'),
'has_title' => TRUE,
'title_label' => t('Title'),
'has_body' => TRUE,
'body_label' => t('Body'),
),
);
}

function mymodule_nodetype1_form(&$node, $form_state) {
// nodetype1 form elements go here

return $form;
}

function mymodule_nodetype2_form(&$node, $form_state) {
// nodetype2 form elements go here

return $form;
}

function mymodule_nodetype1_load($node) {
$additions = new stdClass();

drupal_set_message('mymodule_nodetype1_load invoked');

return $additions;
}

function mymodule_nodetype2_load($node) {
$additions = new stdClass();

drupal_set_message('mymodule_nodetype2_load invoked');

return $additions;
}

如果您在更改模块后没有重置环境,则可能会遇到缓存问题。您应该在可以重置为干净的 Drupal 安装的沙箱环境中测试您的代码,以确保您不会专注于以前不正确的节点实现的旧问题。

此外,您应该只使用 hook_nodeapi()如果您尝试对您的模块未定义的内容类型进行操作。您的内容类型应该使用节点 Hook ( hook_load()hook_view() 等)。

最后,您可能会使用错误的钩子(Hook),因为您希望它们在不适合的地方触发。如果您已完成上述所有操作,请使用您期望实现的功能以及您希望 Hook 触发的位置更新您的帖子。

关于drupal - 未调用 hook_load/hook_view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3593666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com