it-swarm-vi.com

Truyền tham số URL vào lệnh gọi lại menu

Tôi đã triển khai hook_menu() để tạo một đường dẫn mới gọi là 'đăng nhập người dùng'. Hàm gọi lại trang nhận các tham số url như $_GET['parameter']; tuy nhiên, khi tôi truy cập http://site.com/user-login?parameter=test , tôi gặp lỗi 404. Tôi nên triển khai hook_menu() như thế nào để hoạt động này?

Đây là mã tôi đang sử dụng

/**
 * Implementation of hook_menu()
 */
function login_menu() {
  //$items = array();

  $items['user-login'] = array(
    'title' => 'External login',
    'page callback' => 'user_login_callback',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function user_login_callback() {

  // Get the URL params
  $uid = urldecode($_GET['uid']);
  $expiry = urldecode($_GET['expiry']);
  $provided_hash = urldecode($_GET['hash']);  

}

Trang sẽ được gọi như http://site.com/user-login?uid=2?Exiry=3?hash=sd7wdah

7
Matthew Hui

Hệ thống menu drupal không quan tâm đến các đối số $ _GET, bạn có thể làm bất cứ điều gì bạn muốn với chúng, nó không ảnh hưởng đến việc triển khai hook_menu () **.

Vì vậy, lỗi nằm ở một nơi khác. Kết quả của hook_menu () được lưu trữ, nó không được gọi trên mỗi trang. Nếu bạn thay đổi/thêm bất cứ thứ gì trong chức năng đó, bạn cần xây dựng lại các menu. Cách nhanh nhất để làm điều đó là sử dụng lệnh drush "drush cc all" hoặc "xây dựng lại các menu" trong khối liên kết Phát triển của devel.module. Bạn cũng có thể gửi trang mô-đun, mặc dù.

** Điều đó nói rằng, việc truyền các đối số thông qua hệ thống menu dưới dạng đối số đường dẫn bổ sung là phổ biến hơn nhiều. Bất cứ điều gì được thông qua sau đường dẫn sẽ được chuyển thành đối số cho cuộc gọi lại trang của bạn một cách tự động. Vì vậy, việc gọi người dùng đăng nhập/2/3/sd7wdah sẽ chuyển ba đối số này cho hàm của bạn là user_login_callback (2, 3, 'sd7wdah'). Bạn cũng có thể tạo các đối số này theo yêu cầu bằng cách chỉ định đường dẫn như thế này trong hook_menu (): user-login/%/%/% Và xác định các đối số đường dẫn như thế này: 'path arguments' => array(1, 2, 3),. Điều này sẽ đảm bảo rằng hàm của bạn chỉ có thể được gọi với ba đối số này và chúng không phải là tùy chọn.

4
Berdir

Chỉ cần cho rõ ràng,

http://site.com/user-login?uid=2?Exiry=3?hash=sd7wdah

sẽ không hoạt động, nó sẽ là:

http://site.com/user-login?uid=2&Exiry=3&hash=sd7wdah

Lưu ý làm thế nào chỉ có một "?" và mỗi tham số bổ sung được phân tách bằng "&"

1
DeeZone