Drupal 7 - переписывание URL с помощью hook_url _ * _ alter () не работает - PullRequest
1 голос
/ 28 октября 2011

Вот моя ситуация: у меня есть куча HTML-страниц на сайтах / default / files / pdf. Я хочу обслуживать их как есть, поэтому у меня есть ссылки на них на моем сайте Drupal. Однако одно из требований заключается в том, что все URL-адреса этих HTML-страниц не должны содержать каких-либо расширений. Кроме того, я хочу, чтобы он действовал таким образом, чтобы при переходе пользователей на example.com/sites/default/files/pdf/somehtmlfile URL-адрес отображался как example.com/pdf/somehtmlfile, а также при посещении пользователями примера. Вместо этого будет подан com / pdf / somehtmlfile, example.com/sites/default/files/pdf/somehtmlfile.

Из моего независимого исследования кажется, что я должен использовать hook_url_inbound_alter () и hook_url_outbound_alter (). Тем не менее, я, кажется, что-то делаю не так, потому что URL не меняется вообще.

Ниже мой код. Я создал модуль с именем html_extension_remover (не очень оригинальное имя, я знаю). Я успешно активировал модуль, и некоторые операторы отладки были успешно выполнены, поэтому я знаю, что модуль работает.

function html_extension_remover_url_outbound_alter(&$path, &$options, $original_path){
    $pdf_regex = '|^sites/default/files/pdf(/.*)?|';
    $pdf_new_path = 'pdf';

    if (preg_match($pdf_regex,$path, $matches)) //rewrite all request to sites/default/files/pdf to pdf, looks nicer
        if (count($matches)==1)
            $path = $pdf_new_path;
        else
            $path = $pdf_new_path . $matches[1]; //append the rest of the URL, after the Regex match
    if (strpos($path, $pdf_new_path)!=FALSE) //URL contains pdf, means viewing converted PDFs in pdf dir
        if (strpos($path, '.htm')!=FALSE){ //if viewing .htm/.html file
            $path = substr(0, strpos); //strip extension from URL
        }

    $pdf_new_path = 'sites/default/files/pdf';
    $pdf_regex = '|^pdf(/.*)?|';

    if (preg_match($pdf_regex, $path, $matches)){
        if (count($matches)==1){
            $path = $pdf_new_path;
        }
        else{
            $path = $pdf_new_path.$matches[1].'.htm';
        }
    }
}

function html_extension_remover_url_inbound_alter(&$path, &$options, $original_path){
    $pdf_new_path = 'sites/default/files/pdf';
    $pdf_regex = '|^pdf(/.*)?|';

    if (preg_match($pdf_regex, $path, $matches)){
        if (count($matches)==1){
            $path = $pdf_new_path;
        }
        else{
            $path = $pdf_new_path.$matches[1].'.htm';
        }
    }
}

1 Ответ

0 голосов
/ 11 марта 2014

Если я правильно вас понял, перезапись URL - это не то, что вам нужно.Зачем?Поскольку сопоставление внешнего URL-адреса с некоторым внутренним URL-адресом / псевдонимом не поможет вам обработать файл.

Вам нужен способ обработки внешнего URL-адреса и возврата файла, о котором идет речь.К счастью, Drupal 7 делает это довольно легко.

1.) Определите отображение меню в hook_menu ()



    function MODULE_menu() {
      $items = array();
      $items['pdf'] = array(
        'title' => 'Map PDF',
        'page callback' => 'MODULE_show_pdf',
        'access callback' => TRUE,
        'description' => 'TBD',
        'type' => MENU_CALLBACK,
      );
      return ($items);
    }

2.) Определите функцию обратного вызова



    function MODULE_show_pdf($somehtmlfile = '') {
      $stream_wrapper_uri = 'public://pdf/' . $somehtmlfile . '.pdf';
      $stream_wrapper = file_create_url($stream_wrapper_uri);
      $stream_headers = array(
        'Content-Type'      => file_get_mimetype($stream_wrapper_uri),
        'Content-Length'    => filesize($stream_wrapper_uri),
        'Pragma'            => 'no-cache',
        'Cache-Control'     => 'must-revalidate, post-check=0, pre-check=0',
        'Expires'           => '0',
        'Accept-Ranges'     => 'bytes'
      );              
      file_transfer($stream_wrapper_uri, $stream_headers);
    }

Некоторые замечания:

  1. Нет необходимости явно определять параметр somehtmlfile в меню.Это дает вам больше гибкости в том, что вы можете просто определить любые параметры, которые вы хотите, чтобы этот внешний URL-адрес поддерживал, просто изменив параметры в функции обратного вызова.

  2. Когда обертка / файлы общедоступного потока каталоговявляются подкаталогами: sites / default / files

  3. Предполагается, что, хотя у вас есть URL-адрес somehtmlfile, который вы действительно хотите передать потоку somehtmlfile.pdf (если вы хотите передать поток somehtmlfileЗатем .html просто настраивает жестко закодированный суффикс '.pdf')

  4. file_transfer вызывает drupal_exit () в качестве последнего шага, который, по сути, заканчивает обработку запроса.

    Обязательно очистите кэш, иначе вышеприведенное не будет работать, поскольку элементы меню кэшируются, а внешний URL-адрес не будет найден

...