Этот ответ привел к дискуссии о том, как лучше перенаправить пользователя на определенную страницу, если у него не должно быть доступа к странице, к которой он пытается получить доступ.
Один из вариантов - установить для обратного вызова доступа значение true, а затем перенаправить пользователей в обратном вызове страницы. Хотя это кажется действительным, я думаю, что это сочетание функций доступа с функциями построения страницы в обратном вызове страницы.
Например
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
}
Другой вариант - установить функцию обратного вызова доступа для вызова функции, которая проверяет, есть ли у пользователя доступ, но затем вместо возврата false она перенаправляет пользователя на другую страницу. Это хорошо, поскольку разделяет логику доступа и логику построения страницы. Однако цель обратного вызова доступа - вернуть логическое значение, поэтому это нарушает эту логику, перенаправляя пользователя.
Например
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;
}
Есть ли нежелательные эффекты от перенаправления пользователей в обратном вызове доступа, о которых я не знаю?
Как вы думаете, что является лучшей практикой здесь?