Chuyển hướng người dùng trong cuộc gọi lại truy cập của hook_menu có bất kỳ tác dụng không mong muốn nào không?


8

Câu trả lời này đã dẫn đến một cuộc thảo luận về cách tốt nhất để chuyển hướng người dùng đến một trang cụ thể nếu họ không nên truy cập vào trang mà họ đang cố truy cập.

Một tùy chọn là đặt cuộc gọi lại truy cập thành đúng và sau đó chuyển hướng người dùng trong cuộc gọi lại trang. Mặc dù điều này có vẻ hợp lệ nhưng tôi nghĩ rằng nó đang trộn chức năng truy cập với chức năng xây dựng trang trong cuộc gọi lại trang.

Ví dụ

function hook_menu() {
    $items['player/my_page'] = array(
        'title' => t('My Page'), // note this is a required parameter
        'access callback' => TRUE,
        'page callback' => 'some_function',
    );
    return $items;
}

function some_function() {
    global $user;   
    if(!$user->uid) { // here checking if the user is logged in but could be checking for a specific permission or field value
        $dest = drupal_get_destination();
        drupal_goto('user/login', $dest); // this remembers where the user is coming from
    }
    // carry on building rest of page
}

Một tùy chọn khác là đặt chức năng gọi lại truy cập để gọi một chức năng kiểm tra xem người dùng có quyền truy cập hay không, nhưng sau đó thay vì trả về sai, nó sẽ chuyển hướng người dùng sang trang khác. Điều này là tốt vì nó tách biệt logic truy cập và logic xây dựng trang. Tuy nhiên, mục đích của một cuộc gọi lại truy cập là trả về giá trị boolean, vì vậy điều này phá vỡ logic đó bằng cách chuyển hướng người dùng.

Ví dụ

function hook_menu() {
    $items['player/my_page'] = array(
        'title' => t('My Page'), // note this is a required parameter
        'access callback' => 'check_access',
        'page callback' => 'some_function',
    );
    return $items;
}

function check_access() {
    global $user;
    // here checking if the user is logged in but could be checking for a specific permission or field value
    if(!$user->uid) {
        $dest = drupal_get_destination();
        drupal_goto('user/login', $dest);
    }
    return TRUE;
}

Có bất kỳ tác dụng không mong muốn nào từ việc chuyển hướng người dùng trong cuộc gọi lại truy cập mà tôi không biết?

Bạn nghĩ gì là thực hành tốt nhất ở đây?


thêm một dấu gạch chéo vào bình luận php trong cuộc gọi lại trang :) đánh dấu cú pháp không hoạt động tốt
xurshid29

5
Tôi nghĩ, nhưng không tích cực, rằng nếu bạn thêm đường dẫn này vào menu, một số điều rất kỳ lạ sẽ xảy ra b / c, cuộc gọi lại truy cập được sử dụng để tìm hiểu xem mục menu có thể được hiển thị cho một người dùng cụ thể không.
mpdon Arena

Câu trả lời:


6

Tôi nghĩ bạn có thể làm điều này bằng cách thay đổi chức năng gọi lại phân phối. Nếu cuộc gọi lại truy cập trả về FALSEthì đó là những gì được chuyển cho cuộc gọi lại phân phối. Nếu bạn muốn hành vi chuyển hướng này chỉ trên các trang cụ thể, bạn có thể sửa đổi cuộc gọi lại phân phối chỉ cho các trang đó thông qua hook_menu()hoặc hook_menu_alter(). Nếu bạn muốn hành vi là toàn cầu, bạn có thể sử dụng một hook_page_delivery_callback_alter()để thay đổi nó.

Đây là một ví dụ gọi lại giao hàng.

function custom_deliver_html_page($page_callback_result) {
  if ($page_callback_result === MENU_ACCESS_DENIED) {
    drupal_goto('<front>');
  }
  drupal_deliver_html_page($page_callback_result);
 }

Btw điều này chưa được kiểm tra và tôi chưa bao giờ thực sự thay đổi cuộc gọi lại giao hàng trước đây.


Điều này nghe có vẻ như là một cách tiếp cận thú vị ...
Felix Eve

Khẳng định công trình này. Cách sạch hơn là chuyển hướng trong cuộc gọi lại truy cập. Thêm vào hook_menu_alter:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
wxactly

3

Tôi sẽ không làm điều đó trong cuộc gọi lại truy cập. Nếu một nhà phát triển khác muốn thay đổi page_callbackvào một thời điểm nào đó trong tương lai, họ sẽ gãi đầu về lý do tại sao cuộc gọi lại không hoạt động khi bạn chuyển hướng trong cuộc gọi lại truy cập.


Điều này có ý nghĩa và tôi nghĩ nhận xét của MPD cũng có ý nghĩa tốt.
Đêm giao thừa
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.