Làm thế nào để tôi tạo liên kết menu tương đối?


10

Tôi đang bận làm việc trên một trang web trên localhost của tôi cần liên kết đến một số nội dung tách biệt với Drupal.

Tôi có các đường dẫn menu hiện tại được thiết lập như thế này : http://mylocalsite/the_folder_for_the_other_content. Nếu tôi thử <front>/the_folder_for_the_other_contenthoặc /the_folder_for_the_other_contenthoặc the_folder_for_the_other_content, tôi nhận được lỗi "Đường dẫn 'anything_I_use' không hợp lệ hoặc bạn không có quyền truy cập vào nó."

Khi tôi đi trực tiếp rõ ràng tôi cần tất cả các mục menu để trỏ đến http://myrealsite/the_folder_for_the_other_content.

Làm cách nào tôi có thể thiết lập nó để tôi sẽ không phải chỉnh sửa tất cả các đường dẫn menu khi tôi phát trực tiếp?


@irishbuzz có một cách giải quyết cho Drupal 6 bên dưới, nhưng tôi đã hy vọng rằng tôi có thể tránh làm điều này trong Drupal 7. Đó có phải là suy nghĩ mong muốn của tôi không?
Martin Duys

Drupal có được cài đặt trong thư mục gốc của máy chủ web không?
kiamlaluno

Không phải trên phiên bản localhost của tôi, nhưng khi cuối cùng nó xuất hiện, nó sẽ nằm trong thư mục gốc của thư mục public_html. Điều đó có được tính là 'root của máy chủ web' không?
Martin Duys

Theo "thư mục gốc của máy chủ web", ý tôi là thư mục trong Apache được đặt bằng chỉ thị "DocumentRoot" và theo mặc định, đó là thư mục public_html. Đây là thư mục truy cập Apache khi bạn sử dụng URL như http://example.com/.
kiamlaluno

Sau đó: có, cuối cùng trang web sẽ nằm trong thư mục gốc
Martin Duys

Câu trả lời:


4

Câu trả lời của kiamlaluno không hoàn toàn phù hợp với tôi. Việc sử dụng% menu_tail đã tạo ra một cơn bão lỗi mà hàm menu_tail_load gặp vấn đề với các đối số bị thiếu:

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

Những gì đã làm cho tôi là

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

Sau đó, tôi có thể phục vụ các tệp trong thư mục site / d8 / files (và thư mục con) bằng cách sử dụng các mục menu với các đường dẫn như sites/d8/files/Documents/MyFile.pdf

Hệ thống menu sau đó sẽ tạo ra một liên kết như href="/drupal//sites/d8/files/Documents/MyFile.pdf"

Nếu bạn không sử dụng mô-đun menu tùy chỉnh, hệ thống menu sẽ từ chối một đường dẫn bắt đầu như trên.

Nếu bạn cố gắng sử dụng một đường dẫn như thế http:sites/d8/files/Documents/MyFile.pdf, nó sẽ tạo ra một liên kết nhưhref="http:sites/d8/files/Documents/MyFile.pdf" , nó sẽ hoạt động khi bạn ở gốc của trang web, nhưng khi bạn ở trên một trang nội dung, trình duyệt sẽ diễn giải url liên quan đến trang nội dung, và nó sẽ không hoạt động.

Nếu bạn sử dụng một đường dẫn như thế http:/sites/d8/files/Documents/MyFile.pdf, hệ thống menu sẽ chấp nhận nó, nhưng hệ thống menu sẽ tạo ra một liên kết giống như href="http:/sites/d8/files/Documents/MyFile.pdf"trình duyệt (ít nhất là Safari) sẽ hiểu là href="http://sites/d8/files/Documents/MyFile.pdf"và không thể tìm thấy máy chủ có tên là "các trang web".

(Khi điều tra thêm, lý do mã sử dụng menu_tail không thành công là bạn cần thêm 'đối số tải', như đã lưu ý ở đây: http://api.drupal.org/api/drupal/includes--menu.inc/feft / menu_tail_load / 7 Nếu bạn thêm. 'load arguments' => array('%map', '%index'),định nghĩa của $ items trong mã kiamlaluno, nó sẽ làm việc các vấn đề liệu menu_tail_load nên yêu cầu các đối số tải rõ ràng cũng sẽ được thảo luận ở đây:. http://drupal.org/node/298561 )

(Đừng quên bật mô-đun mới của bạn hoặc hệ thống menu sẽ không chấp nhận các liên kết mới)


5

Khi bạn thêm một liên kết mới, liên kết được xác thực từ menu_edit_item_validate () , gọi drupal_valid_path () để kiểm tra xem đường dẫn có hợp lệ không, hoặc nó có thể được truy cập từ người dùng.
drupal_valid_path()trả về TRUEnếu

  • Đường dẫn là <front>( <front>/directoryhoặc các đường dẫn tương tự được loại trừ)
  • Đường dẫn là một đường dẫn bên ngoài (hàm url_is_external () trả về TRUE)
  • Đường dẫn được liên kết với một cuộc gọi lại menu

Ngoài việc sử dụng URL tuyệt đối, giải pháp duy nhất là có một mô-đun tùy chỉnh xác định một cuộc gọi lại menu liên quan đến đường dẫn bạn muốn sử dụng.
Khi bạn sử dụng URL trỏ đến tệp hoặc thư mục, máy chủ web sẽ hiển thị tệp hoặc thư mục đó mà không cần gọi Drupal. Đó là những gì xảy ra với Apache, vì tệp .htaccess đi kèm với Drupal chứa các chỉ thị sau:

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

Trong trường hợp của bạn, mô-đun tùy chỉnh phải chứa mã tương tự như sau:

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

Bạn có thể sử dụng bất kỳ giá trị nào cho cuộc gọi lại tiêu đềtrang , vì cuộc gọi lại menu đó sẽ không bao giờ được gọi. Giá trị của cuộc gọi lại truy cập nói với Drupal rằng mọi người dùng đều có quyền truy cập vào cuộc gọi lại menu đó.

Để thay thế, bạn có thể xác định một cuộc gọi lại menu liên quan đến "alias_for_directory /% menu_tail" để chuyển hướng người dùng đến thư mục bạn muốn họ nhìn thấy (sử dụng drupal_goto () ). Tôi sẽ sử dụng giải pháp này khi máy chủ không sử dụng nội dung của .htaccess và nó sẽ gọi Drupal ngay cả khi URL đang trỏ đến một tệp hoặc thư mục hiện có.


3

Đối với tôi sau đây đã thực hiện các mẹo (trên drupal 6).

Tôi muốn chuyển đến một URL khác trên cùng một tên miền, giả sử Drupal đang chạy http://www.example.comvà tôi muốn có một liên kết đếnhttp://www.example.com/frontend

Trong mục menu, vui lòng nhập dưới dạng đường dẫn:

http:/frontend

Menu drupal sẽ liên kết đến: http://www.example.com/frontend

Khi bạn sử dụng https, bạn nên nhập https: / frontend vào trường đường dẫn cho mục menu.


Bất cứ ý tưởng nào nếu điều này sẽ hoạt động trong 7 /
Martin Duys

Đừng biết, hãy thử xem.
Paul

Tôi thấy phương pháp này không hoạt động như phiên bản 7.22.
Rick

1
Điều này hoạt động trên Drupal 7.23. Tôi đã cố gắng làm điều này trong một thời gian, nếu tôi có thể tôi sẽ nâng cao bạn +10
DrCord


1

Tôi đã sử dụng sql để thay thế các liên kết trong cấu trúc menu:

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

Không chắc chắn nếu tôi cần phải làm điều này nhưng sau đó tôi đã xóa bộ đệm menu.


Tại sao bạn muốn thay đổi truy vấn mặc dù? Nó không được khuyến khích.
gerl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.