2010-08-09 63 views
1

我一直在模塊上工作,並深知hook_menu傳遞url參數來回叫。例如: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/% 

OR

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

這東西取代的論點正確,現在的論點正確放置的邏輯位置(根據示例)是:

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

如何設置模塊獨立於這些參數放置問題?

回答

1

查看Drupal核心代碼(例如,node_menu()),使用菜單佔位符的菜單回調在啓用locale.module時不會調整爲工作狀態,local.module也不會改變從其他模塊定義的菜單。 事實上,language_initialize(),呼籲Drupal的引導包含以下代碼:

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設置正確,則在啓用模塊時不應更改菜單回調定義。