[*Closed*] Problemi con Blocchi e Priorità o Eredità dei Ruoli

8 contenuti / 0 new
Ultimo contenuto
[*Closed*] Problemi con Blocchi e Priorità o Eredità dei Ruoli

Tra i ruoli impostati ho l'utente anonimo, l'utente autenticato ed un'altro ruolo che è l'utente prova.

Succede che NON riesco a rendere un blocco invisibile all'utente prova.
L'utete prova per essere tale deve essere anche un utente autenticato, di conseguenza se io imposto all'itnerno di un blocco che questo deve essere visibile solo all'utente anonimo e a quello autenticato... capita che anche l'utente prova vede il blocco sebbene si sia evitato di abilitare la cosa.

Come risolvo la questione, senza dover compromettere l'utente autenticato?

se capisco bene, vuoi che un utente autenticato ma appartenente ad un ruolo specifico non possa accedere ad un blocco visibile agli utenti autenticati.
forse qui trovi una soluzione: http://drupal.org/node/64135

in particolare:

<?php
global $user;
$allowed = array('moderator','administrator');
$valid=FALSE;
foreach(
$user->roles as $role){
  if(
in_array($role, $allowed)) {
   
$valid=TRUE;
  }
}
return
$valid;
?>

Ok!... mi è chiaro.
Preferisco + questo codice qui

<?php
global $user;
// These are the roles who should not see this block
$notallowed = array('anonymous user','artist','GoZabo Administrator', 'SuperAdmin');
// Assume they can see it to start
$valid=TRUE;
// Go through each role the user is in and, if we hit a role that is not allowed to see it, set valid to false
foreach($user->roles as $role){
  if(
in_array($role, $notallowed)) {
   
$valid=FALSE;
  }
}
// If no roles were hit that aren't allowed, this will still be true. Otherwise it will be false.
return $valid;
?>

Ma c'è una cosa da prendere in considerazione: non sono previsti permessi per gestire queste cose.
Questo non è positivo, non bisogna solo far ereditare i permessi dall'utente autenticato, bisogna che drupal abbia di suo strumenti per la gestione di queste cose tramite i ruoli.

Adesso la soluzione sarebbe quella di applicare a mano il codice php su tutti i blocchi in cui serve, o fare una funzione in template.php

mmm... non è una cosa felice secondo me :-(

Un pelo più efficiente...

<?php
global $user;
// These are the roles who should not see this block
$notallowed = array('anonymous user','artist','GoZabo Administrator', 'SuperAdmin');
// Go through each role the user is in and, if we hit a role that is not allowed to see it, return false
foreach ($user->roles as $role){
  if (
in_array($role, $notallowed)) {
    return
FALSE;
  }
}
// No roles were hit that aren't allowed.
return TRUE;
?>

Ruoli e permessi sono accumulativi (OR). Quindi se lo dai un permesso ad autenticato, non può essere dopo 'tolto' da prova.

jscm wrote:
Adesso la soluzione sarebbe quella di applicare a mano il codice php su tutti i blocchi in cui serve, o fare una funzione in template.php

mmm... non è una cosa felice secondo me :-(

Infatti, se cambi la lista, avrai un bel da fare... Meglio creare un modulo, con la funzione scritta sopra, e semplicemente chiamare la funzione nei blocchi o template. Allora se devi cambiare la lista, sai che c'è uno solo e anche dov'è (nella funzione del tuo modulo). La tecnica si chiama DRY (don't repeat yourself).

Più imparo, più dubito.

jhl.verona wrote:

Infatti, se cambi la lista, avrai un bel da fare... Meglio creare un modulo, con la funzione scritta sopra, e semplicemente chiamare la funzione nei blocchi o template. Allora se devi cambiare la lista, sai che c'è uno solo e anche dov'è (nella funzione del tuo modulo). La tecnica si chiama DRY (don't repeat yourself).

Al momento ho risolto così: funzione in template.php e inserita la riga <?php print nomefunzione(); ?> in tutti i blocchi interessati, in tutti i siti.

la Tecnica DRY come faccio ad applica su un sistema come Drupal?!.. intendo dire, come faccio ad evitare inserimenti multipli da fare a mano su tutti i blocchi.

Inserendo funzioni in template.php ho già semplificato molte cose, ma devo sempre inserire a mano una stringa di questo tipo su tutti i blocchi interessati <?php print nomefunzione(); ?>.

Come evito tale cosa? e poi, tutto questo codice aggiunto, con Drupal 7 mi potrebbe creare un fiume di problemi, in particolare in questo caso http://www.drupalitalia.org/node/7225 ?

Più DRY di così, non si può.
Ho sequito quel thread, dò il mio voto a http://www.drupalitalia.org/node/7225#comment-21802 - anche quello è DRY. (tutto il codice in un filtro, eseguito una volta solo).
Per D7, aspetto che arriva, poi mi faschio la testa...

Più imparo, più dubito.

jhl.verona wrote:
Più DRY di così, non si può.
Ho sequito quel thread, dò il mio voto a http://www.drupalitalia.org/node/7225#comment-21802 - anche quello è DRY. (tutto il codice in un filtro, eseguito una volta solo).
Per D7, aspetto che arriva, poi mi faschio la testa...

Ma se volessi trovare un modo per evitare di dover inserire a mano le stringhe

<?php
 
print nomefunzione();
?>
su ogni blocco in cui è necessario che ci siano, come dovrei fare?

@jscm: purtroppo non è possibile fare l'overriding delle operazioni di visualizzazione dei blocchi (per lo meno ieri ho cercato un pò e non ne ho tirato fuori molto), quindi io mi sono limitato a fare una query nel DB direttamente in phpmyadmin per andare a fare la insert nella tabella blocks :P

Ciao
Marco
--
My blog
Working at @agavee