Come posso assegnare a livello di codice l'accesso a un blocco?


10

Ho creato un blocco a livello di codice ma non so come posso assegnare a livello di codice l'accesso ad esso. Come posso raggiungerlo?


Potresti espandere la tua domanda e mostrare il tuo codice?
Triskelion,

Nel codice di blocco stesso è possibile cercare l'utente ($ user globale) e verificarne il ruolo utilizzando il metodo nel collegamento. bywombats.com/blog/ryan/10-25-2007/…
user6614

Il modulo Pannelli ha alcuni ottimi controlli di accesso che utilizzano le regioni, non i blocchi.
Louis,

Risposte:


10

L'impostazione della matrice "ruoli" nella matrice restituita hook_block_info()non funziona perché:

  • I ruoli a cui è consentito visualizzare un blocco e che sono impostati nell'interfaccia utente, vengono salvati da block_admin_configure_submit () nella tabella "block_role"

    $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();
    
  • Il codice che decide quali blocchi devono essere mostrati all'utente attualmente connesso è contenuto in block_block_list_alter () , che è un'implementazione di hook_block_list_alter () e utilizza solo il contenuto di quella tabella

    $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;
      }
    
      // …
    
    }
    
  • Non esiste un'altra funzione Drupal che controlla la proprietà dei ruoli nei dati restituiti hook_block_info(), né il contenuto della tabella "block_role" è unito a ciò che è restituito dalle hook_block_info()implementazioni.

Potresti verificare che l'utente abbia il ruolo richiesto per vedere il blocco hook_block_view(), ma a quel punto Drupal sta già eseguendo il rendering del blocco; ciò significa che l'utente vedrebbe comunque il titolo del blocco, se ne è già stato impostato uno.

Quello che puoi fare è implementare hook_block_list_alter()per rimuovere le informazioni su quel blocco quando l'utente non ha il ruolo richiesto.
Per evitare confusione con gli utenti che amministrano i blocchi, altererei anche il modulo utilizzato per modificare un blocco e disabiliterei il campo modulo utilizzato per impostare quali ruoli possono vedere quel blocco, poiché il modulo che lo implementa utilizzerà il proprio elenco di ruoli; il codice minimo dovrebbe almeno mostrare un messaggio sulle impostazioni del ruolo che non hanno alcun effetto, ma disabiliterei anche gli elementi del modulo per le impostazioni del ruolo.

Poiché il modulo Blocco mostra già i campi modulo per selezionare quali ruoli vedono un blocco, è possibile anche semplicemente impostare un valore predefinito per il blocco e consentire agli utenti amministratori di modificarlo, se necessario.

immagine dello schermo

Per quanto riguarda il controllo dei ruoli di un utente rispetto al controllo delle autorizzazioni di un utente, l'ultimo è preferito, soprattutto quando l'alternativa sarebbe codificare un elenco di ruoli in un modulo.
Come mostrato dal modulo Block, l'uso dell'autorizzazione non è l'unica alternativa: un modulo potrebbe avere delle impostazioni per decidere quali ruoli possono vedere qualcosa.
Chiaramente, non vale sempre la pena avere un'impostazione per cui i ruoli sono autorizzati a fare qualcosa. Immagino anche cosa significherebbe per gli utenti amministratori se 10 moduli avessero le proprie impostazioni per i ruoli autorizzati a fare qualcosa, invece di utilizzare le autorizzazioni e consentire agli utenti amministratori di utilizzare una singola pagina per impostarli.


Beh, ovviamente dovrò scegliere questa come la risposta più appropriata. Grazie per la spiegazione dettagliata in quanto aiuta davvero a capire come i blocchi Drupal funzionano dietro le quinte.
user5013

1

Nel tuo hook_block_info potresti provare qualcosa del tipo:

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

Questo sembra il modo migliore per implementarlo usando un approccio programmatico mentre definisci quali ruoli hanno accesso e poi lasci che Drupal determini se un utente può accedervi o meno. Ho perso qualche aspetto negativo di questo approccio?
user5013

Se devi farlo in modo programmatico, sì. Nessun aspetto negativo. Tuttavia, suppongo che dovrebbe esserci un ottimo caso d'uso semplicemente andando su / admin / struttura / blocco e assegnando ruoli al blocco.
Triskelion,

Il caso d'uso verrebbe automaticamente impostato per l'utente in modo che non dovrebbero farlo. Rigorosamente un problema di convenienza. Una volta impostati, potrebbero quindi cambiarlo in quello che vogliono che sia se non soddisfa i loro bisogni particolari.
user5013

1
Questo non funziona; vedere la mia risposta per il motivo per cui non lo fa.
kiamlaluno

0

Supponendo che tu stia facendo i blocchi da solo con hook_block_info (), allora potresti semplicemente fare user_access () nella tua funzione hook_block_view (). Dai un'occhiata ai documenti API perché ne hanno un esempio.


Sì, avrei dovuto pensare di usare user_access. Mi è completamente sfuggito di mente - D'oh. Sto pensando di utilizzare l'accesso ai ruoli, ma forse l'accesso alle autorizzazioni potrebbe essere un modo migliore di procedere.
user5013

0

È impossibile in hook_block_info (), ma è possibile utilizzare questa query per ottenerlo. Modifica MODULE_NAME, BLOCK_DELTA e RID di conseguenza

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

0

In hook_block_view, è possibile utilizzare global $userper ottenere informazioni sull'utente, quindi in base al ruolo dell'utente è possibile assegnare diversi block['subject']e block['content']o addirittura non assegnare alcun argomento e contenuto da bloccare se sarà invisibile per quel ruolo. ecco un esempio:

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

utilizzando questo codice gli utenti autenticati (non gli ospiti) avranno il blocco reso visibile per gli utenti autenticati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.