1

私はモジュールに取り組んでいて、コールバックするためにurl引数を渡すためのhook_menuをよく知っていました。例えば:

$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 ブートストラップで呼び出される には、次のコードが含まれています。

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 に答える