Drupal 使用模块:url#u alter和it';s hook:hook\u url\u outbound\u alter()

Drupal 使用模块:url#u alter和it';s hook:hook\u url\u outbound\u alter(),drupal,drupal-6,Drupal,Drupal 6,hook\u url\u outbound\u alter() 我正在努力寻找关于如何使用这个钩子的任何文档或解释。我有一个页面:node/1221当它看起来像这样时:node/1221/profile/chn/3它为该用户加载一个配置文件 我想要漂亮的URL,这样当用户访问departments/pch/chn/profile/3时,我想要它实际加载node/1221/profile/chn/3 我很确定钩子会帮我解决这个问题,但不确定它是如何工作的 注意:使用Drupal6时,尝试了别名,但

hook\u url\u outbound\u alter()

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

我想要漂亮的URL,这样当用户访问
departments/pch/chn/profile/3
时,我想要它实际加载
node/1221/profile/chn/3

我很确定钩子会帮我解决这个问题,但不确定它是如何工作的

注意:使用Drupal6时,尝试了别名,但都不起作用

第二次更新:
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不起任何作用。

如果您想使用
hook\u url\u outbound\u alter()
您需要升级到Drupal 7,因为D6和更早版本上不存在它

如果我是你,我会用化名。别名的工作原理是将url重写为
departments/pch/chn/profile/3
将被转换为
node/1221/profile/chn/3
,这将是您安装的有效Drupal路径

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

我不知道URL的语义,所以我无法帮助您如何创建别名。最有可能在创建新节点时执行此操作。看一看,它会在大部分过程中帮助你

使用别名应该更易于维护,一些模块也可以使用它来做其他事情。使用
custom\u url\u rewrite\u xxx
会很快变得混乱,特别是当您需要添加大量规则时。现在使用它可能会更快,但如果你必须维护网站,这可能会导致1年后出现严重的WTF

钩子链接出站更改 如果您决定采用此路线,则需要更改
$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';
  }
}

试试这个:根据该模块的描述,它做了您希望它做的事情。

我不确定node/1221/profile/chn/3在您的站点中到底意味着什么。您的节点是否获取URL并相应地加载数据?也许这与你的问题无关,但为了让你找到一个更简单的解决方案,我更了解更广泛的情况。。。在任何情况下,我都有使用URL Alter的经验,如果可能的话,我很乐意提供帮助。我知道,URL中的
3
是我想传递给另一个URL的配置文件ID。我的
node/1221/profile/chn/3
正在工作,因为它有一个面板,可以抓取
%4
参数并将其传递给面板内的视图。希望这能提供更多的上下文。好的,你有一个显示视图的面板。因此,请尝试创建一个不同的面板,该面板使用%1和%2显示节点,使用%4显示配置文件。甚至让它使用视图和%1和%2作为参数来获取所需的节点。我认为这将是一个比使用URL改变钩子更好的解决方案。谢谢你的帮助,我不明白使用面板和参数如何帮助我使URL变得更好。它的工作原理是这样的,但我希望url看起来不错。事实上,我已经完成了一半,它确实存在于Drupal6中,正如我在标题中所说的,我正在使用一个名为URL alter的模块。使用我的“自己的系统”?在一个为我做所有这些的模块中?还是修改规则?我不想使用mod_rewrite,因为我需要为可能不同的路径使用它。用户还应该能够写入id 5或10,并获得一个新的配置文件,所以我需要该部分是动态的。现在来看看pathauto。我不想为每个ID创建别名,这太混乱了。我想让它动态发生。不是真的,你需要Drupal 7-hook\u url\u outbound\u alter()源于Drupal 6模块url alter:@WmasterJ我想你在使用contrib模块,无论如何我更新了我的答案来告诉你如何使用钩子,虽然我警告不要使用这种技术。我以前看过这个文档,但当时对我来说没有意义。我不理解你的警告,但我认为使用GUI来代替应该会有所帮助。目前,我正在考虑创建一个测试版本,使我能够使用路径创建别名。然后我想看看是否可以将其转换为一个GUI,其中启用了简单CRUD规则。谢谢你的帮助。不,这只处理子路径,我已经试过了。我不需要编辑子路径,例如node/1/edit为alias/edit。我需要的是能够创建一个可以接受参数的别名。我现在正在为它创建一个模块。使用该模块-如果您给“node/1221”别名“departments/pch”,那么请求“departments/pch/profile/chn/3”将得到与请求“node/1221/profile/chn/3”相同的响应-这不是您想要的吗?路径的第一部分将具有别名,最后一部分将是动态的。您使用我没有预料到的模块用法生成别名。谢谢你花时间向我的头脑进一步解释:)…我现在就试用。@VoxPelli:我已经安装了这个,但从未意识到它有这个功能。我遇到的问题是,除了元素的最后两部分之外,还有其他路径拥有所有内容。是否有一个钩子api可以在我自己的模块中使用?或者你自己也有一个例子。我不明白你需要什么样的钩子?Pathauto足以为节点创建基本别名,而无需