使用module:url_alter和它的钩子:hook_url_outbound_alter()

时间:2011-01-03 19:37:22

标签: drupal drupal-6

hook_url_outbound_alter()

我正在努力寻找有关如何使用此挂钩的任何文档或解释。我有一个页面:node/1221,当它看起来像这样:node/1221/profile/chn/3它为该用户加载一个配置文件。

我想要漂亮的网址,以便当用户访问departments/pch/chn/profile/3时我希望它实际加载node/1221/profile/chn/3

我很确定钩子可以帮助我,但不知道它是如何工作的。

注意:使用drupal 6,尝试过别名,但它们不起作用。

第二次更新:
URL中的3是我想要传递到另一个URL的配置文件ID。我node/1221/profile/chn/3正在工作,因为它有一个抓取%4参数的面板并将其传递给面板内的视图。希望这能提供更多背景。

目前正在尝试:

/**
 * Implementation of hook_boot()
 */
function pathargs_boot() {
  // remain empty, only needed to let Drupal bootstrap system know to load this module earlier.
}

/**
 * Will define custom_url_rewrite_inbound(). If url_alter is enabled 
 * Pathargs inbound alter will be called by its implementation of 
 * custom_url_rewrite_inbound() instead.
 */
if (!function_exists('custom_url_rewrite_inbound')) {
  function custom_url_rewrite_inbound(&$result, $path, $path_language) {
    return pathargs_url_inbound_alter($result, $path, $path_language);
  }
}

/**
 * Implementation of hook_url_inbound_alter()
 */
function pathargs_url_inbound_alter(&$result, $path, $path_language) {
  watchdog('Path Arguments', "$path + $original_path");
  if($result == 'chn') {
    $result = 'node/1222/chn/profile/3';
  }
}

仍然没有工作......访问www.domain.com/chn什么也没做。

2 个答案:

答案 0 :(得分:0)

如果你想使用hook_url_outbound_alter(),你需要升级到Drupal 7,因为它在D6及更早版本中不存在。

如果我是你,我会使用别名。别名通过重写url来工作departments/pch/chn/profile/3将被翻译成node/1221/profile/chn/3,这将是您安装的有效Drupal路径。

问题是你得到的是一些特定于站点的,所以你需要创建自己的系统来在自定义模块中创建别名,而不是依赖路径自动。

我不知道你的网址的语义,所以我无法帮助你如何创建别名。最有可能的是,您可以在创建新节点时执行此操作。看看pathauto_create_alias,它应该可以帮助你完成大部分工作。

使用别名应该更易于维护,并且一些模块可以使用它来执行其他操作。使用custom_url_rewrite_xxx很快就会很快变得混乱,特别是如果你需要添加很多规则。它现在可能会更快使用,但是如果你必须维护这个网站,这可能会导致一些严重的WTF从现在开始。

hook_url_outbound_alter

如果您决定采用此路线,则需要更改$path变量,而不是$result。您可以查看url_alter.api.php获取指导,使用示例如下:

function hook_url_inbound_alter(&$result, $path, $path_language) {
  global $user;

  // Change all requests for 'article/x' to 'node/x'.
  if (preg_match('|^article(/.*)|', $path, $matches)) {
    $path = 'node'. $matches[1];
  }
  // Change all requests to 'e' to the user's profile edit page.
  if ($path == 'e') {
    $path = 'user/'. $user->uid .'/edit';
  }
}

答案 1 :(得分:0)

试试这个:http://drupal.org/project/subpath_alias根据该模块的描述,它可以做你想做的事。