Модуль локали и языковой префикс в URL - PullRequest
1 голос
/ 09 августа 2010

Я работал над модулем и хорошо знал о 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/%

ИЛИ

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

Эта вещь смещает логическое размещение аргументов вправо, теперь правильное размещение аргументов (в соответствии с примером):

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

Как настроить модуль независимо от таких проблем размещения аргументов?

1 Ответ

1 голос
/ 09 августа 2010

Глядя на код ядра 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. Если locale.module установлен правильно, определения обратного вызова меню не должны изменяться при включении модуля.

...