drupal - 未调用 hook_load/hook_view

标签 drupal drupal-modules drupal-hooks

我有一个模块,其中声明了四种节点类型。我的问题是,从未调用 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/

相关文章:

php - 如何仅允许特定用户查看 Drupal 中内容类型的特定字段?

drupal - 如果我已经有了 hook_mail,那么还有 hook_mail_alter 有什么意义呢?

php - 德鲁帕尔 7 : missing php code in default value

php - Drupal 7 临时缓存项不会过期

javascript - 延长 Drupal 7 中弹出日历的使用年限

drupal::订购完整的钩子(Hook)并升级用户权限/角色

php - 多次调用通配符加载器函数 (_load)

php - 将网站上传到 drupal 时出现 403 Forbidden

php - module_load_include() 与 require_once

drupal - 如何以编程方式在 Drupal 7 中注销用户?