프로그래밍 방식으로 블록을 만들었지 만 프로그래밍 방식으로 액세스를 할당하는 방법을 모르겠습니다. 어떻게하면 되나요?
프로그래밍 방식으로 블록을 만들었지 만 프로그래밍 방식으로 액세스를 할당하는 방법을 모르겠습니다. 어떻게하면 되나요?
답변:
반환 된 배열에서 "역할"배열을 설정하면 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;
}
// …
}
에서 반환 된 데이터 의 역할 속성 을 확인하는 또 다른 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_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;
}
이 코드를 사용하면 게스트가 아닌 인증 된 사용자가 인증 된 사용자에게 블록이 표시됩니다.