1

我一直在研究模块并且很清楚 hook_menu 用于传递 url 参数以进行回调。例如:

$items['webtv/block/%/playlist/edit/%'] = array(
    ...
    'page callback' => 'drupal_get_form',
    'page arguments' => array('webtv_playlist_form', 5, 2),
    ...
);

并回调为

function webtv_playlist_form($form_state, $fifth_arg, $second_arg){
...
}

除了 arg() 函数之外,还有另一个通过位置获取 url 参数的实用程序。

$second_arg = arg(2);
$fifth_arg = arg(5);

当我启用语言环境模块以使 Web 成为多语言时,URL 以前缀作为语言符号进行分类。例子:

en/webtv/block/%/playlist/edit/%

或者

nl/webtv/block/%/playlist/edit/%

这件事将参数的逻辑位置移到了右边,现在参数的正确位置(根据示例)是:

$second_arg = arg(3);
$fifth_arg = arg(6);

如何设置独立于此类参数放置问题的模块?

4

1 回答 1

1

查看 Drupal 核心代码(例如,node_menu()),使用菜单占位符的菜单回调不会在启用 locale.module 时调整为工作,local.module 也不会更改从其他模块定义的菜单。实际上,language_initialize()在 Drupal bootstrap 上调用的 , 包含以下代码:

case LANGUAGE_NEGOTIATION_PATH_DEFAULT:
case LANGUAGE_NEGOTIATION_PATH:
  // $_GET['q'] might not be available at this time, because
  // path initialization runs after the language bootstrap phase.
  $args = isset($_GET['q']) ? explode('/', $_GET['q']) : array();
  $prefix = array_shift($args);
  // Search prefix within enabled languages.
  foreach ($languages as $language) {
    if (!empty($language->prefix) && $language->prefix == $prefix) {
      // Rebuild $GET['q'] with the language removed.
      $_GET['q'] = implode('/', $args);
      return $language;
    }
  }

该代码正在删除 URL 中传递的语言 ID。如果 locale.module 设置正确,则在启用模块时不应更改菜单回调定义。

于 2010-08-09T10:35:15.037 回答