[GDRCD 5.4] - Messaggi stile WA
[GDRCD 5.4] - Messaggi stile WA postato il 23/09/2016 19:43:13 nel forum programmazione, open source e hosting
Sera a tutti :)
In pochissime parole... vorrei fare in modo che quando si apra il centro messaggi si abbia non una lista dei singoli messaggi ricevuti, ma un elenco dei mittenti e, cliccando su quelli, far aprire una finestra con tutta la cronologia dei messaggi, per l'appunto, in stile WhatsApp.
Il mio problema ovviamente è legato al MySQL... perché non so come fare. Ho pensato che il sistema fa un controllo dei messaggi con destinatario o mittente il mio PG (supponiamo Pippo). Se trova dei messaggi con mittente/destinatario Pippo, li seleziona. Poi li deve dividere per mittente/destinatario, per l'appunto, e mostrare nella pagina dei messaggi l'elenco di quelli che non sono Pippo e, cliccando, quando apre la finestra con tutti i messaggi, dividerli per persona, ovvero Tizio a sinistra e Pippo a destra.
E' fattibile senza morire dietro al codice?
Grazie ^_^
28/09/2016 00:26:42 e modificato da leoblacksoul il 28/09/2016 00:27:46
Per farlo dovresti cambiare più o meno tutta la logica delle pagine dei messaggi privati.
Comunque a livello di query quello che ti serve è:
Una query per l'indice di tutte le conversazioni, che può risultare un po' complessa in effetti:
$query="SELECT personaggio, MAX( spedito ) AS ultimo
FROM (
SELECT IF( mittente = '".gdrcd_filter('in',$_SESSION['login'])."', destinatario, mittente ) AS personaggio, spedito
FROM 'messaggi'
WHERE mittente = '".gdrcd_filter('in',$_SESSION['login'])."'
OR destinatario = '".gdrcd_filter('in',$_SESSION['login'])."'
) AS T1
GROUP BY personaggio";
Questa query ti restituisce nel campo 'personaggio' il nome del personaggio con cui hai la conversazione e nel campo 'ultimo' da data dell'ultimo messaggio che vi siete scambiati.
Poi nella pagina effettiva in cui mostrare la conversazione, la query è più semplice:
$query="SELECT *
FROM (
SELECT *
FROM 'messaggi'
WHERE (
mittente = '".gdrcd_filter('in',$_SESSION['login'])."'
AND destinatario = '".gdrcd_filter('in',$_GET['pg'])."'
)
OR (
destinatario = '".gdrcd_filter('in',$_SESSION['login'])."'
AND mittente = '".gdrcd_filter('in',$_GET['pg'])."'
)
ORDER BY spedito DESC
LIMIT 20
) AS T
ORDER BY spedito ASC";
Sembra difficile ma in realtà si è complicata solo perchè ho voluto selezionare gli ultimi 20 messaggi. Se non volessi fare la paginazione mostrando solo gli ultimi 20 messaggi sarebbe sufficiente solo la query interna (ma sarebbe particolarmente scomodo per gli utenti).
Questa query ti ritorna gli ultimi 20 messaggi della conversazione, assumendo che il nome dell'utente con cui chattare sia passato nella variabile $_GET['pg']
Per il resto di tratta solo di ciclare nei risultati e costruire l'html della pagina.
Raccomanderei di inserire un sistema di paging in entrambe le query, per non mostrare sulla stessa pagina magari centinaia di righe.
Inoltre con questo sistema sarebbe molto consigliabile creare una cancellazione automatica dei messaggi vecchi. Per non riempire il db di messaggi che tanto poi non va più a rileggere nessuno dopo un po'.
Attenzione all'implementazione dei messaggi di gruppo (a tutti i presenti, a tutti gli appartenenti a una gilda, etc) che potrebbero causare visualizzazioni strane
28/09/2016 16:11:53
Il fatto che compaia quel messaggio mi fa pensare che non hai riscritto le pagine dei messaggi.
La prima cosa che ho scritto era che la logica di quello che vuoi fare è ben diversa da come è implementata in gdrcd, quindi le pagine vanno comunque totalmente riscritte XD
18/06/2019 02:18:00 e modificato da angel1989 il 18/06/2019 02:19:02
Riesumo questa vecchissima conversazione. Anche io vorrei fare la stessa cosa raccogliendo i messaggi per conversazioni. Ho provato la query suggerita qui su, ma non va e da solo non riesco a cavarne piede >>
29/02/2020 17:11:50 e modificato da angel1989 il 29/02/2020 17:12:28
Alla fine sono riuscito a fare questa modifica.
Non ho avuto risposta alla precedente domanda, ma ci riprovo di nuovo che non so bene che pesci prendere riguardo ad un'altra questione.
Vorrei ordinare l'elenco principale in base alla presenza di messaggi non letti ed ho fatto così:
$query="SELECT personaggio, MAX( spedito ) AS ultimo
FROM (
SELECT IF( mittente = '".gdrcd_filter('in',$_SESSION['login'])."', destinatario, mittente ) AS personaggio, spedito, letto
FROM messaggi
WHERE mittente = '".gdrcd_filter('in',$_SESSION['login'])."'
OR destinatario = '".gdrcd_filter('in',$_SESSION['login'])."'
) AS T1
GROUP BY personaggio
ORDER BY letto, personaggio";
Il problema è che mi porta in alto anche quei gruppi che hanno un campo letto uguale a 0 da lato mittente = '".gdrcd_filter('in',$_SESSION['login'])."'. C'è modo di escluderli che qualcuno sappia?
02/03/2020 11:10:30
visto che GDRCD è un open source per cui si chiedono aiuti e per cui bisognerebbe condividere le soluzioni, posso chiederti come hai realizzato la cosa? :)
e.... non ho capito la domanda XD perdonami, potresti meglio spiegare il tuo problema?
21/06/2021 11:38:38
Riesumo questo topic perchè vorrei realizzare qualcosa del genere, ma ammetto che non ho ben capito come e dove agire, a parte quale file, per poter realizzare una visualizzazione come quella di WA! Chiedo una manina! Grazie in anticipo!
22/06/2021 16:32:39 e modificato da kasa il 23/06/2021 14:13:00
morositas ha scritto: Riesumo questo topic perchè vorrei realizzare qualcosa del genere, ma ammetto che non ho ben capito come e dove agire, a parte quale file, per poter realizzare una visualizzazione come quella di WA! Chiedo una manina! Grazie in anticipo!
Leggendo i vari post del thread, mi pare di aver compreso che "messaggistica in stile WA" fa riferimento al raggruppamento dei messaggi per destinatario, mettendo in alto sempre il destinatario con l'ultimo messaggio non letto, altrimenti con l'ultimo messaggio letto.
Per fare una cosa del genere, devi andare a modificare dapprima messages/index.inc.php, nello specifico la query che seleziona i messaggi. La soluzione migliore è quella di accorpare le query dei messaggi inviati e ricevuti, in modo da averne una unica che prende a prescindere la tua cronologia e ci ricava le principali conversazioni.
Qui devi fare qualche modifica:
- Utilizzando le due query (inviati e ricevuti) costruirne una unica con la formula dello UNION in modo che tu possa avere tutte le conversazioni e poi raggrupparle per personaggio, ordinando ovviamente per letto DESC e spedito DESC;
- Ricordarti di passare come ID della conversazione il valore del campo ´personaggio´ (mittente o destinatario, per intenderci) di riferimento, in modo che quando andrai a leggere la conversazione venga poi filtrata per questo;
- Sistemare tutte le operazioni di contorno secondo il ragionamento appena fatto, quindi passare come personaggio e non più come id messaggio singolo.
Pensandola in questo modo, dovresti essere in grado di ottenere una lista sintetica delle conversazioni per utente.
Qui un esempio della query che dovresti usare:
$result = gdrcd_query("SELECT personaggio_conversazione, testo, letto, MAX(spedito) as spedito
FROM (
(
SELECT mittente as personaggio_conversazione, testo, letto, spedito
FROM messaggi
WHERE 1
AND destinatario = '".$_SESSION['login']."'
AND destinatario_del = 0
AND spedito = (SELECT MAX(mcheck.spedito) from messaggi as mcheck WHERE mcheck.destinatario = messaggi.destinatario AND mcheck.mittente = messaggi.mittente )
GROUP BY mittente
ORDER BY letto, spedito DESC
)
UNION ALL
(
SELECT destinatario as personaggio_conversazione, testo, letto, spedito
FROM messaggi
WHERE 1
AND mittente = '".$_SESSION['login']."'
AND mittente_del = 0
AND spedito = (SELECT MAX(mcheck.spedito) from messaggi as mcheck WHERE mcheck.destinatario = messaggi.destinatario AND mcheck.mittente = messaggi.mittente )
GROUP BY destinatario
ORDER BY letto, spedito DESC
)
) AS conversazioni
GROUP BY personaggio_conversazione
ORDER BY letto, spedito DESC
LIMIT ".$pagebegin.", ".$pageend."", 'result');
A quel punto, quando vai a leggere il messaggio tramite messages/read.inc.php al posto di leggere il singolo ID del messaggio, devi utilizzare il personaggio e quindi stamparti i listone dei messaggi ordinato per data spedito.
So che a primo acchito può sembrare una una bella rogna, nonchè di esser sommersi dalla quantità di punti da toccare, ma una volta compreso il ragionamento alla base, ti accorgi che si tratta solo di un modo diverso di raccogliere dati. NECESSARIAMENTE, tutta la parte dei messaggi andrebbe un poco ripensata proprio per prestarsi a questi nuovi parametri utilizzati.
Kasa.
22/06/2021 20:17:20
kasa ha scritto: [quote]
A quel punto, quando vai a leggere il messaggio tramite messages/read.inc.php al posto di leggere il singolo ID del messaggio, devi utilizzare il personaggio e quindi stamparti i listone dei messaggi ordinato per data spedito.
So che a primo acchito può sembrare una una bella rogna, nonchè di esser sommersi dalla quantità di punti da toccare, ma una volta compreso il ragionamento alla base, ti accorgi che si tratta solo di un modo diverso di raccogliere dati. NECESSARIAMENTE, tutta la parte dei messaggi andrebbe un poco ripensata proprio per prestarsi a questi nuovi parametri utilizzati.
Kasa.
Sto cercando anche io di capire la logica di questa impostazione.
Mi areno, o per meglio dire, non capisco i passaggi da fare per modificare il read.
22/06/2021 20:31:47
haruka ha scritto:
Sto cercando anche io di capire la logica di questa impostazione.
Mi areno, o per meglio dire, non capisco i passaggi da fare per modificare il read.
Il perno di tutta logica si basa sulla transazione da una visione per ID (intendendo l ID del messaggio) ad una per Personaggio (ossia l altro personaggio della conversazione, mittente/destinatario).
Attualmente GDRCD lavora sempre sul singolo messaggio e quando si va ad effettuare una qualsiasi operazione, questa viene fatta quasi ed esclusivamente sull'ID. Per passare ad uno stile WA, occorre riformare la struttura sulla base della conversazione, quest ultima derivata dal Personaggio del quale si vuole visualizzare lo storico messaggi.
Quindi, anche in read.inc.php non devi mostrare il testo di un solo messaggio, ma l intera conversazione avuta prendendo tutti i messaggi intrattenuti tra i due utenti. Basterà utilizzare la query che ho usato nell index.inc.php, togliere i raggruppamenti e passare il personaggio di cui si vuole visualizzare lo storico.
Poi ...
La risposta dovrebbe rimanere inalterata come meccanismo, mentre il cancella messaggio lo si deve in parte riscrivere per basarsi sulla nuova visione.
Un poco più chiaro?
Kasa.
22/06/2021 21:52:37 e modificato da haruka il 22/06/2021 22:14:58
kasa ha scritto: [quote]haruka ha scritto:
Sto cercando anche io di capire la logica di questa impostazione.
Mi areno, o per meglio dire, non capisco i passaggi da fare per modificare il read.
Il perno di tutta logica si basa sulla transazione da una visione per ID (intendendo l ID del messaggio) ad una per Personaggio (ossia l altro personaggio della conversazione, mittente/destinatario).
Attualmente GDRCD lavora sempre sul singolo messaggio e quando si va ad effettuare una qualsiasi operazione, questa viene fatta quasi ed esclusivamente sull'ID. Per passare ad uno stile WA, occorre riformare la struttura sulla base della conversazione, quest ultima derivata dal Personaggio del quale si vuole visualizzare lo storico messaggi.
Quindi, anche in read.inc.php non devi mostrare il testo di un solo messaggio, ma l intera conversazione avuta prendendo tutti i messaggi intrattenuti tra i due utenti. Basterà utilizzare la query che ho usato nell index.inc.php, togliere i raggruppamenti e passare il personaggio di cui si vuole visualizzare lo storico.
Poi ...
La risposta dovrebbe rimanere inalterata come meccanismo, mentre il cancella messaggio lo si deve in parte riscrivere per basarsi sulla nuova visione.
Un poco più chiaro?
Kasa.
Ci devo lavorare un bel po' sopra. Ho capito a livello concettuale il passaggio, vedremo se riesco a fare qualcosa di concreto.
Intanto grazie per la query e per i chiarimenti.
Discussione seguita da
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Tibia ↗
Seconda Era ↗
State of Survival ↗
Hero Wars ↗
War Thunder ↗
World of Warship ↗
Sea of Conquest ↗