Programlı olarak bir blok oluşturdum ancak programa erişimi nasıl atayabileceğimi bilmiyorum. Nasıl başarabilirim?
Programlı olarak bir blok oluşturdum ancak programa erişimi nasıl atayabileceğimi bilmiyorum. Nasıl başarabilirim?
Yanıtlar:
Döndürülen dizideki "roller" dizisini ayarlamak hook_block_info()
işe yaramaz, çünkü:
Bir bloğu görmesine izin verilen ve kullanıcı arabiriminde ayarlanan roller , "block_role" tablosundaki block_admin_configure_submit () öğesinden kaydedilir.
$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();
Oturum açmış olan kullanıcıya hangi blokların gösterilmesi gerektiğine karar veren kod, hook_block_list_alter () 'in bir uygulaması olan block_block_list_alter () içinde bulunur ve yalnızca bu tablonun içeriğini kullanır
$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;
}
// …
}
Döndürülen verilerdeki roles özelliğini kontrol eden başka bir Drupal işlevi hook_block_info()
veya "block_role" tablosunun içeriği, hook_block_info()
uygulamalardan döndürülenle birleştirilmez .
Kullanıcının bloğu görmek için gereken role sahip olduğunu doğrulayabilirsiniz hook_block_view()
, ancak bu noktada Drupal zaten bloğu oluşturuyor; bu, önceden ayarlanmışsa kullanıcının yine de blok başlığını göreceği anlamına gelir.
Yapabileceğiniz şey, hook_block_list_alter()
kullanıcı gerekli role sahip olmadığında o blokla ilgili bilgileri kaldırmak için uygulamaktır .
Blokları yöneten kullanıcıların kafa karışıklığını önlemek için, bir bloğu düzenlemek için kullanılan formu da değiştiririm ve onu uygulayan modül kendi listesini kullanacağından, bu bloğu görebilecek rolleri ayarlamak için kullanılan form alanını devre dışı bırakardım. rolleri; en az kodun en azından rol ayarları hakkında herhangi bir etkisi olmayan bir ileti göstermelidir, ancak rol ayarları için form öğelerini de devre dışı bırakardım.
Blok modülü, hangi rollerin bir blok göreceğini seçmek için form alanlarını zaten gösterdiğinden, bloğunuz için bir varsayılan ayarlayabilir ve gerekirse yönetici kullanıcılarının bunu değiştirmesine izin verebilirsiniz.
Bir kullanıcının sahip olduğu izinleri kontrol etmek ve bir kullanıcının sahip olduğu izinleri kontrol etmekle ilgili olarak, sonuncusu, özellikle alternatif, bir modüldeki rollerin listesini zor kodlayacaksa tercih edilir.
Block modülünden görüldüğü gibi, izin kullanmak tek alternatif değildir: Bir modül, hangi rollerin bir şey görmesine izin verildiğine karar verme ayarına sahip olabilir.
Açıkçası, rollerin bir şey yapmasına izin verilen bir ayara sahip olmak her zaman değmez. Ayrıca, yönetici modüllerin, izinlerin kullanılması ve yönetici kullanıcılarının bunları ayarlamak için tek bir sayfa kullanmasına izin vermek yerine, rollerin bir şeyler yapmasına izin verilen kendi ayarlarına sahip olması durumunda ne anlama geleceğini hayal ediyorum.
Hook_block_info'nuzda şöyle bir şey deneyebilirsiniz:
$blocks['myblock'] = array(
...
'roles' => array(
'administrator' => '3',
'authenticated user' => '2',
)
Hook_block_info () ile blokları kendiniz yaptığınızı varsayarsak, hook_block_view () fonksiyonunuzda user_access () işlevini kullanabilirsiniz. Bunun bir örneği olduğu için api belgelerine göz atın .
Hook_block_info () içinde imkansızdır, ancak bunu başarmak için bu sorguyu kullanabilirsiniz. MODULE_NAME, BLOCK_DELTA ve RID değerlerini buna göre değiştirin
$query = db_insert('block_role')
->fields(array(
'module' => 'MODULE_NAME',
'delta' => 'BLOCK_DELTA',
'rid' => 2, // Authenticated User
))
->execute();
Hook_block_view içinde, global $user
kullanıcı hakkında bilgi almak için kullanabilirsiniz , daha sonra kullanıcının rolüne bağlı olarak farklı bir görev atayabilir block['subject']
ve block['content']
hatta bu rol için görünmez olacaksa engellenecek herhangi bir konu ve içerik atayamazsınız. işte bir örnek :
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;
}
bu kodu kullanarak kimliği doğrulanmış kullanıcılar (konuklar değil), kimliği doğrulanmış kullanıcılar için engelleme görünür hale gelir.