我正在编写一个与Google Base接口的模块。它需要插入指向该项目所在页面的链接,但是,在pathauto运行之前,该项目没有路径。我怎样才能确保pathauto在我的模块之前运行它的钩子,或者从pathauto获得路径呢?
该解决方案需要足够通用,以便与管理员概述的具有不同pathauto设置的任何类型的节点一起工作。
问题是,当我调用函数时,$node变量的路径值如下所示: path => pathauto_perform_alias => 1
节点路径的值是空的,而Google Base的值只是网站的base-url。
有没有一种方法可以改变hook_nodeapi函数的运行权重,让它们运行得更晚而不是更快?
我遇到了一个类似的问题,分类法没有将术语附加到我试图访问的节点。我通过使用taxonomy_node_get_terms()解决了这个问题
提前谢谢。
发布于 2009-08-17 23:19:34
有没有办法改变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-17 11:08:32
有没有办法改变hook_nodeapi函数的运行权重,让它们运行得更晚而不是更快?
Yes.解决了你的问题吗?
发布于 2009-08-19 11:05:22
查看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);https://stackoverflow.com/questions/1286107
复制相似问题