获取Drupal路径在启用Pathauto的节点“插入”操作期间?

时间:2009-08-17 04:04:28

标签: drupal drupal-6 pathauto drupal-path-aliases

我正在编写一个与Google Base连接的模块。它需要插入项目所在页面的链接,但是,在pathauto运行之前,此项目没有路径。我怎么能确保pathauto在我的模块之前运行它的钩子,或者获得pathauto导致的路径?

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

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

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

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

我遇到类似的问题,分类法没有将条款附加到我试图访问的节点。我通过使用taxonomy_node_get_terms()

解决了这个问题

提前致谢。

5 个答案:

答案 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));

我意识到这完全是黑客攻击,但它确实有效,而且这里没有别的。