我正在编写一个与Google Base连接的模块。它需要插入项目所在页面的链接,但是,在pathauto运行之前,此项目没有路径。我怎么能确保pathauto在我的模块之前运行它的钩子,或者获得pathauto导致的路径?
解决方案需要足够通用,以便与管理员概述的具有不同pathauto设置的任何类型的节点一起使用。
问题是当我调用函数时,$ node变量的[path]值如下所示:[path] => [pathauto_perform_alias] => 1
节点路径的值是空的,给予Google Base的值只是网站的base-url。
有没有办法改变hook_nodeapi函数运行的权重,以便它们可以在以后运行而不是更快?
我遇到类似的问题,分类法没有将条款附加到我试图访问的节点。我通过使用taxonomy_node_get_terms()
解决了这个问题提前致谢。
答案 0 :(得分: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);
小心:模块权重影响模块钩子实现的所有与所有其他模块相关的的顺序! < / p>
我不知道影响单个钩子实现调用顺序的方法,因此对于需要单个钩子实现以特殊顺序运行的情况,而其他需要以不同顺序运行的情况,我最终创建一个或多个子模块,允许在不同的钩子实现上进行不同的权重设置。
答案 1 :(得分:1)
有没有办法改变体重 哪个hook_nodeapi函数运行,所以 他们将在以后运行而不是 越早?
Yes.这能解决您的问题吗?
答案 2 :(得分: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);
}
如果您只是想知道网址,可以将这些网址整理到您的模块中。值得注意的是,此代码仅适用于op =='insert'和op =='update'。
另外需要注意的是它调用了path_set_alias(),它将一个值放入url_alias表中。我认为调用drupal_get_path_alias会做你想要的。
$path = 'node/'. $node->nid;
$alias = drupal_get_path_alias($path);
答案 3 :(得分:0)
基于模块的权重执行钩子的实现。在特定情况下,更改权重无法生效,因为表单字段可能已在hook_form_alter()
或hook_form_FORM_ID_alter()
中更改。
答案 4 :(得分:0)
我最近遇到了这个问题,上述答案都没有真正帮助我。 我最终使用了这个:
$alias = str_replace(' ', '-', strtolower($node->title));
我意识到这完全是黑客攻击,但它确实有效,而且这里没有别的。