Drupal 7 - hook_url _ * _ alter()によるURL書き換えが機能していないようです

ここに私の状況です:私はサイト/デフォルト/ファイル/ pdfにHTMLページの束を持っています。私はそれらを提供したいので、私はDrupalサイトでそれらにリンクしています。ただし、これらのHTMLページのすべてのURLに拡張子を含めないことが要件の1つです。さらに、ユーザーがexample.com/sites/default/files/pdf/somehtmlfileにアクセスすると、URLはexample.com/pdf/somehtmlfileと表示され、ユーザーがexampleを訪問したときにも表示されるようにしたいと考えています。 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
解決策を見つけましたか?私は疑似的な問題があるかもしれないと思う( 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パラメータを明示的に定義する必要はありません。これにより、コールバック関数のパラメータを調整するだけで、この外部URLでサポートされるパラメータを簡単に定義できます。

  2. パブリックストリームラッパーディレクトリ/ファイルがsites/default/filesのサブディレクトリにある場合

  3. somehtmlfile.pdfを実際にストリームしたいsomehtmlfileがURLにありますが(somehtmlfile.htmlをストリーミングしたい場合は単にハードコードされた '.pdf'サフィックスを調整する)
  4. file_transferは、本質的にリクエスト処理を終了する最後のステップとしてdrupal_exit()を呼び出します。

  5. キャッシュをフラッシュするようにしてください。そうしないと、メニューエントリがキャッシュされて外部URLが見つからないため、

0
追加された