プログラムでブロックへのアクセスを割り当てるにはどうすればよいですか?


10

プログラムでブロックを作成しましたが、プログラムでブロックにアクセス権を割り当てる方法がわかりません。どうすればそれを達成できますか?


あなたの質問を拡張してあなたのコードを見せてもらえますか?
Triskelion

ブロックコード自体で、ユーザー(グローバル$ user)を検索し、リンクのメソッドを使用してその役割を確認できます。bywombats.com/blog/ryan/10-25-2007/...
user6614

パネルモジュールには、ブロックではなく、リージョンを使用した優れたアクセス制御がいくつかあります。
ルイ

回答:


10

から返された配列に「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個のモジュールに、権限を使用する代わりに役割が何かを実行するための独自の設定を持ち、管理者ユーザーが単一のページを使用してそれらを設定できるようにする場合、管理者ユーザーにとって何が意味するかについても想像します。


さて、私は明らかにこれを最も適切な答えとして使用する必要があります。Drupalブロックがバックグラウンドでどのように機能するかを理解するのに役立つので、詳細な説明をありがとうございます。
user5013 2013

1

あなたのhook_block_infoであなたは次のようなことを試すことができます:

$blocks['myblock'] = array(
   ...
   'roles' => array(
      'administrator' => '3',
      'authenticated user' => '2',
   )

これは、アクセス権を持つロールを定義し、ユーザーがアクセスできるかどうかをDrupalに決定させるときに、プログラムによるアプローチを使用してこれを実装する最良の方法のようです。このアプローチの欠点を逃しましたか?
user5013 2013

プログラムで行う必要がある場合は、そうです。欠点はありません。ただし、単に/ admin / structure / blockに移動してブロックにロールを割り当てることに対して、非常に良いユースケースが必要になると思います。
Triskelion 2013

ユースケースは、ユーザーが自動的にセットアップを行うため、ユーザーが行う必要はありません。厳密には利便性の問題です。いったん設定したら、特定のニーズに合わない場合は、希望するものに変更できます。
user5013 2013

1
これは機能しません。それができない理由については私の答えを見てください。
kiamlaluno

0

hook_block_info()を使用して自分でブロックを作成していると仮定すると、hook_block_view()関数でuser_access()を実行できます。彼らはこれの例を持っているので、APIドキュメントをチェックしてください。


はい、user_accessの使用について考えるべきでした。完全に私の心を滑らせた-D'oh。ロールアクセスの使用を考えていますが、おそらくアクセス許可の方が良い方法かもしれません。
user5013 2013

0

hook_block_info()では不可能ですが、このクエリを使用してこれを実現できます。MODULE_NAME、BLOCK_DELTA、RIDを適宜変更します

$query = db_insert('block_role')
  ->fields(array(
    'module' => 'MODULE_NAME', 
    'delta' => 'BLOCK_DELTA', 
    'rid' => 2, // Authenticated User
  ))
  ->execute();

0

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

このコードを使用すると、認証されたユーザー(ゲストではない)が、認証されたユーザーに対してブロックされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.