プログラムでブロックを作成しましたが、プログラムでブロックにアクセス権を割り当てる方法がわかりません。どうすればそれを達成できますか?
プログラムでブロックを作成しましたが、プログラムでブロックにアクセス権を割り当てる方法がわかりません。どうすればそれを達成できますか?
回答:
から返された配列に「roles」配列を設定しても、次のhook_block_info()
理由により機能しません。
ブロックの表示を許可され、ユーザーインターフェースで設定されたロールは、「block_role」テーブルのblock_admin_configure_submit()から保存されます。
$query = db_insert('block_role')->fields(array('rid', 'module', 'delta'));
foreach (array_filter($form_state['values']['roles']) as $rid) {
$query->values(array(
'rid' => $rid,
'module' => $form_state['values']['module'],
'delta' => $form_state['values']['delta'],
));
}
$query->execute();
現在ログインしているユーザーにどのブロックを表示するかを決定するコードは、hook_block_list_alter()の実装であるblock_block_list_alter()に含まれており、そのテーブルのコンテンツのみを使用します
$result = db_query('SELECT module, delta, rid FROM {block_role}');
foreach ($result as $record) {
$block_roles[$record->module][$record->delta][] = $record->rid;
}
foreach ($blocks as $key => $block) {
if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
// This block was added by a contrib module, leave it in the list.
continue;
}
// If a block has no roles associated, it is displayed for every role.
// For blocks with roles associated, if none of the user's roles matches
// the settings from this block, remove it from the block list.
if (isset($block_roles[$block->module][$block->delta]) && !array_intersect($block_roles[$block->module][$block->delta], array_keys($user->roles))) {
// No match.
unset($blocks[$key]);
continue;
}
// …
}
から返されたデータのrolesプロパティをチェックする別のDrupal関数はなくhook_block_info()
、「block_role」テーブルの内容はhook_block_info()
実装から返されたものとマージされません。
ユーザーがでブロックを表示するために必要な役割を持っていることを確認できますが、hook_block_view()
その時点でDrupalはすでにブロックをレンダリングしています。つまり、ブロックタイトルが既に設定されている場合でも、ユーザーにはブロックタイトルが表示されます。
あなたができることはhook_block_list_alter()
、ユーザーが必要な役割を持っていないときに、そのブロックに関する情報を削除するように実装することです。
ブロックを管理するユーザーの混乱を避けるために、ブロックを編集するために使用されるフォームを変更し、そのブロックを表示できるロールを設定するために使用されるフォームフィールドを無効にします。これを実装するモジュールは独自のリストを使用するためです役割の; 最小限のコードでは、役割の設定が何の効果もないというメッセージを少なくとも表示する必要がありますが、役割の設定のフォーム要素も無効にします。
ブロックモジュールにはすでにブロックを表示するロールを選択するフォームフィールドが表示されているため、ブロックのデフォルトを設定して、必要に応じて管理者ユーザーが変更できるようにすることもできます。
ユーザーが持つ役割をチェックすることと、ユーザーが持つ権限をチェックすることの両方に関して、最後の方法が推奨されます。特に、代替手段がモジュール内のロールのリストをハードコーディングする場合はそうです。
ブロックモジュールからわかるように、許可を使用することが唯一の選択肢ではありません。モジュールは、何かを見ることができるロールを決定するための設定を持つことができます。
明らかに、ロールが何かを実行できるように設定することは常に価値があるとは限りません。また、10個のモジュールに、権限を使用する代わりに役割が何かを実行するための独自の設定を持ち、管理者ユーザーが単一のページを使用してそれらを設定できるようにする場合、管理者ユーザーにとって何が意味するかについても想像します。
あなたのhook_block_infoであなたは次のようなことを試すことができます:
$blocks['myblock'] = array(
...
'roles' => array(
'administrator' => '3',
'authenticated user' => '2',
)
hook_block_info()を使用して自分でブロックを作成していると仮定すると、hook_block_view()関数でuser_access()を実行できます。彼らはこれの例を持っているので、APIドキュメントをチェックしてください。
hook_block_viewでは、あなたが使用することができglobal $user
、ユーザーの役割に基づいて、さまざま割り当てることができ、ユーザーに関する情報を取得するblock['subject']
と、block['content']
または、その役割のために見えないように起こっている場合でも、ブロックに任意の件名と内容を割り当てないでください。ここに例があります:
function ModuleNAME_block_view($delta = '') {
switch ($delta) {
case 'Your_BLOCK' :
Global $user;
if($user->uid != '0') {
$block['subject'] = 'SUBJECT';
$block['content'] = 'SOME CONTENT OR A FUNCTION FOR BLOCK';
}
break;
}
return $block;
}
このコードを使用すると、認証されたユーザー(ゲストではない)が、認証されたユーザーに対してブロックされます。