Drupal: hook_url_inbound_alter в url_rewrite: переписать часть запроса URL для подкачки - PullRequest
4 голосов
/ 15 декабря 2010

Я пытаюсь использовать url_rewrite для обхода недружественных параметров в URL-адресе модуля paging.Я хочу превратить URL-адреса, такие как page-title.html?page=0,1 в page-title/page1.html.

Вот мои хуки:

function mymod_url_outbound_alter(&$path, &$options, $original_path) {
    $localPath = $path . '?' . $options['query'];
    dpm("_url_outbound_alter($localPath)");
    if (preg_match('|(.+)\.html\?page=0%2C(\d+)|', $localPath, $matches)) {
        $path = "${matches[1]}/page${matches[2]}.html";
        unset($options['query']);
        dpm("altering path to $path");
    }
}

function mymod_url_inbound_alter(&$result, $path, $path_language) {
    if (preg_match('|(.+)/page(\d+)\.html|', $path, $matches)) {
        //$result = "${matches[1]}.html?page=0,${matches[2]}";
        $result = "${matches[1]}.html";
        //$_GET['q'] = "page=0,${matches[2]}";
        $_GET['page'] = "0,${matches[2]}";
        dpm("altering in-path to $result");
    }
}

function mymod_boot() {}

Невозможно добавить часть запроса в hook_url_inbound_alter?

  • Если я закомментирую mymod_url_outbound_alter, он сработает, запятая нас, закодированная в URL - ОК, он действительно показывает дружественный URL.
  • Если я включу оба, страница перейдет в бесконечныйперенаправление 301 петли.
  • Закомментированные варианты также, похоже, не работают.

Да, я знаю, что лучше исправить paging, чтобы использовать URL без запроса.Но модуль слишком сложен, чтобы делать это надежно.В модуле pagination отсутствуют функции для меня.

Проблема в изменении URL?Что я могу сделать, чтобы это работало?

1 Ответ

3 голосов
/ 27 декабря 2010

$options['query'] - это массив, который содержит параметры запроса и их значения, поэтому вам придется сделать что-то вроде

$localPath = $path . '?' . $options['query']['page']

Также обратите внимание, что $path еще не был переписан модулем Path. Вот что у меня работает:

function pageing_url_outbound_alter(&$path, &$options, $original_path)
{
    if ($path == 'admin/content' && isset($options['query']['page']))
    {
        $path = 'admin/content/page' . $options['query']['page'];
        unset($options['query']['page']);
    }
}

function pageing_url_inbound_alter(&$path, $original_path, $path_language)
{
    if (preg_match('|admin/content/page(\d+)|', $path, $matches))
    {
        $path = 'admin/content';
        $_GET['page'] = $matches[1];
    }
}

Это для Drupal 7 RC3

...