[ GDRCD 5.4 ][ RISOLTO ] Stampa descrizione oggetti usati in chat.
[ GDRCD 5.4 ][ RISOLTO ] Stampa descrizione oggetti usati in chat. postato il 28/06/2017 17:57:33 nel forum programmazione, open source e hosting e modificato da sadly-noob il 28/06/2017 19:51:30
(ha risolto: blancks)
(ha contribuito: rematore)
Buona afosa sera a tutti, in quest'ultimo periodo mi sto spaccando la testa sul sistema di oggetti di GDRCD. L'esaurimento nervoso della scorsa serata mi induce ad implorare nuovamente il vostro aiuto - in particolare nel merito degli oggetti questo è solo il primo thread di una serie .. Sigh.
OBIETTIVO:
Quando un giocatore utilizza la funzione 'USA OGGETTO' in chat, in quest'ultima viene stampata di seguito al nome dell'oggetto anche la sua descrizione, se presente.
In questo modo:
Caio utilizza: materia oscura - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Ho guardato i files ref_header.inc.php (e lui ha guardato dentro di me ..) e frame_chat.inc.php.
In ref_header.inc.php credo di avere individuato il pezzettino che genera la 'frase' in chat per l'utilizzo dell'oggetto, ovvero:
$item=explode('-', gdrcd_filter('in',$_POST['id_item']));
if ($item[1]==1)
{
$query="
DELETE
FROM clgpersonaggiooggetto
WHERE nome ='".$_SESSION['login']."'
AND id_oggetto='".gdrcd_filter('num',$item[0])."' LIMIT 1";
}
elseif ($item[1]>1)
{
$query="
UPDATE clgpersonaggiooggetto
SET cariche = cariche -1
WHERE nome ='".$_SESSION['login']."'
AND id_oggetto='".gdrcd_filter('num',$item[0])."' LIMIT 1";
}
gdrcd_query($query);
/** USA OGGETTO: ELEMENTI CHE COMPONGONO LA STAMPA DELL'OGGETTO UTILIZZATO IN CHAT: " Gestione utilizza: X " **/
gdrcd_query("
INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo )
VALUES (
".$_SESSION['luogo'].",
'".$_SESSION['sesso'].";".$_SESSION['img_razza']."',
'".$_SESSION['login']."',
'',
NOW(),
'O',
'".$_SESSION['login'].'
'.gdrcd_filter('in',$MESSAGE['chat']['commands']['die']['item']).':
'.gdrcd_filter('in',$item[2])."'
)");
}
Non riesco a capire come e dove diavolo riesca a pigliare il nome esatto dell'oggetto che sto utilizzando, o meglio:
'.gdrcd_filter('in',$item[2])."'
Sembra essere l'elemento interessato, ma .. $item[2]? Che roba è?
Non arrivo al metodo per estrapolare la descrizione dell'oggetto che sto utilizzando e stamparla insieme agli altri elementi, sigh.
L'intuizione che mi è venuta è che <gergo non professionale> prima il sistema inserisce quei dati nel database (ribadisco però che mi è totalmente oscuro come faccia a trovare il nome esatto dell'oggetto che sto usando) e successivamente il compito di stamparli in chat è di questa seconda parte di codice: </gergo non professionale>
/* TIPO MESSAGGIO: O uso oggetto */
/* RACCOLTA DATI DAL DATABASE PER STAMPARE LA DESCRIZIONE DELL'OGGETTO USATO */
$record = gdrcd_query("
SELECT descrizione
FROM oggetto
-?????????-");
/* FINE RACCOLTA DATI DAL DATABASE */
case 'O':
/** * Fix problema visualizzazione spazi vuoti con i sussurri
* @author eLDiabolo
*/
$add_chat.= '<div class="chat_row_'.$row['tipo'].'">';
$add_chat.= '<span class="chat_time">'.gdrcd_format_time($row['ora']).'</span>';
$add_chat.= '<span class="chat_msg">'
.gdrcd_filter('out',$row['testo']).
' QUI implemento la descrizione oggetto?'
.$record['descrizione'].
'</span>';
$add_chat.= '</div>';
.. Non fate caso ai tentativi da scappata di casa fatti lì in mezzo per trovare la descrizione degli oggetti.
Immagino invece che questo:
.gdrcd_filter('out',$row['testo']).
Si prenda magicamente tutti i dati elencati precedentemente, ovvero:
NOW(),
'O',
'".$_SESSION['login'].'
'.gdrcd_filter('in',$MESSAGE['chat']['commands']['die']['item']).':
'.gdrcd_filter('in',$item[2])."'
Il mio terrore è di dover fare cose tremende tipo una foreign key fra la tabella oggetto e (forse)
clgpersonaggiooggetto .. Oppure non ne ho la minima idea, non riuscendo a capire la natura/funzionamento di '.gdrcd_filter('in',$item[2])."'.
Ringrazio anticipatamente chiunque abbia modo/voglia di fare un po' di luce su questo mistero o condividere possibili soluzioni, faccio tesoro di qualsiasi contributo.
Pagine → 1
28/06/2017 18:14:05
sadly-noob ha scritto: ma .. $item[2]? Che roba è?
Facciamo un passo indietro e partiamo dal principio.
Quando viene generato il form in chat che ti elenca gli oggetti a disposizione che è possibile utilizzare https://github.com/GDRCD/GDRCD/blob/master/pages/frame_chat.inc.php#L186 ↗, GDRCD assegna come valore l'unione di più campi
<option value="<?php echo $row['id_oggetto'].'-'.$row['cariche'].'-'.gdrcd_filter('out',$row['nome']); ?>">
ed effettua una concatenazione di stringa, facendo si che all'atto pratico il value della option relativo a quello specifico oggetto risulti in qualcosa di simile
<option value="15-4-Materia Oscura">
Quando a questo punto viene inviato il form, GDRCD raccoglie questo valore https://github.com/GDRCD/GDRCD/blob/master/ref_header.inc.php#L93 ↗
$item=explode('-', gdrcd_filter('in',$_POST['id_item']));
e tramite il comando explode spezza la stringa di valori concatenati in precedenza in una lista di valori (un array) usando il trattino come carattere di separazione.
Il nostro array così composto quindi presenta 3 indici:
$item[0] // id oggetto
$item[1] // cariche oggetto
$item[2] // nome oggetto
Adesso che abbiamo spiegato la provenienza e il contenuto di $item, vediamo come risolvere il problema.
GDRCD scrive il messaggio in chat tramite la query di inserimento che hai indicato:
sadly-noob ha scritto:
gdrcd_query("
INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo )
VALUES (
".$_SESSION['luogo'].",
'".$_SESSION['sesso'].";".$_SESSION['img_razza']."',
'".$_SESSION['login']."',
'',
NOW(),
'O',
'".$_SESSION['login'].'
'.gdrcd_filter('in',$MESSAGE['chat']['commands']['die']['item']).':
'.gdrcd_filter('in',$item[2])."'
)");
Quel che dobbiamo fare, subito prima di questa query, è recuperare la descrizione dell'oggetto di cui abbiamo bisogno.
$oggetto = gdrcd_query("SELECT descrizione FROM oggetto WHERE id_oggetto = ". gdrcd_filter('in', $item[0]) ." LIMIT 1");
e successivamente inserirlo nella query di inserimento..
gdrcd_query("
INSERT INTO chat ( stanza, imgs, mittente, destinatario, ora, tipo, testo )
VALUES (
".$_SESSION['luogo'].",
'".$_SESSION['sesso'].";".$_SESSION['img_razza']."',
'".$_SESSION['login']."',
'',
NOW(),
'O',
'".$_SESSION['login'].'
'.gdrcd_filter('in',$MESSAGE['chat']['commands']['die']['item']).':
'.gdrcd_filter('in',$item[2] . " - " . $oggetto['descrizione'])."'
)");
Questo dovrebbe essere sufficiente ;-)
28/06/2017 18:19:15
Ciao,
diciamo che la soluzione adottata dai programmatori non è proprio delle migliori ma comunque funziona per il caso.
$item=explode('-', gdrcd_filter('in',$_POST['id_item']));
La variabile item conterrà una stringa proveniente dalla globale $_POST con chiave id_item.
Il contenuto della variabile $_POST['id_item'] è una stringa costruita nel seguente formato.
id_oggetto-cariche-nome_oggetto
la funzione explode non fa altro che dividere la stringa in base al selettore richiesto e ritorna un array contente i valori splittati in base al selettore.
Nel tuo caso explode è sul selettore '_' e lo split, caso ok, viene eseguito sul selettore per tre volte. Quindi la tua variabile item conterrà un array con 3 posizioni. Precisamente
$item[0] = id_oggetto
$item[1] = cariche oggetto
$item[2] = nome oggetto
La formattazione della stringa la trovi nel file frame_chat
[...]
<option value="<?php echo $row['id_oggetto'] . '-' . $row['cariche'] . '-' . gdrcd_filter('out', $row['nome']); ?>">
<?php echo $row['nome']; ?>
</option>
[...]
28/06/2017 19:49:09

Grazie infinite Blancks, la soluzione funziona perfettamente.
Credo di avere capito, ora.
Da sola comunque non ce l'avrei mai fatta (come al solito).
Segno il topic come risolto e appena ho modo lo metto in ordine per renderlo tutorial.
Grazie anche a te rematore per le delucidazioni fornite!
29/06/2017 00:42:57
Figurati, non c'è di che.
Per la vignetta.. 🤣
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
The Coven ↗
Hero Wars ↗
CRSED: F.O.A.D. ↗
New Orleans ↗
Crossout ↗