Используя модуль: url_alter и его ловушка: hook_url_outbound_alter () - PullRequest
0 голосов
/ 03 января 2011

hook_url_outbound_alter ()

Я изо всех сил пытаюсь найти любую документацию или объяснение того, как использовать этот хук. У меня есть страница: node/1221 и когда это выглядит так: node/1221/profile/chn/3 Он загружает профиль для этого пользователя.

Мне нужны красивые URL-адреса, чтобы при посещении пользователем departments/pch/chn/profile/3 я хотел, чтобы он действительно загружал node/1221/profile/chn/3

Я почти уверен, что крюк должен помочь мне с этим, но не уверен, как он работает.

Примечание. Используя drupal 6, пробовали псевдонимы, но они не работали.

2-е обновление:
3 в URL-адресе - это идентификатор профиля, который я хочу передать другому URL-адресу. У меня node/1221/profile/chn/3 работает, потому что у него есть панель, которая захватывает аргумент %4 и передает его в представление внутри панели. Надеюсь, что это дает больше контекста.

В настоящее время пытается:

/**
 * Implementation of hook_boot()
 */
function pathargs_boot() {
  // remain empty, only needed to let Drupal bootstrap system know to load this module earlier.
}

/**
 * Will define custom_url_rewrite_inbound(). If url_alter is enabled 
 * Pathargs inbound alter will be called by its implementation of 
 * custom_url_rewrite_inbound() instead.
 */
if (!function_exists('custom_url_rewrite_inbound')) {
  function custom_url_rewrite_inbound(&$result, $path, $path_language) {
    return pathargs_url_inbound_alter($result, $path, $path_language);
  }
}

/**
 * Implementation of hook_url_inbound_alter()
 */
function pathargs_url_inbound_alter(&$result, $path, $path_language) {
  watchdog('Path Arguments', "$path + $original_path");
  if($result == 'chn') {
    $result = 'node/1222/chn/profile/3';
  }
}

Все еще не работает ... посещение www.domain.com/chn ничего не делает.

Ответы [ 2 ]

0 голосов
/ 04 января 2011

Попробуйте: http://drupal.org/project/subpath_alias В соответствии с описанием этого модуля он делает то, что вы хотите.

0 голосов
/ 03 января 2011

Если вы хотите использовать hook_url_outbound_alter(), вам нужно перейти на Drupal 7, поскольку он не существует на D6 и более ранних версиях.

На вашем месте я бы использовал псевдонимы. Псевдонимы работают, переписывая URL-адрес так, что departments/pch/chn/profile/3 будет переведено в node/1221/profile/chn/3, что будет правильным путем Drupal для вашей установки.

Дело в том, что то, что вы получили, немного специфично для сайта, поэтому вам нужно создать собственную систему для создания псевдонимов в вашем пользовательском модуле, а не полагаться на путь auto.

Я не знаю семантику ваших URL, поэтому я не могу помочь вам, как вы должны создавать псевдонимы. Скорее всего, вы можете сделать это при создании нового узла. Взгляните на pathauto_create_alias, это должно помочь вам большую часть пути.

Использование псевдонимов должно быть более легким в обслуживании, и некоторые модули подключаются к этому, позволяя вам делать другие вещи. Использование custom_url_rewrite_xxx может быстро стать беспорядочным, особенно если вам нужно добавить много правил. Вероятно, он будет быстрее использовать сейчас, но если вам нужно поддерживать сайт, это может привести к серьезному WTF через год.

hook_url_outbound_alter

Если вы решили пойти по этому маршруту, вам нужно изменить переменную $path, а не $result. Вы можете взглянуть на url_alter.api.php для руководства, пример использования:

function hook_url_inbound_alter(&$result, $path, $path_language) {
  global $user;

  // Change all requests for 'article/x' to 'node/x'.
  if (preg_match('|^article(/.*)|', $path, $matches)) {
    $path = 'node'. $matches[1];
  }
  // Change all requests to 'e' to the user's profile edit page.
  if ($path == 'e') {
    $path = 'user/'. $user->uid .'/edit';
  }
}
...