martedì 12 ottobre 2010

joomla personalizzare il redirect dell'utente

Joomla! Reindirizzamento personalizzato dell'utente dopo il Login






Dal pannello di controllo di Joomla è possibile specificare il redirect dell'utente su di una pagina specifica dopo il login come indicato in questa immagine:

Joomla! reindirezzamento dell'utente dopo aver effettuato il Login
Joomla! reindirezzamento dell'utente dopo aver effettuato il Login
Tuttavia potremmo avere l'esigenza di redirezionare l'utente con un redirect utente "dinamico".


Come fare?



E' tutto gestito dal controller del componente com_user, modificarlo tuttavia significherebbe rendere il sito NON-UPGRADE-SAFE.

Anche questa volta come nel precedente tutorial sulla ricerca dei campi nel componente COM_CONTACTS di Joomla! Ci viene in aiuto l'override del componente nel template.

In effetti se aprite il file default_login.php nella cartella di com_user nella view LOGIN

Troverete alla riga 74:


echo $this->return prende il valore del parametro specificato nel pannello di amministrazione.

sostituendolo con una variabile contenente l'indirizzo della pagina dove mandare l'utente potrete personalizzare il login dell'utente di Joomla o il logout dell'utente

Bisogna però fornire l'indirizzo in questo formato:

index.php?option=com_nomecomponente&itemid=iddellitem&altriparametri

Inoltre il valore viene accettato solo se in formato base_64 quindi occore usare la funzione base64_encode di PHP.

Se avete installato Joomfish! il reidirect dell'utente può creare difficoltà, dove quindi rimuovere dalla stringa il parametro &lang=it dalla stringa.

Ecco l'esempio del mio sito web:

//ottengo la pagina di provenienza dell'utente tramite PHP
$redirectUrl=$_SERVER['HTTP_REFERER'];
//divido l'url ottenuto con explode in base al "?" in 2 array
$redirectUrl=explode("?",$redirectUrl);
//prendo il secondo elemento - quello con i parametri - e creo un nuovo array in base alla "&"
$redirectUrl=explode("&;",$redirectUrl[1]);
//ricostruisco la stringa e gli dico di prendere tutti i parametri tranne l'ultimo
for( $i=0; $i<(count($redirectUrl)-1); $i++ ){
$str_redirectUrl=$str_redirectUrl . $redirectUrl[$i];
  //l'ultima volta non devo aggiungere la "&"
if($i<(count($redirectUrl)-2)){
$str_redirectUrl=$str_redirectUrl . "&";
}
}
//a volte$_SERVER['HTTP_REFERER'] può essere vuoto o non formattato correttamente - il browser può non fornire queste informazioni a seconda delle impostazioni di sicurezza - se il valore è vuoto prendo il valore inserito dal pannello di amministrazione
if( count($redirectUrl)<0 ){
$str_redirectUrl="index.php?".$str_redirectUrl;
$str_redirectUrl=base64_encode( $str_redirectUrl );
}else{
$str_redirectUrl = $this->return;
}

Come al solito è una base di partenza, lo script può essere personalizzato in base alle più disparate esigenze.

6 commenti:

  1. io non vedo nemmeno la scheda "parametri - standard" visualizzata in figura... dove la trovo???

    RispondiElimina
  2. É in tutti i componenti e i moduli a destra, che versione di Joomla usi? Inoltre l'articolo riguarda il componente, non il modulo. Verifica queste due cose..

    RispondiElimina
  3. è davvero interessante ciò che hai scritto. Io ho un problema diverso.... ho installato virtuemart ed ho creato diverse categorie, ad una categoria appartiene un solo utente, mi spiego:
    CATEGORIA 1 -> Utente admin
    CATEGORIA 2 -> Utente admin2
    CATEGORIA 3 -> Utente admin3
    Creando degli utenti standard che, una volta effettuata la scelta dei prodotti devono creare un account realistico per poter acquistare...
    è una cosa a mio avviso impossibile da fare in quanto joomla non ha nulla di simile..
    Tu che consigli mi dai in merito?

    RispondiElimina
  4. Beh, senza mettere mano al codice temo sia impossibile, io ti suggerirei di creare un'associazione CATEGORIA->UTENTE e gestirla con un semplice componente in un'altra tabella in maniera da non modificare il core di Joomla! e Virtuemart e mantenerli quindi upgrade-safe. Poi potresti creare una nuova classe di Virtuemart, includerla nel tema e gestire la logica da lì. E' un po' generica come risposta ma con le informazioni che mi hai dato non posso essere più preciso.. se vuoi possiamo sentirci su Skype!

    RispondiElimina
  5. un'altra soluzione potrebbe essere la creazione di sottocategorie non pubblicate per ogni categoria di prodotti. A questo punto si potrebbe utilizzare il nome della sottocategoria come CODICE per la categoria principale. Dopodichè basterebbe effettuare una query nel tema di VM che mostra i contenuti in base all'inserimento del codice della categoria.

    RispondiElimina