Akankah mengarahkan ulang pengguna dalam panggilan balik akses hook_menu memiliki efek yang tidak diinginkan?

8

Jawaban ini mengarah pada diskusi tentang cara terbaik untuk mengarahkan pengguna ke halaman tertentu jika mereka tidak memiliki akses ke halaman yang mereka coba akses.

Salah satu opsi adalah untuk mengatur akses balik ke true dan kemudian mengarahkan pengguna ke halaman panggilan balik. Sementara ini tampaknya valid saya pikir itu mencampur fungsionalitas akses dengan fungsi membangun halaman di halaman panggilan balik.

Misalnya

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
}

Pilihan lain adalah mengatur fungsi akses balik untuk memanggil fungsi yang memeriksa apakah pengguna memiliki akses, tetapi alih-alih mengembalikan false, itu akan mengarahkan pengguna ke halaman lain. Ini bagus karena memisahkan logika akses dan logika pembuatan halaman. Namun tujuan dari panggilan balik akses adalah untuk mengembalikan nilai boolean, jadi ini melanggar logika itu dengan mengarahkan ulang pengguna.

Misalnya

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

Apakah ada efek yang tidak diinginkan dari mengarahkan ulang pengguna dalam panggilan balik akses yang saya tidak ketahui?

Menurut Anda apa praktik terbaik di sini?

Felix Eve
sumber
tambahkan satu slash lagi ke komentar php di callback halaman :) penyorotan sintaks tidak berfungsi dengan baik
xurshid29
5
Saya pikir, tetapi saya tidak positif, bahwa jika Anda menambahkan path ini ke menu beberapa hal yang sangat aneh akan terjadi b / c akses balik digunakan untuk mencari tahu apakah item menu dapat ditampilkan untuk pengguna tertentu.
mpdonadio

Jawaban:

6

Saya pikir Anda bisa melakukan ini dengan mengubah fungsi pengiriman panggilan balik. Jika akses panggilan balik kembali FALSEitulah yang diteruskan ke panggilan balik pengiriman. Jika Anda menginginkan perilaku pengalihan ini hanya pada halaman tertentu, Anda dapat mengubah callback pengiriman hanya untuk halaman tersebut melalui hook_menu()atau hook_menu_alter(). Jika Anda ingin perilaku menjadi global, Anda dapat menggunakan hook_page_delivery_callback_alter()untuk mengubahnya.

Berikut ini contoh panggilan balik pengiriman.

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 ini belum diuji, dan saya tidak pernah benar-benar mengubah callback pengiriman saya sebelumnya.

Andy
sumber
Ini kedengarannya seperti pendekatan yang menarik ...
Felix Eve
Dikonfirmasi ini berfungsi. Jauh lebih bersih daripada mengarahkan kembali pada panggilan balik akses. Tambahkan ke hook_menu_alter:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
wxactly
3

Saya tidak akan melakukannya di akses balik. Jika pengembang lain ingin mengubah page_callbackdi beberapa titik di masa depan, mereka akhirnya akan menggaruk-garuk kepala mengapa callback tidak berfungsi ketika Anda mengarahkan kembali dalam akses panggilan balik.

awm
sumber
Ini masuk akal, dan saya pikir komentar MPD juga bagus.
Felix Eve