it-swarm-id.com

Bagaimana cara membuat tautan menu relatif?

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

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

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

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

10
Martin Duys

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 dapat 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="/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 jalur 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 menginterpretasikan url relatif ke halaman konten, dan itu tidak akan berfungsi.

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 oleh 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'), ke definisi $ items dalam kode kiamlaluno, itu akan berfungsi. 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)

4
nachbar

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() mengembalikan TRUE jika

  • Jalannya adalah <front> (<front>/directory, atau jalur serupa dikecualikan)
  • Path adalah path eksternal (fungsi rl_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 meminta 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 judul dan pemanggilan kembali halaman , sebagai menu itu panggilan balik tidak boleh dipanggil. Nilai akses balik mengatakan kepada Drupal bahwa setiap pengguna memiliki akses ke menu panggil balik 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 memanggil Drupal bahkan ketika URL menunjuk ke file atau direktori yang ada.

5
kiamlaluno

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

Saya ingin mengarahkan ke URL lain di domain yang sama, katakanlah Drupal berjalan pada http://www.example.com dan saya ingin memiliki tautan ke http://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.

3
Paul

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.

1
the_dillio

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.

1
streamfan