Tutorial Avanzati - Chi è on-line? (Versione AJAX) by Stefano Silvestrini - Xoops Italia


left Login right
Nome utente:

Password:


Hai perso la password?
Registrati ora!
left Ricerca right
left Community right
left Collaborare right
left Supporto right
left Access Key right
  • ALT+1 Home
  • ALT+2 News
  • ALT+3 Forum
  • ALT+4 Downloads
  • ALT+5 Contattaci
  • ALT+6 Faq
[Maiusc+Alt] con FFox 2 [Alt+Invio] con IExplorer
left Statistiche right
Utenti registrati:
Oggi: 0
Ieri: 1
Totali: 5604
Ultimo: saul

Utenti online:
Ospiti : 16
Membri : 0
Totali: 16
Lista utenti [Popup]

Tutorial Avanzati :: Sviluppo e Hack

Chi è on-line? (Versione AJAX) by Stefano Silvestrini


Chi è on-line? (Versione AJAX) by Stefano Silvestrini
Un guida completa sulla costruzione di un blocco "Utenti on-line" basato su AJAX. Il blocco si ricaricherà senza bisogno di caricare l'intera pagina mostrando di volta in volta gli EFFETTIVI utenti presenti sul sito.
Creare un blocco utenti on-line basato su AJAX!
Come promesso, eccomi a scrivere un bel tutorial del blocco Utenti on line AJAX che trovate in home di Xoops Italia.

I vantaggi dell'AJAX sono molteplici e nel nostro caso particolare ci aiuta a ricaricare un blocchetto (contenente una query) senza dover ricaricare l'intera pagina.

PASSO 1:

Copiate ed incollate questo codice dentro una pagina vuota:

<?php
include 'mainfile.php';

// Hack by Stefano Silvestrini - www.stefanosilvestrini.com
// 12 gennaio 2008
// Per cortesia non levare i crediti

    
$sql "SELECT * FROM ".$xoopsDB->prefix('online')." ORDER BY online_updated DESC";

    
$result $xoopsDB->query($sql);
    
    if(!
$result) {
       echo 
"Errore: ".mysql_error();
       exit;
       }

    echo
"
    <div style='font-size: 11px;'>
    "
;
    
    
$count 0;

    while(
$myrow $xoopsDB->fetchArray($result)) {
    
    if (
$myrow['online_uid'] == '0') {
        
$username 'Anonimo';
        } else {
        
$username "<a href='http://www.tuosito.com/userinfo.php?uid=".$myrow['online_uid']."'><b>".$myrow['online_uname']."</b></a>";
        }
        
        if (
$count !=0) {$start=', ';}
        
        echo
"".$start."".$username."";
        
        
$count++;
    
        } 
// chiudo il while

    
echo" (Totale: ".$count.")</div>";
?>


salvate il file come users-on-line.php e chiudete.

Prendete il file users-on-line.php appena creato e mettetelo nella root del vostro sito Xoops.

PASSO 2:

Andiamo in amministrazione e creiamo un blocco personalizzato HTML ed inseriamo questo codice:


<script type="text/javascript">
function 
Ajax(){
var 
xmlHttp;
    try{    
        
xmlHttp=new XMLHttpRequest();// Firefox, Opera 8.0+, Safari
    
}
    catch (
e){
        try{
            
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer
        
}
        catch (
e){
            try{
                
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (
e){
                
alert("No AJAX!?");
                return 
false;
            }
        }
    }

xmlHttp.onreadystatechange=function(){
    if(
xmlHttp.readyState==4){
        
document.getElementById('ReloadThis').innerHTML=xmlHttp.responseText;
        
setTimeout('Ajax()',5000);
    }
}
xmlHttp.open("GET","http://www.vostrosito.com/users-on-line.php",true);
xmlHttp.send(null);
}

window.onload=function(){
    
setTimeout('Ajax()',1000);
}
</script>

<div id="ReloadThis">
<div align="center" style="padding-top: 3px;"><img src="http://www.vostrosito.com/images/loading.gif"></div>
</div>


andando a modificare www.vostrosito.com con l'url del sito Xoops ed andando ad inserire nella cartella "images" una gif di loading a vostra scelta (cercate su google images).

PASSO 3:

Questo passo non è obbligatorio ma è importante qualora volessimo rendere lo script funzionante sempre al 100%.

Entrate via ftp e modificate il vostro file .htaccess (o createlo se non esiste ancora nella root del vostro sito).

All'interno del file .htaccess inserite:


RewriteEngine On
Options 
+FollowSymlinks
rewritecond 
%{http_host} ^vostrosito.com [nc]
rewriterule ^(.*)$ http://www.vostrosito.com/$1 [r=301,nc]


andando a modificare la stringa vostrosito.com a seconda del vostro url.

Spero di aver fatto cosa gradita a tutti!

HAPPY XOOPS A TUTTI!

Stefano

NB: questo hack potrebbe aumentare le query al vostro db. In due mesi di utilizzo qui su XI non abbiamo riscontrato alcun errore. Se doveste riscontrarne siete pregati di segnalarmelo. Grazie
<< Ottimizzare XOOPS in 5 mosse Rivoluzione al sistema banner Xoops! >>
API: Strumenti PM Email PDF Siti Preferiti Stampa | RSS | RDF | ATOM
© 2002-2008 | Xoops Italia
I commenti sono proprietà dei rispettivi autori. Non siamo in alcun modo responsabili del loro contenuto.
Autore Albero
smal
Inviato: 9/4/2008 13:36  Aggiornato: 9/4/2008 13:36
Specialista
Iscritto: 24/8/2005
Da: Alcamo
Inviati: 164
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
Io suggerisco un'aggiunta presa in prestito dal box apposito di Xoops:
<br/>   <a href="(script removed)openWithSelfMain('http://www.vostrosito.it/misc.php?action=showpopups&type=online','Online',420,350);">Dettagli</a>


Da inserire alla fine del blocco html, cambiando vostrosito.it con l'url del sito.

galeno
Inviato: 12/4/2008 18:38  Aggiornato: 12/4/2008 18:38
Donatore XItalia
Iscritto: 1/12/2007
Da: Lazio
Inviati: 157
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
C'è un motivo per cui hai messo tra parentesi Script removed?
slyss
Inviato: 13/4/2008 1:09  Aggiornato: 13/4/2008 1:09
Staff
Iscritto: 21/8/2004
Da: Italy
Inviati: 3469
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
è l'interprete bb di xoops... è utile per evitare che qualche malintenzionato inserisca script che attacchino il sito.
morena
Inviato: 19/4/2008 18:03  Aggiornato: 19/4/2008 18:03
Regolare
Iscritto: 23/10/2006
Da:
Inviati: 195
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
Ottimo provato,
Ma se vorrei che agli utenti online si associasse una piccola foto del loro profilo cosa bisognerebbe aggiungere?
slyss
Inviato: 20/4/2008 13:47  Aggiornato: 20/4/2008 13:47
Staff
Iscritto: 21/8/2004
Da: Italy
Inviati: 3469
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
nella user_avatar dei tuoi utenti salvi già la loro foto ? (vedi il mio hack dei profili...)

se si, lo fai in un attimo perchè basta richiamare:

echo'<img src="<?php echo QUI IL PATH RELATIVO ALLA FOTO DI OGNI PROFILO ?>"';>
morena
Inviato: 20/4/2008 16:42  Aggiornato: 20/4/2008 16:42
Regolare
Iscritto: 23/10/2006
Da:
Inviati: 195
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
non ci riesco in pratica deve essere una foto di myalbum ma mi da' sempre errore
morena
Inviato: 20/4/2008 17:16  Aggiornato: 22/4/2008 8:50
Regolare
Iscritto: 23/10/2006
Da:
Inviati: 195
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
<script type="text/javascript">
function Ajax(){
var xmlHttp;
    try{    
        xmlHttp=new XMLHttpRequest();// Firefox, Opera 8.0+, Safari
    }
    catch (e){
        try{
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer
        }
        catch (e){
            try{
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e){
                alert("No AJAX!?");
                return false;
            }
        }
    }

xmlHttp.onreadystatechange=function(){
    if(xmlHttp.readyState==4){
        document.getElementById('ReloadThis').innerHTML=xmlHttp.responseText;
        setTimeout('Ajax()',5000);
    }
}
xmlHttp.open("GET","http://www.miosito/site/html/users-on-line.php",true);
xmlHttp.send(null);
}

window.onload=function(){
    setTimeout('Ajax()',1000);
}
</script>
<br/>
<div id="ReloadThis">
<div align="center" style="padding-top: 3px;"><img src="http://miosito/site/html/images/loading.gif"></div>
</div>
<a href="(script removed)openWithSelfMain('http://www.miosito/site/html/misc.php?action=showpopups&type=online/misc.php?action=showpopups&type=online','Online',420,350);">Dettagli</a>
<img src="< 'http://www.miosito/site/html//uploads/thumbs/<{$lid1}>.<{$ext1}>?>"';>


ho provato anche in questa maniera ma nulla
slyss
Inviato: 22/4/2008 8:51  Aggiornato: 22/4/2008 8:51
Staff
Iscritto: 21/8/2004
Da: Italy
Inviati: 3469
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
non funziona perchè tu chiami due variabili smarty

<{$lid1}>
<{$ext1}>

che non vengono settate... devi creare la query adatta ed inserire li le due variabili...
morena
Inviato: 27/4/2008 14:13  Aggiornato: 27/4/2008 14:13
Regolare
Iscritto: 23/10/2006
Da:
Inviati: 195
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
niente da fare fa niente ci rinucio grazie lo stesso

Morena
slyss
Inviato: 28/4/2008 8:42  Aggiornato: 28/4/2008 8:42
Staff
Iscritto: 21/8/2004
Da: Italy
Inviati: 3469
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
mmmm morena è facile... ho scritto decine di hack simili...

in ogni caso:

<?php
include 'mainfile.php';

// Hack by Stefano Silvestrini - www.stefanosilvestrini.com
// 12 gennaio 2008
// Per cortesia non levare i crediti

    $sql = "SELECT s.*, t.* FROM ".$xoopsDB->prefix('online')." s, ".$xoopsDB->prefix('users')." t WHERE t.uid = s.online_uid ORDER BY s.online_updated DESC";

    $result = $xoopsDB->query($sql);
    
    if(!$result) {
       echo "Errore: ".mysql_error();
       exit;
       }

    echo"
    <div style='font-size: 11px;'>
    ";
    
    $count = 0;

    while($myrow = $xoopsDB->fetchArray($result)) {
    
    if ($myrow['online_uid'] == '0') {
        $username = 'Anonimo';
        } else {
        $username = "<a href='http://www.tuosito.com/userinfo.php?uid=".$myrow['online_uid']."'><b>".$myrow['online_uname']."</b><br /><img src='".$myrow['user_avatar']."' width='20'></a><br />";
        }
        
        if ($count !=0) {$start=', ';}
        
        echo"".$start."".$username."";
        
        $count++;
    
        } // chiudo il while

    echo" (Totale: ".$count.")</div>";
?> 


PS: NON L'HO TESTATO PERCHE' L'HO SCRITTO AL VOLO. QUESTO HACK VISUALIZZA L'AVATAR DI OGNI USER.

ciao s.
morena
Inviato: 28/4/2008 14:57  Aggiornato: 28/4/2008 14:57
Regolare
Iscritto: 23/10/2006
Da:
Inviati: 195
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
Ciao sly hai ragione ma ultimamente non ci sto' a capire piu' nulla troppe le cose che non vanno per il verso giusto.
tornando alla modifica mi pare che ci siamo quasi,dico quasi perche ora appare il famoso quadratino con la x rossa e ho notato una cosa,se ci klicco sopra con il tasto destro x vedere dove si trova quella immagine mi da' un percorso diverso da dove si trova l'avatar,esempio l'avatar si trova in http://www.miosite.com/site/html/uploads/cavt4815c3f0ebcce.gif
mentre il percorso che mi da' l'avatar della tua modifica che si vede la x rossa e questo
http://www.miosite.com/site/html/cavt4815c3f0ebcce.gif in pratica manca il percorso che va' alla cartella uploads dove si trova l'avatar ho fatto la prova a spostare l'avatar dove mi da' il percorso la tua modifica e si vede ,ma mica posso spostare tutte le avatar in cartella html
non riesco a capire dove va' cambiato il percorso ogni volta che tocco da errori

grazie in anticipo per la risposta

Morena
slyss
Inviato: 28/4/2008 21:36  Aggiornato: 28/4/2008 21:36
Staff
Iscritto: 21/8/2004
Da: Italy
Inviati: 3469
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
mmmmm questo è html puro

fai così:

<?php
include 'mainfile.php';

// Hack by Stefano Silvestrini - www.stefanosilvestrini.com
// 12 gennaio 2008
// Per cortesia non levare i crediti

    $sql = "SELECT s.*, t.* FROM ".$xoopsDB->prefix('online')." s, ".$xoopsDB->prefix('users')." t WHERE t.uid = s.online_uid ORDER BY s.online_updated DESC";

    $result = $xoopsDB->query($sql);
    
    if(!$result) {
       echo "Errore: ".mysql_error();
       exit;
       }

    echo"
    <div style='font-size: 11px;'>
    ";
    
    $count = 0;

    while($myrow = $xoopsDB->fetchArray($result)) {
    
    if ($myrow['online_uid'] == '0') {
        $username = 'Anonimo';
        } else {
        $username = "<a href='http://www.tuosito.com/userinfo.php?uid=".$myrow['online_uid']."'><b>".$myrow['online_uname']."</b><br /><img src='http://www.miosite.com/site/html/uploads/".$myrow['user_avatar']."' width='20'></a><br />";
        }
        
        if ($count !=0) {$start=', ';}
        
        echo"".$start."".$username."";
        
        $count++;
    
        } // chiudo il while

    echo" (Totale: ".$count.")</div>";
?>


morena
Inviato: 28/4/2008 21:50  Aggiornato: 28/4/2008 21:50
Regolare
Iscritto: 23/10/2006
Da:
Inviati: 195
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
Grazie
Ora va tutto ok

Morena
slyss
Inviato: 29/4/2008 8:30  Aggiornato: 29/4/2008 8:30
Staff
Iscritto: 21/8/2004
Da: Italy
Inviati: 3469
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
prego...
megatony
Inviato: 1/5/2008 16:28  Aggiornato: 1/5/2008 16:28
Simpatizzante
Iscritto: 3/2/2007
Da:
Inviati: 67
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
Ciao Stefano,
mi potresti aiutare?

Vorrei inserire le tuo hack altre info.
Prelevarle dai 2 DB inseriti ci riesco.
Per esempio ci ho aggiunto i Post di un utente
        $username = "<a href='http://www.miosito.it/userinfo.php?uid=".$myrow['online_uid']."'><b>".$myrow['online_uname']."</b> - Post (".$myrow['posts'].")<br /><img src='http://www.miosito.it/uploads/".$myrow['user_avatar']."' width='30'></a><br />";


Ma se volessi prelevare le info da un DB che non sia 'users' e 'online' cosa devo aggiungere?
Non al posto dei 2 DB ma oltre a quei 2.

Come dovrei modificare:
    $sql = "SELECT s.*, t.* FROM ".$xoopsDB->prefix('online')." s, ".$xoopsDB->prefix('users')." t WHERE t.uid = s.online_uid ORDER BY s.online_updated DESC";


Ultima cosa:
ad esempio il DB prefix 'users' contiene il CAMPO 'name'
se volessi aggiungere il CAMPO 'name' contenuto nel DB prefix 'altro' cosa dovrei fare per non creare conflitto o che lo prelevi da DB non desiderato?

P.S. Non sono esperto di php anzi del tutto ignorante.

Spero di essermi fatto capire.

Ciao e grazie
megatony
Inviato: 1/5/2008 17:20  Aggiornato: 1/5/2008 17:20
Simpatizzante
Iscritto: 3/2/2007
Da:
Inviati: 67
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
Ho fatto questo tentativo:
<?php
include 'mainfile.php';

// Hack by Stefano Silvestrini - www.stefanosilvestrini.com
// 12 gennaio 2008
// Per cortesia non levare i crediti

    $sql = "SELECT s.*, t.*, u.* FROM ".$xoopsDB->prefix('online')." s, ".$xoopsDB->prefix('users')." t, ".$xoopsDB->prefix('modules')." u WHERE t.uid = s.online_uid ORDER BY s.online_updated DESC";
    
    $result = $xoopsDB->query($sql);
    
    if(!$result) {
       echo "Errore: ".mysql_error();
       exit;
       }

    echo"
    <div style='font-size: 11px;'>
    ";
    
    $count = 0;

    while($myrow = $xoopsDB->fetchArray($result)) {
    
    if ($myrow['online_uid'] == '0') {
        $username = 'Anonimo';
        } else {
        $username = "<img src='http://miosito.it/uploads/".$myrow['user_avatar']."' width='30'></a><br /><a href='http://www.miosito.it/userinfo.php?uid=".$myrow['online_uid']."'><b>".$myrow['online_uname']."</b><br/ >(".$myrow['name'].")<br />";
        }
        
        if ($count !=0) {$start='';}
        
        echo"".$start."".$username."";
        
        $count++;
    
        } // chiudo il while

    echo"<br /> (Totale: ".$count.")</div>";
?>


ma di sicuro manca qualche comando perche come risultato mi da si il modulo in cui si trova l'utente ma negli online esce ripetuto l'utente per ogni categoria.
Esempio utente online STEFANO:
risultato= Stefano (moduli)
Stefano (temi)
Stefano (forum)
Stefano (downloads)
Ecc...

e cosi per ogni utente on-line

cosa devo aggiungere o modificare?


Grazie
slyss
Inviato: 2/5/2008 8:22  Aggiornato: 2/5/2008 8:22
Staff
Iscritto: 21/8/2004
Da: Italy
Inviati: 3469
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
guarda il mio esempio che ho fatto per morena... puoi adattare quella query semplicemente...

ciao!
megatony
Inviato: 2/5/2008 15:30  Aggiornato: 2/5/2008 15:30
Simpatizzante
Iscritto: 3/2/2007
Da:
Inviati: 67
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
Slyss ma in effetti è quello che ho fatto.
Ho tentato di modificare il tuo esempio ma riscontro il problema che ti ho menzionato.
Perchè ottengo come risultato la visualizzazione di ogni utente on-line ripetuta per ogni categoria?
Non mi restituisce la categoria in cui si trova in quel momento ma mi ripete il nick per ogni categoria.

Spero di essermi spiegato.

Potresti dare un'occhiata all'ultimo codice da me postato per individuare l'errore?
Grazie
slyss
Inviato: 4/5/2008 14:40  Aggiornato: 4/5/2008 14:40
Staff
Iscritto: 21/8/2004
Da: Italy
Inviati: 3469
 Re: Chi è on-line? (Versione AJAX) by Stefano Silvestrini
ti mancano le condizioni per legare questa tabella:

".$xoopsDB->prefix('modules')."

se hai problemi continua qui:

http://www.xoopsitalia.org/modules/newbb/viewtopic.php?post_id=57170#forumpost57170

ciao s.


© 2002-2008 | XOOPS ITALIA
Xoops Italia Logo
Powered by Xoops 2.0.13.2 WAI Level-A Conformance Valid XHTML 1.0 Transitional Valid CSS astonstreet Xoops Themes XHtml Logo RSS 2.0