我一直在处理模块并且很清楚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);
当我启用语言环境模块以使网络成为多语言时,URL将前缀分类为语言符号。例如:
en/webtv/block/%/playlist/edit/%
OR
nl/webtv/block/%/playlist/edit/%
这个东西取代了右边的参数的逻辑位置,现在正确放置参数(根据例子)是:
$second_arg = arg(3);
$fifth_arg = arg(6);
如何设置模块独立于此类参数放置问题?
答案 0 :(得分:1)
查看Drupal核心代码(例如,node_menu()
),使用菜单占位符的菜单回调在启用locale.module时不会调整,而local.module也不会改变从其他模块定义的菜单。
实际上,调用Drupal bootstrap的language_initialize()
包含以下代码:
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,则在启用模块时不应更改菜单回调定义。