0

我正在编写一个与 Google Base 接口的模块。它需要插入指向该项目所在页面的链接,但是,在 pathauto 运行之前,该项目没有路径。如何确保 pathauto 在我的模块之前运行它的钩子,或者获取将由 pathauto 产生的路径?

该解决方案需要足够通用,以与管理员概述的具有不同 pathauto 设置的任何类型的节点一起使用。

问题是当我调用函数时,$node 变量的 [path] 值如下所示: [path] => [pathauto_perform_alias] => 1

节点路径的值是空的,而给 Google Base 的值只是网站的 base-url。

有没有办法改变 hook_nodeapi 函数运行的权重,以便它们稍后运行而不是更早运行?

我遇到了一个类似的问题,分类法没有将术语附加到我试图访问的节点上。我通过使用 taxonomy_node_get_terms() 解决了这个问题

提前致谢。

4

5 回答 5

2

有没有办法改变 hook_nodeapi 函数运行的权重,以便它们稍后运行而不是更早运行?

模块本身有一个权重,它决定了调用它们的钩子实现的顺序。具有相同权重的模块按字母顺序调用,AFAIK。

如果您没有在安装时明确设置模块的权重(通过 hook_install),则默认权重为 0。

如果你需要你的模块钩子实现在一个特定的其他模块之后运行,比如pathauto你应该在你的模块 hook_install 实现中做这样的事情:

// Get the weight of the module you need to run after/before
$pathauto_weight = db_result(db_query("SELECT weight FROM {system} WHERE name = 'pathauto'"));
// Define your modules weight relative to that
$yourModule_weight = $pathauto_weight + 1;
// Set your modules weight
db_query("UPDATE {system} SET weight = %d WHERE name = 'yourModule'", $yourModule_weight);

注意:模块权重会影响所有模块钩子实现相对于所有其他模块的调用顺序!

我不知道如何影响单个钩子实现调用顺序,因此对于我需要单个钩子实现以特殊顺序运行而其他需要以不同顺序运行的情况,我最终创建了一个或多个子模块以允许在不同的钩子实现上设置不同的权重。

于 2009-08-17T23:19:33.583 回答
1

有没有办法改变 hook_nodeapi 函数运行的权重,以便它们稍后运行而不是更早运行?

是的。这能解决你的问题吗?

于 2009-08-17T11:08:32.250 回答
1

查看 pathauto 模块中的代码,我看到以下几行可能对您有用

 if (!isset($node->pathauto_perform_alias) || $node->pathauto_perform_alias) {
        $placeholders = pathauto_get_placeholders('node', $node);
        $src = "node/$node->nid";
        $alias = pathauto_create_alias('node', $op, $placeholders, $src, $node->nid, $node->type, $node->language);
      }

如果你只是想知道 url,你可以将它们放入你的模块中。还值得注意的是,此代码仅针对 op=='insert' 和 op=='update' 运行。

另一件需要注意的事情是它调用 path_set_alias() 将值放入 url_alias 表中。我认为调用drupal_get_path_alias会做你想做的事。

$path = 'node/'. $node->nid;
$alias = drupal_get_path_alias($path);
于 2009-08-19T11:05:22.360 回答
0

钩子的实现是根据模块的权重来执行的。在特定情况下,更改权重不起作用,因为表单字段可能已更改为hook_form_alter()or hook_form_FORM_ID_alter()

于 2009-12-16T23:07:50.663 回答
0

我最近也遇到了这个问题,以上答案都没有太大帮助。我最终使用了这个:

$alias = str_replace(' ', '-', strtolower($node->title));

我意识到它完全是 hack,但它有效,而且这里没有其他任何东西。

于 2011-12-15T02:16:44.767 回答