Drupal 7 - URL перапісвання з hook_url _ * _ змяніць (), здаецца, не працуе

Вось мая сітуацыя: У мяне ёсць куча HTML старонак сайтаў/па змаўчанні/файлаў/PDF. Я хачу, каб служыць ім, як гэта так, у мяне ёсць спасылкі на іх у маім сайце Drupal. Тым не менш, адным з патрабаванняў з'яўляецца тое, што ўсе URL-адрасы гэтых старонак HTML не павінен утрымліваць якіх-небудзь пашырэнняў. Акрамя таго, я хачу, каб дзейнічаць такім чынам, што, калі карыстальнікі ідуць у example.com/sites/default/files/pdf/somehtmlfile, то URL будзе адлюстроўвацца ў example.com/pdf/somehtmlfile, а таксама пры наведванні карыстальнікаў прыкладу. кім/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
вы знайшлі рашэнне? Я думаю, што можа мець двайнікі праблемы ( stackoverflow.com/questions/17176589/… )
дададзена аўтар Stephan Celis, крыніца

1 адказы

Калі я вас правільна зразумеў 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 параметраў у меню. Гэта дазваляе вам больш гнуткасці ў тым, што вы можаце проста вызначыць тое, што PARAMS вы хацелі б гэты знешні URL-адрас для падтрымкі проста шляхам карэкціроўкі Params ў функцыі зваротнага выкліку.

  2. Калі грамадскі паток абалонкі каталогі/файлы суб-дзір: сайты/па змаўчанні/файлаў

  3. Мяркуецца, што хоць у вас ёсць somehtmlfile ў URL, што вы сапраўды хочаце, каб струмень somehtmlfile.pdf (калі вы хочаце, каб струмень somehtmlfile.html затым проста наладзіць жорсткі Кадаваць «.pdf» суфікс)

  4. <Літый> <р> file_transfer называе drupal_exit() у якасці апошняга кроку, які па сутнасці сканчаецца апрацоўку запыту.
  5. Пераканайцеся ў тым, каб ачысціць кэш ў адваротным выпадку не будзе працаваць, паколькі пункты меню кэшуюцца і знешні URL будзе не знайсці

0
дададзена