「何が」ページにアクセスできるかをどのように制限しますか? hook_permission()
アイテムへのアクセスを制御する役割に基づいてユーザー権限を設定するhook_menu()
の使用方法についてはほとんど理解していません。ただし、システム自体でのみ使用されるhook_menu()
アイテムがある場合はどうなりますか?たとえば、カスタムモジュールに登録ページがあるとします:module/register
-誰でもそのページにアクセスできます。次に、管理者専用の別のページがあるとします。それで、私はhook_menu()に別のアイテムを登録し、それをmodule/register/reg_user_details
と呼びます-誰もmodule/register/reg_user_details
を閲覧できるようにしたくない
代わりに、ユーザーがログインしているときにのみページが表示されるようにしたいので、hook_permission
をすでに作成しています
/**
* Implements hook_menu()
*
*/
function video_subtitles_menu() {
$items = array();
$items['video_subtitles/upload'] = array( //this creates a URL that will call this form at "video_subtitles_test/upload"
'title' => 'Upload Subtitle', //page title
'description' => 'Uploading subtitle for videos',
'page callback' => 'drupal_get_form', //this is the function that will be called when the page is accessed. for a form, drupal_get_form need to be used
'page arguments' => array('video_upload_subtitles_form'), //Name of the Uplaod Form
'access callback' => 'user_access',
'access arguments' => array('administer video_subtitles module'),
);
$items['player/video_subtitle_status'] = array(
'page callback' => 'video_subtitle_status',
'access callback' => 'user_access',
'access arguments' => array('administer video_subtitles status'),
);
return $items;
}
/**
* Implements hook_permission.
*/
function video_subtitles_permission() {
return array(
'administer video_subtitles module' => array(
'title' => t('Administer video_subtitles module'),
'description' => t('Access the video_subtitles upload module Page'),
),
'administer video_subtitles status' => array(
'title' => t('Administer video_subtitles module status'),
'description' => t('Access the video_subtitles module status Page'),
));
}
したがって、ユーザーはログインしていないとページにアクセスできませんが、ユーザーがadminとしてログインしていない場合は、ログインページにリダイレクトする必要があります。ログインに成功した場合は、ユーザーのページにリダイレクトする必要があります。
d-7/example/my-module
d-7/example/my-module
ページにリダイレクトした場合これを達成するための最良の方法は何ですか
同様の質問
sing-hook-menu-with-hook-permission-access-denied
最も簡単な方法は、page callback
関数でこのロジックを指定することです。例:
function SOME_PAGE_CALLBACK($someArg) {
if(user_is_anonymous()) {
drupal_goto('PATH_TO_LOGIN_PAGE');
}
// do_something();
}
別の方法は、hook_preprocess_page
関数でユーザーをチェックすることです。
function MY_THEME_preprocess_page(&$variables) {
if(curent_path() == 'SOME_PATH' && user_is_anonymous()) {
drupal_goto('PATH_TO_LOGIN_PAGE');
}
}
アクセスコールバック関数は、リクエストへのユーザーのアクセスをチェックし、ブール値TRUEまたはFALSEを返します。ユーザーがページにアクセスできるかどうかをチェックしたい場合は、次のようにすることができます。
$path = current_path();
if ($router_item = menu_get_item($path)) {
if (!$router_item['access']) {
drupal_goto('PATH_TO_LOGIN_PAGE');
}
}
Hook_menuですべてのユーザーにアクセスを許可します。
$items['player/my_page'] = array(
'title' => t('My Page'), // note this is a required parameter
'page callback' => 'my_page',
'access callback' => TRUE,
);
次に、ページコールバック関数で、ログインしていないユーザーをリダイレクトします。
function my_page() {
global $user;
if(!$user->uid) {
$dest = drupal_get_destination();
drupal_goto('user/login', $dest); / this remembers where the user is coming from
}
// Carry on with rest of code...
}
ここでCliveが指摘した別のアプローチは、アクセスコールバック関数でこのチェックを行い、ページの構築に関連するロジックのためにページコールバック関数を残すことです。これらの2つの異なるタスクを独自の機能に分離するため、これはより良いアプローチだと思います。