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?
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?
Risposte:
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.
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.
Nel tuo hook_block_info potresti provare qualcosa del tipo:
$blocks['myblock'] = array(
...
'roles' => array(
'administrator' => '3',
'authenticated user' => '2',
)
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.
È 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();
In hook_block_view, è possibile utilizzare global $user
per 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.