ฉันจะสร้างลิงค์เมนูสัมพันธ์ได้อย่างไร


10

ฉันกำลังยุ่งอยู่กับการทำงานกับไซต์บน localhost ที่ต้องเชื่อมโยงไปยังเนื้อหาที่แยกต่างหากจาก Drupal

http://mylocalsite/the_folder_for_the_other_contentฉันมีเมนูเส้นทางที่ปัจจุบันตั้งค่าเช่นนี้ ถ้าฉันพยายาม <front>/the_folder_for_the_other_contentหรือ/the_folder_for_the_other_contentหรือthe_folder_for_the_other_contentฉันได้รับข้อผิดพลาด "เส้นทาง 'whatever_I_use' ไม่ถูกต้องหรือคุณไม่สามารถเข้าถึงได้."

http://myrealsite/the_folder_for_the_other_contentเมื่อฉันไปฉันสดชัดต้องทุกรายการเมนูที่จะชี้ไปที่

ฉันจะตั้งค่าเพื่อที่ฉันจะได้ไม่ต้องแก้ไขพา ธ เมนูทั้งหมดเมื่อใช้งานจริง


@irishbuzz มีวิธีแก้ปัญหาสำหรับ Drupal 6 ด้านล่าง แต่ฉันหวังว่าฉันจะสามารถหลีกเลี่ยงการทำสิ่งนี้ใน Drupal 7 นั่นเป็นความคิดที่ปรารถนาในส่วนของฉันหรือไม่?
Martin Duys

ติดตั้ง Drupal ในไดเรกทอรีรากของเว็บเซิร์ฟเวอร์หรือไม่
kiamlaluno

ไม่ได้อยู่ในรุ่น localhost ของฉัน แต่ในที่สุดเมื่อมันใช้งานได้จริงมันจะอยู่ในรูทของโฟลเดอร์ public_html สิ่งนี้นับเป็น 'รูตของเว็บเซิร์ฟเวอร์' หรือไม่
Martin Duys

โดย "ไดเรกทอรีรากของเว็บเซิร์ฟเวอร์" ฉันหมายถึงไดเรกทอรีที่ใน Apache ถูกตั้งค่าด้วยคำสั่ง "DocumentRoot" และโดยค่าเริ่มต้นคือไดเรกทอรี public_html มันเป็นไดเรกทอรีเข้าถึง Apache เมื่อคุณใช้ URL http://example.com/เช่น
kiamlaluno

จากนั้น: ใช่ในที่สุดเว็บไซต์จะอยู่ในไดเรกทอรีหลัก
Martin Duys

คำตอบ:


4

คำตอบของ kiamlaluno ไม่ได้ผลสำหรับฉัน การใช้% menu_tail ทำให้เกิดข้อผิดพลาดที่ฟังก์ชั่น menu_tail_load มีปัญหากับอาร์กิวเมนต์ที่ขาดหายไป:

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).

สิ่งที่ได้ผลสำหรับฉันคือ

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;
}

จากนั้นฉันสามารถแสดงไฟล์ในโฟลเดอร์ sites / d8 / files (และโฟลเดอร์ย่อย) โดยใช้รายการเมนูที่มีพา ธ ดังนี้ sites/d8/files/Documents/MyFile.pdf

ระบบเมนูจะสร้างลิงค์เช่น href="https://drupal.stackexchange.com/sites/d8/files/Documents/MyFile.pdf"

หากคุณไม่ได้ใช้โมดูลเมนูที่กำหนดเองระบบเมนูจะปฏิเสธเส้นทางที่เริ่มต้นด้านบน

หากคุณพยายามใช้พา ธ เช่นhttp:sites/d8/files/Documents/MyFile.pdfมันจะสร้างลิงก์เช่นhref="http:sites/d8/files/Documents/MyFile.pdf"ซึ่งจะทำงานเมื่อคุณอยู่ที่รูทของเว็บไซต์ แต่เมื่อคุณอยู่ในหน้าเนื้อหาเบราว์เซอร์จะตีความ URL ที่สัมพันธ์กับหน้าเนื้อหา และมันจะไม่ทำงาน

หากคุณใช้พา ธ เช่นhttp:/sites/d8/files/Documents/MyFile.pdfนี้ระบบเมนูจะยอมรับ แต่ระบบเมนูจะสร้างลิงก์เช่นhref="http:/sites/d8/files/Documents/MyFile.pdf"ซึ่งเบราว์เซอร์ (อย่างน้อย Safari) จะตีความว่าเป็นhref="http://sites/d8/files/Documents/MyFile.pdf"และไม่พยายามค้นหาเซิร์ฟเวอร์ที่ชื่อ "ไซต์"

(ในการตรวจสอบเพิ่มเติมเหตุผลที่รหัสที่ใช้ menu_tail ล้มเหลวคือคุณต้องเพิ่ม 'อาร์กิวเมนต์การโหลด' ตามที่ระบุไว้ที่นี่: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7หากคุณเพิ่ม'load arguments' => array('%map', '%index'),คำจำกัดความของ $ items ในรหัสของ kiamlaluno มันจะทำงานได้ปัญหาว่า menu_tail_load ควรกำหนดอาร์กิวเมนต์การโหลดอย่างชัดเจนหรือไม่: http://drupal.org/node/298561 )

(อย่าลืมเปิดใช้งานโมดูลใหม่ของคุณมิฉะนั้นระบบเมนูจะไม่ยอมรับลิงก์ใหม่)


5

เมื่อคุณเพิ่มลิงค์ใหม่ลิงค์จะถูกตรวจสอบจากmenu_edit_item_validate ()ซึ่งเรียกdrupal_valid_path ()เพื่อตรวจสอบว่าพา ธ นั้นถูกต้องหรือสามารถเข้าถึงได้จากผู้ใช้
drupal_valid_path()ส่งคืนTRUEถ้า

  • เส้นทางคือ<front>( <front>/directoryหรือไม่รวมเส้นทางที่คล้ายกัน)
  • พา ธ เป็นพา ธ ภายนอก (ฟังก์ชันurl_is_external ()ส่งคืนTRUE)
  • เส้นทางที่เกี่ยวข้องกับการโทรกลับเมนู

นอกเหนือจากการใช้ URL แบบสัมบูรณ์โซลูชันเดียวคือการมีโมดูลแบบกำหนดเองที่กำหนดเมนูเรียกกลับที่เกี่ยวข้องกับเส้นทางที่คุณต้องการใช้
เมื่อคุณใช้ URL ที่ชี้ไปที่ไฟล์หรือไดเรกทอรีเว็บเซิร์ฟเวอร์ควรแสดงไฟล์หรือไดเรกทอรีนั้นโดยไม่ต้องเรียกใช้ Drupal นั่นคือสิ่งที่เกิดขึ้นกับ Apache เนื่องจากไฟล์. htaccess ที่มาพร้อมกับ Drupal มีคำสั่งดังต่อไปนี้:

# 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]

ในกรณีของคุณโมดูลที่กำหนดเองควรมีรหัสคล้ายกับต่อไปนี้:

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;
}

คุณสามารถใช้ค่าใด ๆ สำหรับหัวเรื่องและการเรียกกลับหน้าเนื่องจากไม่ควรเรียกการเรียกกลับเมนูนั้น มูลค่าของการโทรกลับเข้าถึงบอกกับ Drupal ว่าผู้ใช้ทุกคนสามารถเข้าถึงการเรียกกลับเมนูนั้นได้

เป็นอีกทางเลือกหนึ่งที่คุณสามารถกำหนดเมนูเรียกกลับที่เชื่อมโยงกับ "alias_for_directory /% menu_tail" ที่เปลี่ยนเส้นทางผู้ใช้ไปยังไดเรกทอรีที่คุณต้องการเห็น (ใช้drupal_goto () ) ฉันจะใช้โซลูชันนี้เมื่อเซิร์ฟเวอร์ไม่ได้ใช้เนื้อหาของ. htaccess และมันจะเรียกใช้ Drupal แม้ในขณะที่ URL ชี้ไปยังไฟล์หรือไดเรกทอรีที่มีอยู่


3

สำหรับฉันต่อไปนี้ได้หลอกลวง (บน drupal 6)

ฉันต้องการนำไปยัง URL อื่นในโดเมนเดียวกันสมมติว่า Drupal กำลังทำงานอยู่http://www.example.comและฉันต้องการมีลิงก์ไปยังhttp://www.example.com/frontend

ในรายการเมนูโปรดป้อนเป็นเส้นทาง:

http:/frontend

เมนู drupal จะเชื่อมโยงไปยัง: http://www.example.com/frontend

เมื่อคุณใช้ https คุณควรป้อน https: / frontend ในฟิลด์พา ธ สำหรับรายการเมนู


ความคิดใด ๆ ถ้ามันจะทำงานใน 7 /
Martin Duys

ไม่รู้ลองใช้ดูสิ
พอล

ฉันค้นหาวิธีนี้ไม่ทำงานในเวอร์ชัน 7.22
ริก

1
ใช้งานได้กับ Drupal 7.23 ฉันได้พยายามทำสิ่งนี้มาระยะหนึ่งแล้วถ้าฉันทำได้ฉันจะขึ้นคะแนนให้คุณ +10
DrCord

1

ฉันแก้ไขปัญหาลิงก์ของฉันด้วยสิ่งต่อไปนี้:

http://groups.drupal.org/node/210308 และ http://drupal.org/node/372252

ปรากฎว่าชุดรูปแบบของฉันพิมพ์เมนูไม่ถูกต้องเพื่อให้รายการทั้งหมดสัมพันธ์กับตำแหน่งปัจจุบันของฉัน (เช่นผู้ดูแลระบบ / ออกจากระบบแทน / ออกจากระบบ)

หวังว่านี่จะช่วยได้


1

ฉันใช้ sql เพื่อแทนที่ลิงค์ในโครงสร้างเมนู:

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

ไม่แน่ใจว่าฉันต้องการทำสิ่งนี้หรือไม่ แต่ฉันล้างแคชเมนูแล้ว


ทำไมคุณต้องการเปลี่ยนแบบสอบถาม ไม่แนะนำ
gerl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.