[RISOLTO] Gdrc 5.5 funzione per richiamare oggetto in chat
[RISOLTO] Gdrc 5.5 funzione per richiamare oggetto in chat postato il 22/01/2022 00:00:16 nel forum programmazione, open source e hosting e modificato da haruka il 13/02/2022 11:41:26
In function.inc.php sto cercando di creare una funzione che generi in chat una porzione di testo cliccabile - quello richiuso tra [] - che richiami il popup che carica la scheda dell'oggetto.
Allora, partendo da chatcolor - sono esperimenti, il nome della funzione verrà poi cambiato - sono riuscita a creare questa. Che funziona parzialmente.
function gdrcd_chatcolor3($str) {
$search = [
'#\[(.*?)\]#'
];
$fullString = $chat_message;
$sTest = $str;
preg_match('#\[(.*?)\]#', $sTest, $aMatches);
$artefatto = $aMatches[1];
$caricaoggetto = gdrcd_query("SELECT * FROM oggetto WHERE oggetto.nome='".$artefatto."'");
$urloggetto= "javascript:modalWindow('oggetto', 'Oggetto', 'popup.php?page=popupoggettonome&oggetto=". $caricaoggetto['nome'] ."', 800, 450);";
$replace = [
'<a href="' . $urloggetto . '"><span style="color: #c21616;">[$1]</span></a>',
];
return preg_replace($search, $replace, $str);
}

Non vedendosi la manina, non posto l'altro screen che è in pratica gemello di questo. Ma in buona sostanza entrambi i link, sia quello su lampada in ottone, che quello su brigantina nera, riportano come &oggetto=Lampada in ottone
che è il motivo per cui la funzione non fa quello che dovrebbe ^^'
Mi rendo conto di essere sulla strada giusta perché il primo testo tra parentesi quadre fa esattamente quello che deve fare. Il secondo testo, purtroppo, richiama lo stesso link del primo. In pratica, per quanto ci stia girando intorno, non ho le competenze per creare un ciclo in modo che il primo link punti ad una cosa, il secondo ad un'altra, un eventuale terzo ad un'altra ancora.
Qualche anima pia mi da una mano?
Lascio screenshot di cosa appare in chat al momento.
Pagine → 1 2
03/02/2022 09:51:41 e modificato da kasa il 03/02/2022 10:59:13
Hai ancora questa esigenza o sei riuscita a risolverla?
Nel caso, con molta pazienza, ci guardiamo.
Kasa.
03/02/2022 11:13:47
Ciao Kasa, ho "risolvicchiato" chiedendo aiuto su stackoverflow, anche se questo codice - che per ora sto comunque usando in land - presenta un bug noiosetto.
function gdrcd_chatcolor3($str) {
return preg_replace_callback('#\[([^][]*)\]#', function($aMatches) {
$caricaoggetto = gdrcd_query("SELECT * FROM oggetto WHERE oggetto.nome='".gdrcd_filter('get', $aMatches[1])."'");
$urloggetto= "javascript:modalWindow('oggetto', 'Oggetto', 'popup.php?page=popupitemconcheck&oggetto=". $caricaoggetto['id_oggetto'] ."', 800, 450);";
return '<a href="' . $urloggetto . '"><span style="color: #c21616;">['.$aMatches[1].']</span></a>';
}, $str);
}
in ref_header.inc.php
ho aggiunto questa parte di codice
$fullString = $chat_message;
$sTest = $chat_message;
/* preg_match("/\(([^\)]*)\)/", $sTest, $aMatches); */
/* il codice precedente è per le parentesi tonde. Quello a seguire per le parentesi quadre */
preg_match('#\[(.*?)\]#', $sTest, $aMatches);
$artefatto = $aMatches[1];
$caricaoggetto = gdrcd_query("SELECT * FROM oggetto JOIN clgpersonaggiooggetto ON oggetto.id_oggetto = clgpersonaggiooggetto.id_oggetto WHERE clgpersonaggiooggetto.nome='".$_SESSION['login']."' AND oggetto.nome='".$artefatto."'");
per caricare l'oggetto se il giocatore ne mette il nome esatto tra parentesi quadre [nome oggetto]. Poi, dove viene selezionato il "case" ho creato un if in base a se un personaggio possiede nello zaino l'oggetto che vuole giocare:
if ($caricaoggetto['posizione']>=1){
$m_type='F';
$_SESSION['tag']=$tag_n_beyond;
$chat_message= '<span class= "status">'. $stato .'</span>' .'<span class= "statotemp"> '. $statotemp .'</span> ' .$chat_message . '';
}
else {
$m_type='P';
$_SESSION['tag']=$tag_n_beyond;
$chat_message= '<span class= "status">'. $stato .'</span>' .'<span class= "statotemp"> '. $statotemp .'</span> ' .$chat_message . '';
}
nel case dove viene richiamato, ho modificato $add_chat in questo mood:
$add_chat.= '<span class="chat_msg">'.gdrcd_chatme($_SESSION['login'], gdrcd_chatcolor(gdrcd_chatcolor3(gdrcd_filter('out',$row['testo'])))).'</span></div>';
Il bug te lo scrivo in pvt perché è sottile.
03/02/2022 18:38:17 e modificato da haruka il 04/02/2022 12:58:03
kasa ha scritto:
Nel caso, con molta pazienza, ci guardiamo.
Tu di pazienza ne hai davvero fin troppa, quesat community ti deve tantissimo.
Dunque, mettetevi comodi xD
EDIT: per nn fare confusione e rimuovere il codice buggato.
03/02/2022 19:06:03 e modificato da kasa il 03/02/2022 20:13:16
Figurati, è sempre un piacere aiutare!
Grazie a te per la pazienza e per i sorgenti condivisi.
Ottima spiegazione!
Kasa.
04/02/2022 10:19:44
Non so se la cosa sia voluta, se sia un Bug o meno ma ho riscontrato questo piccolo "problema"
In function alla riga:
$caricaoggetto = gdrcd_query("SELECT * FROM oggetto JOIN clgpersonaggiooggetto ON oggetto.id_oggetto = clgpersonaggiooggetto.id_oggetto WHERE clgpersonaggiooggetto.nome='Haruka' AND oggetto.nome='".gdrcd_filter('get', $aMatches[1])."'");
Sostituendo il nome 'Haruka? con
'".gdrcd_filter('in',$_SESSION['login'])."'
permette la visualizzazione dell'oggetto dichiarato dal possessore e diventa dunque cliccabile, l'unico intoppo è che (proprio per il modo con cui viene richiamato) va a visualizzare il Pop-up soltanto per il possessore dell'oggetto e non anche per chi è in chat con lui.
Come si potrebbe far sì che gli oggetti diventino cliccabili per ambo le categorie (ovvero possessore oggetto e non)?
04/02/2022 10:25:14
Doh, è un refuso.
Appena arrivo al PC correggo!
04/02/2022 11:05:46
Ieri nella fretta e nella "felicità" pensavo di aver risolto (e invece no!)
Allora, posto una veloce soluzione in attesa di risolvere il conflitto della funzione con chat_me
in function va:
function gdrcd_chat_loadItem(
$str,
$personaggio
) {
// Fix: evita di triggerare gdrcd_chatme
$personaggio_oggetto = $_SESSION['login'] != $personaggio ? $personaggio : NULL;
return
preg_replace_callback(
'#\[(.+?)\]#is',
function($aMatches) use($personaggio) {
$caricaoggetto = gdrcd_query("SELECT * FROM oggetto JOIN clgpersonaggiooggetto ON oggetto.id_oggetto = clgpersonaggiooggetto.id_oggetto WHERE clgpersonaggiooggetto.nome='".$personaggio."' AND oggetto.nome='".gdrcd_filter('get', $aMatches[1])."'");
if ($caricaoggetto['posizione']>0) {
$caricaoggetto = gdrcd_query("SELECT * FROM oggetto WHERE oggetto.nome='".gdrcd_filter('get', $aMatches[1])."'");
$urloggetto= 'javascript:modalWindow(\'oggetto\', \'Oggetto\', \'popup.php?page=popupitemconcheck&pg='.$personaggio.'&oggetto='. $caricaoggetto['id_oggetto'] .'\', 800, 450);';
return '<a href="' . $urloggetto . '"><span style="color: #c21616;">['.$aMatches[1].']</span></a>' ;
}
else {
return '<span style="color: #000;">['.$aMatches[1].']</span>';
}
},
$str);
}
nel ref_header
$add_chat .= '<span class="chat_msg">'.gdrcd_chatcolor( gdrcd_chat_loadItem(gdrcd_filter('out', $row['testo']), $row['mittente'])).'</span>';
è una toppa. Mentre cerco di capire se riesco a sistemare con il codice che mi ha fornito kasa per risolvere quel conflitto.
04/02/2022 12:45:18
Con questa toppa sembra funzionare per il momento.
Credo manchi soltanto una cosa al codice, la possibilità di visualizzare anche il commento dell'oggetto che viene riportato dal possessore dello stesso (la descrizione personale per intenderci) :)
04/02/2022 12:56:44
Ho risolto anche la questione del conflitto con chat_me.
A questo punto, il controllo sulla proprietà viene effettuato direttamente dalla funzione, per cui non è necessario passare al popup il possessore.
Inizio a modificare la mia risposta "errata" e posto i vari pezzi :)
Grazie per la pazienza.
04/02/2022 13:04:05 e modificato da haruka il 04/02/2022 13:22:26
Dunque, mettetevi comodi xD
in functions.inc.php dopo la funzione gdrcd_chatcolor, e prima di gdrcd_chatme, va aggiunta questa funzione:
function gdrcd_chat_loadItem(
$str,
$personaggio
) {
return
preg_replace_callback(
'#\[(.+?)\]#is',
function($aMatches) use($personaggio) {
$caricaoggetto = gdrcd_query("SELECT * FROM oggetto JOIN clgpersonaggiooggetto ON oggetto.id_oggetto = clgpersonaggiooggetto.id_oggetto WHERE clgpersonaggiooggetto.nome='".$personaggio."' AND oggetto.nome='".gdrcd_filter('get', $aMatches[1])."'");
if ($caricaoggetto['posizione']>0) {
$caricaoggetto = gdrcd_query("SELECT * FROM oggetto WHERE oggetto.nome='".gdrcd_filter('get', $aMatches[1])."'");
$urloggetto= 'javascript:modalWindow(\'oggetto\', \'Oggetto\', \'popup.php?page=popupitem&oggetto='. $caricaoggetto['id_oggetto'] .'\', 800, 450);';
return '<a href="' . $urloggetto . '"><span style="color: #c21616;">['.$aMatches[1].']</span></a>' ;
}
else {
return '<span style="color: #000;">['.$aMatches[1].']</span>';
}
},
$str);
}
Nel ref_header.inc.php
la linea:
$add_chat .= '<span class="chat_msg">'.gdrcd_chatme($_SESSION['login'], gdrcd_chatcolor(gdrcd_filter('out', $row['testo']))).'</span>';
deve diventare
$add_chat .= '<span class="chat_msg">'.gdrcd_chatme($_SESSION['login'], gdrcd_chatcolor( gdrcd_chat_loadItem(gdrcd_filter('out', $row['testo']), $row['mittente']))).'</span>';
Va quindi aggiunto un file in pages chiamato popupitem.inc.php
il cui contenuto sarà:
<?php
/*Caricamento oggetti*/
$id_oggetto = gdrcd_filter('num', $_GET['oggetto']);
$loaded_item = gdrcd_query("SELECT * FROM oggetto WHERE id_oggetto = ".$id_oggetto."");
?>
<table id="lista" class="sortable">
<tbody>
<tr>
<td> Nome </td>
<td> Descrizione </td>
<tr>
<!-- Oggetto, immagine, quantità -->
<td class="casella_elemento" id="info" style="vertica-align:top;">
<div class="inventario_riga_descrizione" id="riga1" style="height:1000px;">
<div class="inventario_nome"><?php echo gdrcd_filter('out', $loaded_item['nome']);
?>
</div>
<div class="inventario_img">
<img src="themes/<?php echo $PARAMETERS['themes']['current_theme'] ?>/imgs/items/<?php echo gdrcd_filter('out', $loaded_item['urlimg']); ?>" />
</div>
</div>
</td>
<td class="casella_elemento" id="info" style="min-height: 1200px;;">
<div class="inventario_riga_descrizione" style="width:98% !important" id="riga2" >
<?php echo gdrcd_filter('out', $loaded_item['descrizione']); ?>
<br>
</div>
</td>
</tr>
</table>
Spero in questo file non ci siano rimasugli di codice di Above Leggendra ^^'
Con $loaded_item potete richiamare tutte le varie colonne della tabella oggetto.
Discussione seguita da
Pagine → 1 2
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Tiles Survive ↗
AlterEgo ↗
RAID Shadow Legends ↗
World of Tanks ↗
Project Entropy ↗
Enlisted ↗
State of Survival ↗
Storie di Agarthi ↗
The Coven ↗
Foundation Galactic Frontier ↗