Bir bloğa erişimi programlı olarak nasıl atarım?


10

Programlı olarak bir blok oluşturdum ancak programa erişimi nasıl atayabileceğimi bilmiyorum. Nasıl başarabilirim?


Sorunuzu genişletip kodunuzu gösterebilir misiniz?
Triskelion

Blok kodun kendisinde kullanıcıyı (global $ kullanıcısı) arayabilir ve bağlantıdaki yöntemi kullanarak rollerini kontrol edebilirsiniz. bywombats.com/blog/ryan/10-25-2007/…
user6614

Paneller modülünün blokları değil, bölgeleri kullanan bazı mükemmel erişim kontrolleri vardır.
Louis

Yanıtlar:


10

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.

ekran görüntüsü

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.


Açıkçası bununla en uygun cevap olarak gitmek zorunda kalacağım. Drupal bloklarının perde arkasında nasıl çalıştığını gerçekten anlamaya yardımcı olduğu için ayrıntılı açıklama için teşekkür ederiz.
user5013

1

Hook_block_info'nuzda şöyle bir şey deneyebilirsiniz:

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

Bu, hangi rollerin erişime sahip olduğunu tanımlayıp Drupal'ın bir kullanıcının erişip erişemeyeceğini belirlemesine izin verirken bunu programlı bir yaklaşım kullanarak uygulamanın en iyi yolu gibi görünüyor. Bu yaklaşımın herhangi bir dezavantajını kaçırdım mı?
user5013

Programlı olarak yapmanız gerekiyorsa, evet. Olumsuz. Ancak, sadece / admin / structure / block'a gitmeye ve bloğa roller atamaya karşı çok iyi bir kullanım durumu olacağını varsayıyorum .
Triskelion

Kullanım durumu, kullanıcının ayarını otomatik olarak yapar, böylece yapmaları gerekmez. Kesinlikle bir kolaylık sorunu. Ayarlandıktan sonra, özel ihtiyaçlarına uygun değilse, olmasını istedikleri şeyle değiştirebilirler.
user5013

1
Bu işe yaramıyor; neden olmasın diye cevabımı gör.
kiamlaluno

0

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 .


Evet user_access kullanmayı düşünmeliydim. Tamamen aklımı kaçırdı - D'oh. Rol erişimini kullanmayı düşünüyorum ama belki izin erişimi daha iyi bir yol olabilir.
user5013

0

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();

0

Hook_block_view içinde, global $userkullanı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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.