it-swarm-vi.com

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

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_content hoặc là /the_folder_for_the_other_content hoặc là 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 phát trực tiếp, rõ ràng tôi cần tất cả các mục trong 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?

10
Martin Duys

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ân phát 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 có đường dẫn như sites/d8/files/Documents/MyFile.pdf

Hệ thống menu sau đó sẽ tạo một liên kết như href="/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ư 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 trang nội dung, trình duyệt sẽ giải thích 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ư 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 như href="http:/sites/d8/files/Documents/MyFile.pdf", Mà trình duyệt (ít nhất là Safari) sẽ hiểu là href="http://sites/d8/files/Documents/MyFile.pdf", Và thất bại trong việc cố gắng tìm máy chủ có tên "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/function/menu_tail_load/7 . Nếu bạn thêm 'load arguments' => array('%map', '%index'), vào định nghĩa của các mục $ trong mã của kiamlaluno, nó sẽ hoạt động. tại đâ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)

4
nachbar

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ề TRUE nếu

  • Đường dẫn là <front> (<front>/directory hoặ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 rl_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 title gọi lại trang , như menu đó gọi lại không bao giờ nên được gọi. Giá trị của truy cập gọi lại nói với Drupal mà mọi người dùng đều có quyền truy cập vào menu 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ó.

5
kiamlaluno

Đối với tôi, những điều sau đây đã thực hiện thủ thuật (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 trên http://www.example.com và tôi muốn có một liên kết đến http://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.

3
Paul

Tôi đã giải quyết các vấn đề liên kết của mình bằng cách sau:

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

Hóa ra chủ đề của tôi đã in menu không chính xác để tất cả các mục đều liên quan đến vị trí hiện tại của tôi (ví dụ: admin/logout, thay vì/logout).

Hi vọng điêu nay co ich.

1
the_dillio

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.

1
streamfan