Bagaimana cara membuat tautan menu relatif?

10

Saya sibuk mengerjakan situs di localhost saya yang perlu menautkan ke beberapa konten yang terpisah dari Drupal.

Saya memiliki menu jalur saat ini diatur seperti ini: http://mylocalsite/the_folder_for_the_other_content. Jika saya mencoba <front>/the_folder_for_the_other_contentatau /the_folder_for_the_other_contentatau the_folder_for_the_other_content, saya mendapatkan kesalahan "Path 'whatever_I_use' salah atau Anda tidak memiliki akses ke sana."

Ketika saya siaran langsung, saya jelas membutuhkan semua item menu untuk menunjuk http://myrealsite/the_folder_for_the_other_content.

Bagaimana saya mengaturnya sehingga saya tidak perlu mengedit semua jalur menu ketika saya tayang?

Martin Duys
sumber
@irishbuzz memiliki solusi untuk Drupal 6 di bawah ini, tetapi saya berharap saya bisa menghindari melakukan ini di Drupal 7. Apakah itu angan-angan dari saya?
Martin Duys
Apakah Drupal dipasang di direktori root server web?
kiamlaluno
Bukan pada versi localhost saya, tetapi ketika akhirnya ditayangkan akan di root folder public_html. Apakah itu dianggap sebagai 'root dari server web'?
Martin Duys
Dengan "direktori root dari server web," maksud saya direktori yang di Apache diatur dengan direktif "DocumentRoot" dan yang, secara default, adalah direktori public_html. Ini adalah akses direktori Apache ketika Anda menggunakan URL seperti http://example.com/.
kiamlaluno
Lalu: ya, akhirnya situs itu akan berada di direktori root
Martin Duys

Jawaban:

4

Jawaban kiamlaluno tidak cukup untuk saya. Menggunakan% menu_tail menghasilkan badai kesalahan bahwa fungsi menu_tail_load mengalami masalah dengan argumen yang hilang:

Warning: Missing argument 2 for menu_tail_load(), called in  ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).
Warning: Missing argument 3 for menu_tail_load(), called in ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).

Apa yang berhasil bagi saya adalah

function allow_menu_links_menu() {
  $items = array();
  $items['sites/d8/files/%'] = array(
    'title' => 'Folder Content',
    'page callback' => 'allow_menu_links_cb', /* never called */
    'access callback' => TRUE,
  );
  return $items;
}

Kemudian, saya bisa menyajikan file di folder situs / d8 / file (dan subfolder) menggunakan item menu dengan path seperti sites/d8/files/Documents/MyFile.pdf

Sistem menu kemudian akan menghasilkan tautan seperti href="https://drupal.stackexchange.com/sites/d8/files/Documents/MyFile.pdf"

Jika Anda tidak menggunakan modul menu khusus, sistem menu akan menolak jalur yang dimulai seperti di atas.

Jika Anda mencoba menggunakan path seperti http:sites/d8/files/Documents/MyFile.pdf, itu akan menghasilkan tautan seperti href="http:sites/d8/files/Documents/MyFile.pdf", yang akan berfungsi ketika Anda berada di root situs, tetapi ketika Anda berada di halaman konten, browser akan menafsirkan url relatif terhadap halaman konten, dan itu tidak akan berhasil.

Jika Anda menggunakan jalur seperti http:/sites/d8/files/Documents/MyFile.pdf, sistem menu akan menerimanya, tetapi sistem menu akan menghasilkan tautan seperti href="http:/sites/d8/files/Documents/MyFile.pdf", yang ditafsirkan peramban (setidaknya Safari) sebagai href="http://sites/d8/files/Documents/MyFile.pdf", dan gagal mencoba menemukan server bernama "situs".

(Pada penyelidikan lebih lanjut, alasan kode menggunakan menu_tail gagal adalah bahwa Anda perlu menambahkan 'memuat argumen', seperti yang tercantum di sini: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7. Jika Anda menambahkan 'load arguments' => array('%map', '%index'),definisi $ items dalam kode kiamlaluno, itu akan berhasil. Masalah apakah menu_tail_load harus memerlukan argumen memuat eksplisit juga dibahas di sini: http://drupal.org/node/298561 )

(Jangan lupa untuk mengaktifkan modul baru Anda, atau sistem menu tidak akan menerima tautan baru)

nachbar
sumber
5

Ketika Anda menambahkan tautan baru, tautan tersebut divalidasi dari menu_edit_item_validate () , yang memanggil drupal_valid_path () untuk memeriksa apakah jalur tersebut valid, atau dapat diakses dari pengguna.
drupal_valid_path()kembali TRUEjika

  • Path adalah <front>( <front>/directory, atau path serupa dikecualikan)
  • Path adalah path eksternal (fungsi url_is_external () mengembalikan TRUE)
  • Jalur dikaitkan dengan panggilan balik menu

Selain menggunakan URL absolut, satu-satunya solusi adalah memiliki modul khusus yang menentukan panggilan balik menu yang terkait dengan jalur yang ingin Anda gunakan.
Ketika Anda menggunakan URL yang mengarah ke file, atau direktori, server web harus menunjukkan file atau direktori itu, tanpa memanggil Drupal. Itulah yang terjadi dengan Apache, karena file .htaccess yang datang dengan Drupal berisi arahan berikut:

# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

Dalam kasus Anda, modul khusus harus berisi kode yang mirip dengan yang berikut:

function mymodule_menu() {
  $items = array();

  $items['the_folder_for_the_other_content/%menu_tail'] = array(
    'title' => 'Folder content', 
    'page callback' => 'mymodule_view', 
    'access callback' => TRUE,
    'load arguments' => array('%map', '%index'), 
  );

  return $items;
}

Anda dapat menggunakan nilai apa pun untuk panggilan balik judul dan halaman , karena panggilan balik menu itu seharusnya tidak pernah dipanggil. Nilai panggilan balik akses mengatakan kepada Drupal bahwa setiap pengguna memiliki akses ke panggilan balik menu itu.

Sebagai alternatif, Anda dapat menentukan callback menu yang terkait dengan "alias_for_directory /% menu_tail" yang mengarahkan pengguna ke direktori yang Anda inginkan (menggunakan drupal_goto () ). Saya akan menggunakan solusi ini ketika server tidak menggunakan konten .htaccess, dan itu akan meminta Drupal bahkan ketika URL menunjuk ke file atau direktori yang ada.

kiamlaluno
sumber
3

Bagi saya yang berikut melakukan trik (pada drupal 6).

Saya ingin mengarahkan ke URL lain di domain yang sama, katakanlah Drupal sedang berjalan http://www.example.comdan saya ingin memiliki tautanhttp://www.example.com/frontend

Di item menu, silakan masukkan sebagai jalur:

http:/frontend

Menu drupal akan ditautkan ke: http://www.example.com/frontend

Saat Anda menggunakan https, Anda harus memasukkan https: / frontend di bidang path untuk item menu.

Paul
sumber
Tahu apakah ini akan berhasil dalam 7 /
Martin Duys
Tidak tahu, coba saja.
Paul
Saya menemukan metode ini tidak berfungsi pada versi 7.22.
Rick
1
Ini berfungsi pada Drupal 7.23. Saya telah mencoba melakukan ini untuk sementara waktu, jika saya bisa, saya akan membuat Anda
kecewa
1

Saya menyelesaikan masalah tautan saya dengan yang berikut:

http://groups.drupal.org/node/210308 dan http://drupal.org/node/372252

Ternyata tema saya salah mencetak menu sehingga semua item relatif terhadap lokasi saya saat ini (yaitu admin / logout, bukan / logout).

Semoga ini membantu.

the_dillio
sumber
1

Saya menggunakan sql untuk mengganti tautan dalam struktur menu:

UPDATE menu_links SET link_path = replace(link_path, "livesite.com", "localhost.com");

Tidak yakin apakah saya perlu melakukan ini tetapi saya kemudian mem-cache menu.

streamfan
sumber
mengapa Anda ingin mengubah kueri? Itu tidak direkomendasikan.
gerl