Drupal 7 - hook_url _ * _ alter () көмегімен URL қайта жазу жұмыс істемейді

Міне, менің жағдайым: сайттарда/әдепкі/файлдар/pdf-де HTML парақтарым бар. Мен оларға қызмет етгім келеді, сондықтан менің Drupal сайтымда сілтемелерім бар. Алайда, талаптардың бірі осы HTML беттерінің барлық URL мекенжайларында ешқандай кеңейтімдер болмауы керек. Сонымен қатар, пайдаланушыларға example.com/sites/default/files/pdf/somehtmlfile сайтына кіргенде, URL мысалы.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
Сіз шешім таптыңыз ба? Менің ойымша, жүйелік мәселе болуы мүмкін ( 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. Public stream wrapper dirs/файлдары төмендегі болып табылады: сайттар/әдепкі/файлдар

  3. URL мекенжайында somehtmlfile.pdf (егер сіз somehtmlfile.html ағынын жібергіңіз келсе, онда қатты кодталған '.pdf' жұрнағын баптаңыз)

    деген болжам бар. >
  4. file_transfer drupal_exit() сұрауды өңдеуді түбегейлі тоқтататын соңғы қадам ретінде шақырады.

  5. Кэшіңізді тазалағыңыз келетініне көз жеткізіңіз, әйтпесе, мәзір жазбалары кэштеледі және сыртқы URL табылмады

0
қосылды